Język programowania SAS to niezgrabny, archaiczny język z 1966 roku, który jest nadal używany. Oryginalny kompilator został napisany w języku PL / I i rzeczywiście duża część składni pochodzi z języka PL / I. SAS posiada również makro preprocesora języka, który wywodzi się , że z PL / I , jak również. W tym wyzwaniu będziesz interpretować kilka prostych elementów języka makr SAS.
W języku makr SAS zmienne makr są definiowane za pomocą %let
słowa kluczowego i drukowanie w dzienniku jest wykonywane %put
. Instrukcje kończą się średnikami. Oto kilka przykładów:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Nazwy makrozmiennych nie uwzględniają wielkości liter i zawsze pasują do wyrażenia regularnego /[a-z_][a-z0-9_]*/i
. Na potrzeby tego wyzwania powiemy:
- Zmienne makro może posiadać tylko wartości składających się w całości z znaków ASCII z wyjątkiem
;
,&
i%
- W wartościach nie będzie spacji wiodących ani końcowych
- Wartości nigdy nie będą miały więcej niż 255 znaków
- Wartości mogą być puste
- Nawiasy i cytaty w wartościach mogą być niedopasowane
- Nie może być dowolna ilość miejsca przed i po
=
w%let
sprawozdaniu, a przestrzeń ta powinna być ignorowane - Przed terminalem
;
w%let
instrukcji może znajdować się dowolna ilość miejsca, która również powinna zostać zignorowana
Kiedy wywoływana jest makrozmienna, mówimy, że „rozwiązuje” swoją wartość. Makrozmienne są rozwiązywane przez dodawanie &
. Istnieje opcjonalny znak końcowy .
oznaczający koniec identyfikatora. Na przykład,
%put The value of x is &X..;
zapisuje The value of x is 5.
w dzienniku. Należy pamiętać, że wymagane są dwa okresy, ponieważ jeden okres zostanie wykorzystany &X.
i zostanie rozwiązany 5
. Zauważ również, że chociaż zdefiniowaliśmy x
małe litery, &X
to jest tak samo, &x
ponieważ nazwy makrozmiennych nie rozróżniają wielkości liter.
Tutaj jest trudniej. Wiele &
s może być łączonych razem, aby rozstrzygać zmienne, i &
s na tym samym poziomie rozpoznawania zagnieżdżenia w tym samym czasie. Na przykład,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Najbardziej wewnętrzni &
rozpatrują najpierw, a rozwiązywanie kontynuuje na zewnątrz. Dopasowywanie nazw zmiennych odbywa się zachłannie. W drugiej %put
instrukcji procesor wykonuje następujące kroki:
&i
postanawia1
, a najgłębsze prowadzenie&
zostaje zużyte, dając nam&&coolbeans1
&coolbeans1
postanawiabroseph
, dając nam&broseph
&broseph
rozwiązuje do5
.
Jeśli są końcowe .
, tylko jeden .
zużywa się w rozdzielczości, nawet jeśli jest ich wiele &
.
Zadanie
Biorąc pod uwagę od 1 do 10 %let
instrukcji oddzielonych znakiem nowej linii i pojedynczą %put
instrukcją, wydrukuj lub zwróć wynik %put
instrukcji. Dane wejściowe można zaakceptować w dowolny standardowy sposób.
Możesz założyć, że dane wejściowe zawsze będą prawidłowe i że %let
instrukcje będą poprzedzać %put
instrukcje. Zdefiniowane zmienne nie zostaną ponownie zdefiniowane w późniejszych %let
instrukcjach.
Gdyby faktycznie działał w SAS, nie byłoby problemów z rozdzielaniem zmiennych na zmienne, które nie istnieją i wszystko będzie poprawne składniowo, jak opisano powyżej.
Przykłady
Wejście:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Wynik:
bEaNs.
Wejście:
%let __6 = 6__; %put __6&__6;
Wynik:
__66__
Wejście:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Wynik:
BUNS are FUNS1!")
Wejście:
%let x = {*':TT7d; %put SAS is weird.;
Wynik:
SAS is weird.
Wejście:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Wynik:
Hm?....
Zauważ, że
&&var11
pasuje,var11
ponieważ dopasowywanie nazw jest zachłanne. Gdyby istniał.
, to znaczy&&var1.1
,var1
byłby dopasowany, a dodatkowy 1 nie byłby częścią żadnej nazwy.
To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie w bajtach!
&&&&&&&&&a......................
nadal usunąłby tylko jeden okres?
&stuff.
usuwać okresu?