No Dyalog APL Extended de @ Adám , o operador (sub) significa conjugação: aplique uma função, depois uma segunda função e o inverso da primeira. É divertido pensar em ações da vida real em termos de conjugação:⍢
Um problema é transformado por g em outro domínio, onde é mais facilmente resolvido por f e, em seguida, transformado novamente no domínio original. Um exemplo da vida real é "sob anestesia":
apply anesthetics perform surgery wake up from anesthetics
Desafio
O inverso de uma linha g
é "un" anexado g
e vice-versa. Defina qualquer linha entre s
e sua inversa, nessa ordem, como "abaixo" s
. Para cada linha f
na entrada, em ordem:
- Se
f
e seu inverso ocorrerem, não faça nada - Se
f
não estiver "sob" nenhuma outra ação, imprimaf
- Se
f
estiver "abaixo" de uma linhag
, imprimaf + " under " + g
onde+
está a concatenação.
Entrada
Uma sequência multilinha não vazia, ou lista de sequências, etc., consistindo em espaços e letras minúsculas (você pode usar maiúsculas). Exatamente uma linha começará com "un"; e será o inverso de alguma outra linha. Nenhuma linha estará vazia.
Resultado
Saída no mesmo formato em que você inseriu ou conforme permitido pela E / S padrão.
Casos de teste:
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]
Respostas:
Braquilog , 90 bytes
Fiz isso com a impressão de que isso poderia ser recursivo e várias partes inferiores poderiam ser empilhadas. Provavelmente não otimizado. Além disso, como esse é o bracylog, o encanamento leva alguns bytes.
Experimente online!
fonte
Retina , 82 bytes
Experimente online! O link inclui casos de teste. Explicação:
Executar todo o programa em modo de várias linhas (de modo que
^
e$
coincide com o início eo fim de linhas individuais) e repita até que não haja mudanças.Procure por linhas que possam começar
un
e sejam seguidas por uma linha que comeceun
somente se a linha anterior não continuar enquanto o restante da linha for a mesma e exclua as duas linhas. (Essa é uma alteração de comportamento da Retina 0.8.2, que divide as linhas antes de tentar corresponder e, portanto, nunca pode excluir linhas se a correspondência precisar abranger mais de uma linha ao mesmo tempo.)Procure por linhas que possam começar
un
, seguidas por pelo menos uma linha, seguida por uma linha que comeceun
somente se a linha original não aparecer enquanto o restante da linha for o mesmo.Mova a linha original para baixo uma linha e também a adicione
under
à linha que acabou de atravessar. (Linhas adicionais serão tratadas pela repetição.)fonte
Python 2 , 106 bytes
Experimente online!
Se a entrada puder ser uma lista de STDIN e a saída for separada por nova linha, teremos esta solução de 94 bytes:
fonte
JavaScript (Nó Babel) , 91 bytes
Recebe a entrada como uma matriz de seqüências de caracteres em minúsculas. Retorna outra matriz de strings.
Experimente online!
Comentado
fonte
Limpo , 147 bytes
Experimente online!
fonte