Le langage de programmation SAS est un langage maladroit et archaïque datant de 1966 qui est toujours utilisé aujourd'hui. Le compilateur d'origine a été écrit en PL / I , et en effet une grande partie de la syntaxe dérive de PL / I. SAS a également un langage macro préprocesseur qui de dérive de celle de PL / I ainsi. Dans ce défi, vous allez interpréter quelques éléments simples du langage macro SAS.
Dans le langage de macro SAS, les variables de macro sont définies à l'aide du %let
mot - clé et l'impression dans le journal se fait avec %put
. Les déclarations se terminent par des points-virgules. Voici quelques exemples:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Les noms de variables de macro ne respectent pas la casse et correspondent toujours à l'expression régulière /[a-z_][a-z0-9_]*/i
. Aux fins de ce défi, nous dirons ce qui suit:
- Les variables de macro ne peuvent contenir des valeurs composées uniquement de caractères ASCII imprimables sauf
;
,&
et%
- Il n'y aura pas d'espaces de début ou de fin dans les valeurs
- Les valeurs ne dépasseront jamais 255 caractères
- Les valeurs peuvent être vides
- Les crochets et les guillemets dans les valeurs peuvent être inégalés
- Il peut y avoir n'importe quelle quantité d'espace avant et après le
=
dans l'%let
instruction et cet espace doit être ignoré - Il peut y avoir n'importe quelle quantité d'espace avant le terminal
;
dans l'%let
instruction et cet espace doit également être ignoré
Lorsqu'une macro variable est appelée, nous disons qu'elle "résout" sa valeur. Les variables de macro sont résolues par préfixation &
. Il y a une fin facultative.
qui indique la fin de l'identifiant. Par exemple,
%put The value of x is &X..;
écrit The value of x is 5.
dans le journal. Notez que deux périodes sont nécessaires car une seule période sera consommée par &X.
et résolu 5
. Notez également que même si nous avons défini x
en minuscules, &X
c'est la même chose que &x
parce que les noms de variables de macro ne respectent pas la casse.
Voici où cela devient difficile. Plusieurs &
s peuvent être liés ensemble pour résoudre des variables, et &
s au même niveau de résolution d'imbrication en même temps. Par exemple,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Les plus intimes se &
résolvent en premier et la résolution se poursuit vers l'extérieur. La correspondance des noms de variables se fait avec avidité. Dans la deuxième %put
instruction, le processeur effectue les étapes suivantes:
&i
se résout à1
, et le plus intime leader&
est consommé, nous donnant&&coolbeans1
&coolbeans1
décide debroseph
nous donner&broseph
&broseph
décide de5
.
S'il y a des .
s finaux , un seul .
est consommé en résolution, même s'il y a plusieurs &
s.
Tâche
Étant donné entre 1 et 10 %let
instructions séparées par des retours à la ligne et une seule %put
instruction, imprimez ou renvoyez le résultat de l' %put
instruction. L'entrée peut être acceptée de n'importe quelle manière standard.
Vous pouvez supposer que l'entrée sera toujours valide et que les %let
instructions précéderont l' %put
instruction. Les variables définies ne seront pas redéfinies dans les %let
instructions ultérieures .
S'ils s'exécutent réellement dans SAS, il n'y aurait aucun problème avec la résolution des variables en variables qui n'existent pas et tout sera syntaxiquement correct comme décrit ci-dessus.
Exemples
Contribution:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Production:
bEaNs.
Contribution:
%let __6 = 6__; %put __6&__6;
Production:
__66__
Contribution:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Production:
BUNS are FUNS1!")
Contribution:
%let x = {*':TT7d; %put SAS is weird.;
Production:
SAS is weird.
Contribution:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Production:
Hm?....
Notez que
&&var11
correspondvar11
car l'appariement de nom est gourmand. S'il y avait eu un.
, c'est-à-dire&&var1.1
, alors il yvar1
aurait correspondance et le 1 supplémentaire ne ferait partie d'aucun nom.
C'est le golf de code, donc la solution la plus courte en octets gagne!
&&&&&&&&&a......................
serait encore seulement enlever une période?
&stuff.
supprimer la période?