Dans Dyalog APL Extended @ Adám , l' opérateur (sous) signifie la conjugaison: appliquer une fonction, puis une deuxième fonction, puis l'inverse de la première. C'est amusant de penser aux actions réelles en termes de conjugaison:⍢
Un problème est transformé par g dans un autre domaine où il est plus facilement résolu par f, puis retransformé dans le domaine d'origine. Un exemple tiré de la vie réelle est «sous anesthésie»:
apply anesthetics perform surgery wake up from anesthetics
Défi
L'inverse d'une ligne g
est "non" précédé de g
, et vice versa. Définissez une ligne entre s
et son inverse, dans cet ordre, comme étant "sous" s
. Pour chaque ligne f
en entrée dans l'ordre:
- Si
f
et son inverse se produisent, ne faites rien - Si
f
n'est "sous" aucune autre action, imprimezf
- Si
f
est "sous" une ligneg
, imprimezf + " under " + g
où se+
trouve la concaténation.
Contribution
Une chaîne multiligne non vide, ou une liste de chaînes, etc., composée d'espaces et de lettres minuscules (vous pouvez utiliser à la place des majuscules). Exactement une ligne commencera par "un"; et ce sera l'inverse d'une autre ligne. Aucune ligne ne sera vide.
Production
Sortie dans le même format que celui utilisé pour l'entrée, ou comme autorisé par les E / S standard.
Cas de test:
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]
Réponses:
Brachylog , 90 octets
J'ai fait cela tout en étant sous l'impression que cela pouvait être récursif et que plusieurs sous pouvaient être empilés. Probablement pas optimisé. De plus, comme il s'agit de bracylog, la plomberie prend pas mal d'octets.
Essayez-le en ligne!
la source
Rétine , 82 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Exécutez l'ensemble du programme en mode multiligne (de sorte que
^
et faire$
correspondre le début et la fin des lignes individuelles) et répétez jusqu'à ce qu'il n'y ait aucun changement.Recherchez les lignes qui peuvent commencer par
un
et qui sont suivies par une ligne qui commence parun
uniquement si la ligne précédente ne correspond pas alors que le reste de la ligne est la même, et supprimez les deux lignes. (Il s'agit d'un changement de comportement par rapport à Retina 0.8.2, qui fractionne les lignes avant d'essayer de faire correspondre et ne peut donc jamais supprimer des lignes si la correspondance doit s'étendre sur plusieurs lignes à la fois.)Recherchez les lignes qui peuvent commencer par
un
, suivies d'au moins une ligne, suivies d'une ligne qui commence parun
seulement si la ligne d'origine ne le fait pas alors que le reste de la ligne est identique.Déplacez la ligne d'origine d'une ligne vers le bas et ajoutez-la également
under
à la ligne que vous venez de parcourir. (Les lignes supplémentaires seront traitées par la répétition.)la source
Python 2 , 106 octets
Essayez-le en ligne!
Si l'entrée peut être une liste de STDIN et la sortie être séparée par des sauts de ligne, nous avons alors cette solution de 94 octets:
la source
JavaScript (nœud Babel) , 91 octets
Prend l'entrée comme un tableau de chaînes en minuscules. Renvoie un autre tableau de chaînes.
Essayez-le en ligne!
Commenté
la source
Nettoyer , 147 octets
Essayez-le en ligne!
la source