En Dyalog APL Extended de @ Adám , el operador (debajo) significa conjugación: aplique una función, luego una segunda función, luego la inversa de la primera. Es divertido pensar en acciones de la vida real en términos de conjugación:⍢
Un problema es transformado por g en otro dominio donde f resuelto más fácilmente por f, y luego transformado nuevamente en el dominio original. Un ejemplo de la vida real es "bajo anestesia":
apply anesthetics perform surgery wake up from anesthetics
Desafío
El inverso de una línea g
es "un" antepuesto g
y viceversa. Defina cualquier línea entre s
y su inverso, en ese orden, como "debajo" s
. Para cada línea f
de entrada en orden:
- Si
f
y su inverso ocurren, no haga nada - Si
f
no está "bajo" ninguna otra acción, imprimaf
- Si
f
está "debajo" de una líneag
, imprimaf + " under " + g
dónde+
está la concatenación.
Entrada
Una cadena de varias líneas no vacía, o una lista de cadenas, etc., que consta de espacios y letras minúsculas (en su lugar, puede usar mayúsculas). Exactamente una línea comenzará con "un"; y será el inverso de alguna otra línea. Ninguna línea estará vacía.
Salida
Salida en el mismo formato en el que ingresó, o según lo permitido por E / S estándar.
Casos de prueba:
Input:
apply anesthetics
perform surgery
unapply anesthetics
Output:
perform surgery under apply anesthetics
Input:
unite asia
establish the silk road
ite asia
Output:
establish the silk road under unite asia
Input:
desire a book
walk to store
take the book
pay for the book
unwalk to store
read the book
Output:
desire a book
take the book under walk to store
pay for the book under walk to store
read the book
Input:
drink excessively
undrink excessively
Output:
[empty string]
Respuestas:
Brachylog , 90 bytes
Hice esto mientras tenía la impresión de que esto podría ser recursivo y que podrían apilarse múltiples subyacentes. Probablemente no optimizado. Además, como se trata de bracylog, la plomería requiere bastante bytes.
Pruébalo en línea!
fuente
Retina , 82 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Ejecute todo el programa en modo multilínea (para que
^
y$
que coincida con el comienzo y el final de las líneas individuales) y repita hasta que no haya cambios.Busque líneas que puedan comenzar
un
y que estén seguidas por una línea que comience conun
solo si la línea anterior no lo hace, mientras que el resto de la línea es la misma, y elimine ambas líneas. (Este es un cambio de comportamiento de Retina 0.8.2, que divide las líneas antes de intentar hacer coincidir y, por lo tanto, nunca puede eliminar líneas si la coincidencia necesita abarcar más de una línea a la vez).Busque líneas que puedan comenzar
un
, seguidas de al menos una línea, seguida de una línea que comience conun
solo si la línea original no lo hace mientras que el resto de la línea es la misma.Mueva la línea original una línea hacia abajo y añádala
under
a la línea que acaba de atravesar. (Las líneas adicionales serán manejadas por la repetición).fuente
Python 2 , 106 bytes
Pruébalo en línea!
Si la entrada puede ser una lista de STDIN y la salida debe estar separada por una nueva línea, entonces tenemos esta solución de 94 bytes:
fuente
JavaScript (nodo de Babel) , 91 bytes
Toma la entrada como una matriz de cadenas en minúsculas. Devuelve otra matriz de cadenas.
Pruébalo en línea!
Comentado
fuente
Limpio , 147 bytes
Pruébalo en línea!
fuente