Die SAS-Programmiersprache ist eine klobige, archaische Sprache aus dem Jahr 1966, die bis heute verwendet wird. Der ursprüngliche Compiler wurde in PL / I geschrieben , und ein Großteil der Syntax stammt aus PL / I. SAS hat auch eine Präprozessor-Makrosprache, die sich ebenfalls von der von PL / I ableitet . In dieser Herausforderung werden Sie einige einfache Elemente der SAS-Makrosprache interpretieren.
In der SAS-Makrosprache werden Makrovariablen mit dem %let
Schlüsselwort definiert und das Drucken in das Protokoll erfolgt mit %put
. Anweisungen enden mit Semikolons. Hier sind einige Beispiele:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Bei Makrovariablennamen wird die Groß- und Kleinschreibung nicht beachtet. Sie stimmen immer mit dem regulären Ausdruck überein /[a-z_][a-z0-9_]*/i
. Für die Zwecke dieser Herausforderung werden wir Folgendes sagen:
- Makrovariablen können nur Werte enthalten, die vollständig aus druckbaren ASCII-Zeichen bestehen der Ausnahme
;
,&
und%
- Die Werte enthalten keine führenden oder nachfolgenden Leerzeichen
- Die Werte dürfen nicht länger als 255 Zeichen sein
- Werte können leer sein
- Klammern und Anführungszeichen in den Werten stimmen möglicherweise nicht überein
- Es kann eine beliebige Menge an Speicherplatz vor und nach der
=
in der%let
Anweisung und dieser Platz sollte ignoriert werden - Vor dem Terminal
;
in der%let
Anweisung darf beliebig viel Platz sein, und dieser Platz sollte ebenfalls ignoriert werden
Wenn eine Makrovariable aufgerufen wird, wird sie in ihren Wert "aufgelöst". Makrovariablen werden durch Voranstellen aufgelöst &
. Es ist eine optionale hintere .
, die das Ende des Bezeichners angibt. Beispielsweise,
%put The value of x is &X..;
Schreibt The value of x is 5.
in das Protokoll. Beachten Sie, dass zwei Zeiträume erforderlich sind, da ein einziger Zeitraum von verbraucht wird &X.
und in aufgelöst wird 5
. Beachten Sie auch, dass, obwohl wir x
in Kleinbuchstaben definiert haben , dies &X
dasselbe ist wie&x
da bei Makrovariablennamen die Groß- und Kleinschreibung nicht berücksichtigt wird.
Hier wird es schwierig. Es &
können mehrere s aneinander gereiht werden, um Variablen aufzulösen, und &
s können gleichzeitig die gleiche Verschachtelungsauflösung haben. Beispielsweise,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Die innerste &
Entschlossenheit zuerst, und die Entschlossenheit geht nach außen weiter. Der Abgleich von Variablennamen erfolgt gierig. In der zweiten %put
Anweisung führt der Prozessor die folgenden Schritte aus:
&i
beschließt1
, und die innerste Führung&
wird verbraucht und gibt uns&&coolbeans1
&coolbeans1
beschließtbroseph
, uns zu geben&broseph
&broseph
beschließt zu5
.
Wenn nachgestellte .
s vorhanden sind , wird nur eine einzige .
in der Auflösung verwendet, auch wenn mehrere vorhanden sind&
s .
Aufgabe
Bei 1 bis 10 %let
Anweisungen, die durch Zeilenumbrüche und eine einzelne Anweisung voneinander getrennt sind, können Sie %put
das Ergebnis der Anweisung ausdrucken oder zurückgeben%put
Anweisung . Eingaben können auf jede übliche Art und Weise akzeptiert werden.
Sie können davon ausgehen, dass die Eingabe immer gültig ist und die %let
Anweisungen der Anweisung vorausgehen %put
. Definierte Variablen werden später nicht mehr neu definiert%let
Anweisungen .
Wenn sie tatsächlich in SAS ausgeführt werden, gibt es keine Probleme mit Variablen, die in nicht vorhandene Variablen aufgelöst werden, und alles ist syntaktisch korrekt, wie oben beschrieben.
Beispiele
Eingang:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Ausgabe:
bEaNs.
Eingang:
%let __6 = 6__; %put __6&__6;
Ausgabe:
__66__
Eingang:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Ausgabe:
BUNS are FUNS1!")
Eingang:
%let x = {*':TT7d; %put SAS is weird.;
Ausgabe:
SAS is weird.
Eingang:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Ausgabe:
Hm?....
Beachten Sie, dass
&&var11
Übereinstimmungen,var11
da die Namensübereinstimmung gierig ist. Wenn es eine gewesen war.
, das heißt&&var1.1
, dannvar1
würde angepasst werden und die zusätzlichen 1 würde nicht Teil eines Namens sein.
Das ist Codegolf, also gewinnt die kürzeste Lösung in Bytes!
quelle
&stuff.
die Periode nicht entfernt werden?&&&&&&&&&a......................
würde nach wie vor nur eine Periode entfernen?Antworten:
Python 3 ,
354341336 BytesProbieren Sie es online!
edit: etwas leichtes kürzen
edit: sortiere in umgekehrter Reihenfolge nach -len (...) anstelle von [:: - 1] (5 Bytes), danke an Jonathan Frech!
Ungolfed
quelle
;
), die Reduzierung von Klammern (if(...)
->if ...
) und Listenoperationen (,reverse=1
->[::-1]
) können leicht einige Bytes einsparen.len(y[0]))[::-1]
kann sein-len(y[0]))
.