A linguagem de programação SAS é uma linguagem arcaica e desajeitada que remonta a 1966, ainda em uso hoje. O compilador original foi escrito em PL / I e, de fato, grande parte da sintaxe deriva de PL / I. SAS também tem um pré-processador linguagem macro que deriva do que de PL / I também. Neste desafio, você interpretará alguns elementos simples da linguagem de macro SAS.
Na linguagem de macro SAS, as variáveis de macro são definidas usando a %let
palavra - chave e a impressão no log é concluída %put
. As instruções terminam com ponto e vírgula. aqui estão alguns exemplos:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Os nomes de variáveis de macro não diferenciam maiúsculas de minúsculas e sempre correspondem à expressão regular /[a-z_][a-z0-9_]*/i
. Para os propósitos deste desafio, diremos o seguinte:
- As variáveis de macro podem conter apenas valores que consistem inteiramente em caracteres ASCII imprimíveis , exceto , e
;
&
%
- Não haverá espaços à esquerda ou à direita nos valores
- Os valores nunca terão mais de 255 caracteres
- Os valores podem estar vazios
- Parênteses e aspas nos valores podem ser incomparáveis
- Pode haver qualquer quantidade de espaço antes e depois do
=
no%let
instrução e esse espaço deve ser ignorado - Pode haver qualquer quantidade de espaço antes do terminal
;
na%let
instrução e esse espaço deve ser igualmente ignorado
Quando uma variável de macro é chamada, dizemos que "resolve" ao seu valor. Variáveis de macro são resolvidas anexando-as &
. Há um final opcional.
que indica o final do identificador. Por exemplo,
%put The value of x is &X..;
escreve The value of x is 5.
no log. Observe que dois períodos são necessários porque um único período será consumido &X.
e resolvido para 5
. Observe também que, embora tenhamos definido x
em letras minúsculas, &X
é o mesmo que &x
porque os nomes de variáveis de macro não diferenciam maiúsculas de minúsculas.
Aqui é onde fica complicado. &
S múltiplos podem ser agrupados para resolver variáveis &
es no mesmo nível de resolução de aninhamento ao mesmo tempo. Por exemplo,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Os mais internos &
resolvem primeiro e a resolução continua para fora. A correspondência do nome da variável é feita com avidez. Na segunda %put
instrução, o processador faz as seguintes etapas:
&i
resolve1
e a liderança mais interna&
é consumida, dando-nos&&coolbeans1
&coolbeans1
resolvebroseph
, dando-nos&broseph
&broseph
resolve para5
.
Se houver .
s à direita , apenas um .
será consumido na resolução, mesmo se houver vários&
s.
Tarefa
Dado entre 1 e 10 %let
declarações separadas por novas linhas e uma única %put
declaração, imprima ou retorne o resultado da%put
declaração. A entrada pode ser aceita de qualquer maneira padrão.
Você pode assumir que a entrada sempre será válida e que as %let
instruções precedem a %put
declaração. Variáveis definidas não serão redefinidas posteriormente%let
instruções .
Se realmente executado no SAS, não haveria problemas com variáveis resolvidas para variáveis que não existem e tudo estará sintaticamente correto, conforme descrito acima.
Exemplos
Entrada:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Resultado:
bEaNs.
Entrada:
%let __6 = 6__; %put __6&__6;
Resultado:
__66__
Entrada:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Resultado:
BUNS are FUNS1!")
Entrada:
%let x = {*':TT7d; %put SAS is weird.;
Resultado:
SAS is weird.
Entrada:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Resultado:
Hm?....
Observe que
&&var11
corresponde,var11
pois a correspondência de nomes é gananciosa. Se houvesse um.
, ou seja&&var1.1
,var1
seria correspondido e o 1 extra não faria parte de nenhum nome.
Isso é código de golfe, então a solução mais curta em bytes vence!
&&&&&&&&&a......................
seria ainda só remover um período?
&stuff.
remover o período?