Conjugación en la vida real

14

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 ges "un" antepuesto gy viceversa. Defina cualquier línea entre sy su inverso, en ese orden, como "debajo" s. Para cada línea fde entrada en orden:

  • Si fy su inverso ocurren, no haga nada
  • Si fno está "bajo" ninguna otra acción, imprimaf
  • Si festá "debajo" de una línea g, imprima f + " under " + gdó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]
lirtosiast
fuente
1
Yo tampoco tengo salida cuando bebo en exceso
Stan Strum
1
¿No debería ser "tomar el libro y pagar el libro caminando hasta la tienda"? de lo contrario no está claro que la transformación sea equivalente a la original ...
Jonás
1
@Jonah La idea está en un mundo ideal w = "caminar para almacenar" y w ^ -1 = "caminar para almacenar" son inversas, por lo que matemáticamente wfw ^ -1wg ^ -1 = wfgw ^ -1.
lirtosiast el
Ah, bastante justo, @lirtosiast.
Jonás

Respuestas:

3

Brachylog , 90 bytes

;Ṡ{hhH↰₂gB&hb~c[A,B,C]&tT;C↔↰U∧" under ",H,T;A↔↰,U|tT&hh,TgJ&hb;T↰Q∧J,Q|h}
~↰₃|↰₃
∧"un";?c

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!

Kroppeb
fuente
2

Retina , 82 bytes

m{A`^(un)?(.+)¶(?(1)|un)\2$
^((un)?(.+)¶)(.+)¶((.+¶)*(?(2)|un)\3)$
$4 under $1$1$5

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

m{

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.

A`^(un)?(.+)¶(?(1)|un)\2$

Busque líneas que puedan comenzar uny 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).

^((un)?(.+)¶)(.+)¶((.+¶)*(?(2)|un)\3)$

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.

$4 under $1$1$5

Mueva la línea original una línea hacia abajo y añádala undera la línea que acaba de atravesar. (Las líneas adicionales serán manejadas por la repetición).

Neil
fuente
2

Python 2 , 106 bytes

s=input()
x=''
l=[]
for i in s:
 if'un'==i[:2]or'un'+i in s:x=(' under '+i)*(not x)
 else:l+=[i+x]
print l

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:

s=input()
x=''
for i in s:
 if'un'==i[:2]or'un'+i in s:x=(' under '+i)*(not x)
 else:print i+x
Erik el Outgolfer
fuente
1

JavaScript (nodo de Babel) , 91 bytes

Toma la entrada como una matriz de cadenas en minúsculas. Devuelve otra matriz de cadenas.

a=>a.flatMap(s=>s==r|'un'+s==r?(u=u?'':' under '+s,[]):s+u,u='',r=a.find(s=>/^un/.test(s)))

Pruébalo en línea!

Comentado

a =>                     // a[] = input array
  a.flatMap(s =>         // for each string s in a[]:
    s == r |             //   if s matches the reference string
    'un' + s == r ? (    //   or its opposite:
      u =                //     update u:
        u ?              //       if u is not an empty string:
          ''             //         turn it to an empty string
        :                //       else:
          ' under ' + s, //         set it to s with the ' under ' prefix
      []                 //     yield an empty array so that this entry is removed
    ) :                  //   else:
      s + u,             //     yield s followed by u
    u = '',              //   initialize u to an empty string
    r = a.find(s =>      //   initialize r ...
      /^un/.test(s)      //     ... to the string beginning with 'un'
    )                    //
  )                      // end of flatMap()
Arnauld
fuente
@ l4m2 Falla de hecho. Ahora arreglado.
Arnauld
1

Limpio , 147 bytes

import StdEnv,Data.List
a=inits;b=tails
$l=hd[w++[e++[' under ':u]\\e<-z]++y\\i<-a l&t<-b l,w<-a i&u<-i,z<-a t&[x:y]<-b t|u==['un':x]||x==['un':u]]

Pruébalo en línea!

Οurous
fuente