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ą %letsł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%letsprawozdaniu, a przestrzeń ta powinna być ignorowane - Przed terminalem
;w%letinstrukcji 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 xmałe litery, &Xto jest tak samo, &xponieważ 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 %putinstrukcji procesor wykonuje następujące kroki:
&ipostanawia1, a najgłębsze prowadzenie&zostaje zużyte, dając nam&&coolbeans1&coolbeans1postanawiabroseph, dając nam&broseph&brosephrozwią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 %letinstrukcji oddzielonych znakiem nowej linii i pojedynczą %putinstrukcją, wydrukuj lub zwróć wynik %putinstrukcji. 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 %letinstrukcje będą poprzedzać %putinstrukcje. Zdefiniowane zmienne nie zostaną ponownie zdefiniowane w późniejszych %letinstrukcjach.
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
&&var11pasuje,var11ponieważ dopasowywanie nazw jest zachłanne. Gdyby istniał., to znaczy&&var1.1,var1był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?