El lenguaje de programación SAS es un lenguaje torpe y arcaico que data de 1966 y que todavía se usa en la actualidad. El compilador original fue escrito en PL / I , y de hecho gran parte de la sintaxis deriva de PL / I. SAS también tiene un lenguaje macro de preprocesador que se deriva del de PL / I también. En este desafío, interpretará algunos elementos simples del lenguaje de macros SAS.
En el lenguaje de macros SAS, las variables de macros se definen con la %let
palabra clave y la impresión en el registro se realiza con %put
. Las declaraciones terminan con punto y coma. Aquí hay unos ejemplos:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Los nombres de variables de macro no distinguen entre mayúsculas y minúsculas y siempre coinciden con la expresión regular /[a-z_][a-z0-9_]*/i
. Para los propósitos de este desafío, diremos lo siguiente:
- Las variables macro solo pueden contener valores que consisten completamente en caracteres ASCII imprimibles , excepto , y
;
&
%
- No habrá espacios iniciales o finales en los valores
- Los valores nunca tendrán más de 255 caracteres.
- Los valores pueden estar vacíos
- Los corchetes y las comillas en los valores pueden no coincidir
- Puede haber cualquier cantidad de espacio antes y después del
=
en la%let
declaración y este espacio debe ignorarse - Puede haber cualquier cantidad de espacio antes del terminal
;
en la%let
declaración y este espacio también debe ignorarse
Cuando se llama a una variable macro, decimos que "se resuelve" a su valor. Las variables macro se resuelven al anteponer &
. Hay un final opcional.
que denota el final del identificador. Por ejemplo,
%put The value of x is &X..;
escribe The value of x is 5.
en el registro. Tenga en cuenta que se requieren dos períodos porque un solo período será consumido por &X.
y se resolverá 5
. También tenga en cuenta que aunque definimos x
en minúsculas, &X
es lo mismo &x
porque los nombres de las variables macro no distinguen entre mayúsculas y minúsculas.
Aquí es donde se pone difícil. Se &
pueden agrupar múltiples s para resolver variables, y &
s al mismo nivel de resolución de anidamiento al mismo tiempo. Por ejemplo,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Los más íntimos se &
resuelven primero, y la resolución continúa hacia afuera. La coincidencia de nombres de variables se realiza con avidez. En la segunda %put
declaración, el procesador realiza los siguientes pasos:
&i
resuelve1
y&
se consume el liderazgo más interno , dándonos&&coolbeans1
&coolbeans1
resuelvebroseph
, dándonos&broseph
&broseph
resuelve a5
.
Si hay .
s finales , solo .
se consume una resolución, incluso si hay múltiples &
s.
Tarea
Dado entre 1 y 10 %let
declaraciones separadas por nuevas líneas y una sola %put
declaración, imprima o devuelva el resultado de la %put
declaración. La entrada se puede aceptar de cualquier forma estándar.
Puede suponer que la entrada siempre será válida y que las %let
declaraciones precederán a la %put
declaración. Las variables que se definen no se redefinirán en %let
declaraciones posteriores .
Si realmente se ejecuta en SAS, no habrá problemas con las variables que se resuelven en variables que no existen y todo será sintácticamente correcto como se describió anteriormente.
Ejemplos
Entrada:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Salida:
bEaNs.
Entrada:
%let __6 = 6__; %put __6&__6;
Salida:
__66__
Entrada:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Salida:
BUNS are FUNS1!")
Entrada:
%let x = {*':TT7d; %put SAS is weird.;
Salida:
SAS is weird.
Entrada:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Salida:
Hm?....
Tenga en cuenta que las
&&var11
coincidenciasvar11
ya que la coincidencia de nombres es codiciosa. Si hubiera habido un.
, es decir&&var1.1
, entoncesvar1
coincidiría y el 1 extra no sería parte de ningún nombre.
Este es el código de golf, por lo que gana la solución más corta en bytes.
fuente
&stuff.
eliminar el período?&&&&&&&&&a......................
¿solo eliminaría un punto?Respuestas:
Python 3 ,
354341336 bytesPruébalo en línea!
editar: algo de acortamiento fácil
editar: orden inverso por -len (...) en lugar de [:: - 1] (5 bytes), ¡gracias a Jonathan Frech!
Sin golf
fuente
;
), la reducción de paréntesis (if(...)
->if ...
) y las operaciones de lista (,reverse=1
->[::-1]
) pueden guardar fácilmente algunos bytes.len(y[0]))[::-1]
puede ser-len(y[0]))
.