Mathematica, 84 bytes
(x="war""peace")(y="freedom""slavery")(z="ignorance""strength")/#/.x->1/.y->1/.z->1&
Explicación
Más "aritmética" con cuerdas! Como en la respuesta vinculada, esto se basa en el hecho de que puede "multiplicar" cadenas en Mathematica, lo que las dejará sin evaluar (similar a multiplicar dos variables no asignadas x*y
), pero que Mathematica aplicará simplificaciones básicas, como cancelar factores en una división.
Así que empezamos mediante el almacenamiento de los tres pares como productos en x
, y
, z
,, respectivamente, y se multiplican a todos juntos:
(x="war""peace")(y="freedom""slavery")(z="ignorance""strength")
Esto evalúa a
"freedom" "ignorance" "peace" "slavery" "strength" "war"
(Mathematica clasifica automáticamente los factores, pero no nos importa el orden).
Dividimos esto por la entrada para eliminar la palabra con la que no queremos .../#
, ya que Mathematica cancela los factores. Por ejemplo, si la entrada fuera "peace"
, terminaríamos con:
"freedom" "ignorance" "slavery" "strength" "war"
Por último, nos deshacemos de los pares que no le interesa, sustituyendo cada una de x
, y
y z
con 1
. Una vez más, la simplificación de Mathematica comienza 1*a
siempre a
. Esta parte se realiza con:
/.x->1/.y->1/.z->1
Lo bueno es que Mathematica sabe que la multiplicación es Orderless
así que esto encontrará los dos factores independientemente de si son adyacentes en el producto o no. Solo la palabra que es opuesta a la entrada ya no está emparejada en el producto, por lo que no se eliminará y permanecerá como la única salida.