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 %letpalabra 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%letdeclaración y este espacio debe ignorarse
- Puede haber cualquier cantidad de espacio antes del terminal ;en la%letdeclaració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 xen minúsculas, &Xes lo mismo &xporque 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 %putdeclaración, el procesador realiza los siguientes pasos:
- &iresuelve- 1y- &se consume el liderazgo más interno , dándonos- &&coolbeans1
- &coolbeans1resuelve- broseph, dándonos- &broseph
- &brosephresuelve a- 5.
Si hay .s finales , solo .se consume una resolución, incluso si hay múltiples &s.
Tarea
Dado entre 1 y 10 %letdeclaraciones separadas por nuevas líneas y una sola %putdeclaración, imprima o devuelva el resultado de la %putdeclaración. La entrada se puede aceptar de cualquier forma estándar.
Puede suponer que la entrada siempre será válida y que las %letdeclaraciones precederán a la %putdeclaración. Las variables que se definen no se redefinirán en %letdeclaraciones 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 - &&var11coincidencias- var11ya que la coincidencia de nombres es codiciosa. Si hubiera habido un- ., es decir- &&var1.1, entonces- var1coincidirí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])).