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 %letmot - 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'%letinstruction et cet espace doit être ignoré - Il peut y avoir n'importe quelle quantité d'espace avant le terminal
;dans l'%letinstruction 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 xen minuscules, &Xc'est la même chose que &xparce 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 %putinstruction, le processeur effectue les étapes suivantes:
&ise résout à1, et le plus intime leader&est consommé, nous donnant&&coolbeans1&coolbeans1décide debrosephnous donner&broseph&brosephdé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 %letinstructions séparées par des retours à la ligne et une seule %putinstruction, imprimez ou renvoyez le résultat de l' %putinstruction. 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 %letinstructions précéderont l' %putinstruction. Les variables définies ne seront pas redéfinies dans les %letinstructions 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
&&var11correspondvar11car l'appariement de nom est gourmand. S'il y avait eu un., c'est-à-dire&&var1.1, alors il yvar1aurait 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?