Mathematica, 84 octets
(x="war""peace")(y="freedom""slavery")(z="ignorance""strength")/#/.x->1/.y->1/.z->1&
Explication
Plus "d'arithmétique" avec des chaînes! Comme dans la réponse liée, ceci est basé sur le fait que vous pouvez "multiplier" des chaînes dans Mathematica, ce qui les laissera non évaluées (comme si vous multipliiez deux variables non affectées x*y
), mais que Mathematica appliquera des simplifications de base, telles que l'annulation de facteurs dans une division.
Nous commençons donc par stocker les trois paires comme produits x
, y
, z
respectivement et les multiplier tous ensemble:
(x="war""peace")(y="freedom""slavery")(z="ignorance""strength")
Ceci évalue à
"freedom" "ignorance" "peace" "slavery" "strength" "war"
(Mathematica trie automatiquement les facteurs, mais l'ordre nous importe peu.)
Nous divisons cela par l'entrée pour supprimer le mot avec lequel nous ne voulons pas.../#
, puisque Mathematica annule les facteurs. Par exemple, si l'entrée était "peace"
nous nous retrouverions avec:
"freedom" "ignorance" "slavery" "strength" "war"
Enfin, on se débarrasse des paires que nous ne sommes pas intéressés, en substituant chacun x
, y
et z
avec 1
. Encore une fois, la simplification de Mathematica 1*a
est toujours d'actualité a
. Cette partie est faite avec:
/.x->1/.y->1/.z->1
La bonne chose est que Mathematica sait que la multiplication est Orderless
ce qui permet de trouver les deux facteurs, qu’ils soient adjacents ou non dans le produit. Seul le mot opposé à l'entrée n'est plus associé dans le produit, de sorte que celui-ci ne sera pas supprimé et reste la seule sortie.