Il linguaggio di programmazione SAS è un linguaggio volgare e arcaico risalente al 1966 che è ancora in uso oggi. Il compilatore originale è stato scritto in PL / I , e in effetti gran parte della sintassi deriva da PL / I. SAS ha anche un preprocessore macro-linguaggio che deriva da quella di PL / I pure. In questa sfida, interpreterai alcuni semplici elementi del linguaggio macro SAS.
Nel linguaggio macro SAS, le variabili macro vengono definite utilizzando la %let
parola chiave e la stampa viene eseguita con il registro %put
. Le dichiarazioni terminano con punto e virgola. Ecco alcuni esempi:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
I nomi delle variabili macro non fanno distinzione tra maiuscole e minuscole e corrispondono sempre all'espressione regolare /[a-z_][a-z0-9_]*/i
. Ai fini di questa sfida, diremo quanto segue:
- Variabili macro possono contenere solo valori costituiti interamente di caratteri ASCII stampabili ad eccezione
;
,&
e%
- Non ci saranno spazi iniziali o finali nei valori
- I valori non saranno mai più lunghi di 255 caratteri
- I valori possono essere vuoti
- Le parentesi e le virgolette nei valori possono essere senza pari
- Ci può essere qualsiasi quantità di spazio prima e dopo
=
l'%let
istruzione in e questo spazio deve essere ignorato - Non ci può essere una qualsiasi quantità di spazio prima che il terminale
;
nella%let
dichiarazione e questo spazio devono anche ignorato
Quando viene chiamata una variabile macro, diciamo che "si risolve" al suo valore. Le variabili macro vengono risolte anteponendo &
. Esiste un finale facoltativo.
che indica la fine dell'identificatore. Per esempio,
%put The value of x is &X..;
scrive The value of x is 5.
nel registro. Si noti che sono richiesti due periodi perché un singolo periodo verrà utilizzato &X.
e risolto 5
. Si noti inoltre che, sebbene sia stato definito x
in minuscolo, &X
è uguale al &x
fatto che i nomi delle variabili macro non fanno distinzione tra maiuscole e minuscole.
Ecco dove diventa difficile. Più &
s possono essere uniti per risolvere le variabili e &
allo stesso livello di nidificazione allo stesso tempo. Per esempio,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
I più &
interni si risolvono per primi e la risoluzione continua verso l'esterno. La corrispondenza dei nomi delle variabili viene eseguita avidamente. Nella seconda %put
istruzione, il processore procede come segue:
&i
si risolve1
e il vantaggio più profondo&
viene consumato, dandoci&&coolbeans1
&coolbeans1
si risolvebroseph
, dandoci&broseph
&broseph
si risolve in5
.
Se ci sono .
s finali , solo uno .
viene consumato in risoluzione, anche se ce ne sono più&
.
Compito
Dato tra 1 e 10 %let
istruzioni separate da newline e una singola %put
istruzione, stampa o restituisce il risultato di%put
dell'istruzione. L'ingresso può essere accettato in qualsiasi modo standard.
Si può presumere che l'input sia sempre valido e che le %let
istruzioni precedano l' %put
istruzione. Le variabili definite non verranno ridefinite nelle %let
istruzioni successive .
Se effettivamente eseguito in SAS, non ci sarebbero problemi con le variabili che si risolvono in variabili che non esistono e tutto sarà sintatticamente corretto come descritto sopra.
Esempi
Ingresso:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Produzione:
bEaNs.
Ingresso:
%let __6 = 6__; %put __6&__6;
Produzione:
__66__
Ingresso:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Produzione:
BUNS are FUNS1!")
Ingresso:
%let x = {*':TT7d; %put SAS is weird.;
Produzione:
SAS is weird.
Ingresso:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Produzione:
Hm?....
Nota che le
&&var11
corrispondenzevar11
poiché la corrispondenza dei nomi è avida. Se ci fosse stato un.
, cioè&&var1.1
, alloravar1
sarebbe abbinato e l'1 in più non farebbe parte di nessun nome.
Questo è il golf del codice, quindi vince la soluzione più breve in byte!
&&&&&&&&&a......................
rimuoverebbe solo un periodo?
&stuff.
rimuovere il periodo?