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 %letparola 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'%letistruzione in e questo spazio deve essere ignorato - Non ci può essere una qualsiasi quantità di spazio prima che il terminale
;nella%letdichiarazione 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 xin minuscolo, &Xè uguale al &xfatto 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 %putistruzione, il processore procede come segue:
&isi risolve1e il vantaggio più profondo&viene consumato, dandoci&&coolbeans1&coolbeans1si risolvebroseph, dandoci&broseph&brosephsi 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 %letistruzioni separate da newline e una singola %putistruzione, 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 %letistruzioni precedano l' %putistruzione. Le variabili definite non verranno ridefinite nelle %letistruzioni 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
&&var11corrispondenzevar11poiché la corrispondenza dei nomi è avida. Se ci fosse stato un., cioè&&var1.1, alloravar1sarebbe 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?