Como George Orwell escribió en 1984 :
La guerra es paz La
libertad es esclavitud La
ignorancia es fuerza
Escriba un programa o función que tome una de las seis palabras principales de la cita de Orwell y genere su contraparte.
Específicamente:
[input] -> [output]
war -> peace
peace -> war
freedom -> slavery
slavery -> freedom
ignorance -> strength
strength -> ignorance
No se requieren otros pares de entrada / salida.
Debe suponer que las palabras siempre están en minúsculas, como se indicó anteriormente. Alternativamente, se puede suponer las palabras son siempre totalmente en mayúsculas: WAR -> PEACE
, PEACE -> WAR
, etc.
El código más corto en bytes gana.
code-golf
string
kolmogorov-complexity
Pasatiempos de Calvin
fuente
fuente
w p f s i
) no se encuentran en ninguna otra parte de las palabras. Una propiedad intrigante.Respuestas:
05AB1E , 30 bytes
05AB1E utiliza CP-1252 .
Pruébalo en línea! o como un conjunto de pruebas
Explicación
El enfoque directo
ignorance strength war peace freedom slavery
fuente
ignorance strength war peace freedom slavery
¡Siento que me faltan unos doce pasos!JavaScript (ES6), 80 bytes
Cómo funciona
Utilizamos una pequeña tabla de búsqueda basada en el código ASCII del segundo carácter de cada palabra, devolviendo el índice de su contraparte.
Como nota al margen, si se permitiera la
war PEACE FREEDOM slavery IGNORANCE strength
combinación de mayúsculas y minúsculas, el uso con el módulo 6 conduciría a un hash perfecto.Prueba
Mostrar fragmento de código
fuente
z
y luego comprime la cadena conatob
ahorra 8 bytes?atob
, obtienes una cadena que es en su mayoría javascript válido; eventualmente solo necesitas escapar de la `\ 'y la cita de cierre. Puede ser difícil publicarlo en este sitio, pero eso no invalida la respuesta. Ver la respuesta perl por smisJalea , 24 bytes
Pruébalo en línea!
Cómo funciona
Primero, el token
indexa en el diccionario de Jelly para crear la cadena
que se
Ḳ
divide en espacios para producir el conjunto de cadenasµ
comienza una nueva cadena monádica, con ese conjunto de cadenas como argumento, que también es el valor de retorno actual.ɠ
lee una línea de entrada de STDIN yi
encuentra su índice del valor de retorno anterior, es decir, la matriz de cadenas generada.Ahora,
^1
toma el XOR bit a bit de ese índice y 1 . Para los índices incluso - tener en cuenta que los índices de jalea son 1 basada y modular, por lo que la fuerza tiene índice 1 y la ignorancia tiene índice 6 / 0 - esto incrementa el índice; para índices impares, los disminuye.Finalmente,
ị
recupera la cadena en ese índice del argumento de la cadena.fuente
Mathematica, 84 bytes
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:Esto evalúa a
(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:Por último, nos deshacemos de los pares que no le interesa, sustituyendo cada una de
x
,y
yz
con1
. Una vez más, la simplificación de Mathematica comienza1*a
siemprea
. Esta parte se realiza con: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.fuente
WordList[][[<|"l"->14007,"t"->17083,"a"->25105,"r"->32106,"g"->33790,"e"->39048|>@#[[2]]]]&
.WordList
está bien. Sin embargo, tomar una lista de caracteres como entrada y devolver una cadena parece un poco dudoso. ;) Dicho esto, puedes hacer 4 bytes mejor conx[[7-Position[x={"war","slavery","ignorance","strength","freedom","peace"},#][[1,1]]]]&
.<|#->#2&~MapThread~{x={"war","slavery","ignorance","strength","freedom","peace"},Reverse@x}|>
para 94 bytesVim, 60 bytes
Pruébalo en línea! en el intérprete de V compatible con versiones anteriores.
Por supuesto, si tuviéramos que cambiar a V, podríamos guardar un byte utilizando un método de entrada más conveniente. Pero como esta es una diferencia tan pequeña, preferiría usar la versión que no sea de golf.
Explicación:
fuente
C (gcc) ,
120107 bytesMáximo abuso de puntero! Requiere una máquina little endian y largos de 64 bits.
El código contiene algunos elementos no imprimibles, pero el pegado de copias debería funcionar.
Pruébalo en línea!
fuente
Python, 81 bytes
O, misma longitud:
fuente
l
como argumento opcional.Perl 6 , 61 bytes
Con los caracteres no imprimibles que se muestran como (porque StackExchange los elimina de lo contrario):
Aquí hay un
xxd
volcado hexadecimal:Versión ampliada (caracteres no imprimibles reemplazados por secuencias de escape, y espacios en blanco y comentarios agregados):
fuente
Bash ,
100878678 bytesPruébalo en línea!
La segunda letra de cada palabra identifica de manera única esa palabra, por lo que uso ese carácter como nombre de variable; El valor de esa variable es la otra palabra correspondiente.
Por ejemplo, la segunda letra de
peace
ese
, y la palabra correspondiente apeace
eswar
, así que configurée=war
.Dada una cadena de entrada, el segundo carácter de esa cadena se usa como un nombre de variable para extraer la palabra correspondiente deseada, utilizando la expansión de parámetros indirectos de bash.
fuente
TI-Basic,
1038477 bytes¡Reducir a una sola línea ahorró muchos bytes!Jaja, qué irónico fue esa declaración ...fuente
Perl , 63 bytes
62 bytes +
-p
bandera.Pruébalo en línea!
ord
devuelve el código char del primer carácter de la palabra de entrada.Después de la
%6
, tenemos:Entonces tenemos
slavery
ystrength
ambos devolviendo 1 (ya que ambos comienzan con la misma letra), y ninguno devolviendo 2. Por lo tanto, agregamos1
parastrength
(es la única palabra que coincidirá/h/
), y tenemos cada palabra asignada a un índice de 0 a 5)fuente
R, 86
8792BytesCambiado a una función sin nombre y
gsub
alsub
de unos pocos bytes. Losgrep
determina cuál de las 3 cadenas se utiliza y la entrada se quita de esa cadena consub
.fuente
PHP, 70 bytes
fuente
Befunge,
8988 bytesPruébalo en línea!
Explicación
Comenzamos empujando todas las cadenas de salida posibles en la pila, terminadas en nulo. Esta secuencia se ejecuta de derecha a izquierda para que los valores se introduzcan en reversa, ya que ese es el orden en que se necesitarán los caracteres cuando finalmente se generen.
Luego leemos los primeros dos caracteres de stdin, que es todo lo que necesitamos para identificar la cadena de entrada. Si tomamos el valor ASCII de la primera letra mod 2, más la segunda letra mod 7, obtenemos un número único en el rango de 2 a 7.
Este número se puede usar como una especie de índice en la lista de cadenas de la pila. Disminuimos iterativamente el índice (la primera vez en 2), y para cada iteración borramos una cadena de la pila con la secuencia
>_
.Una vez que el índice llega a cero, nos queda la cadena de salida correcta en la parte superior de la pila, por lo que usamos una secuencia de salida de cadena simple para escribir el resultado en stdout.
fuente
:-<
y@>:#
"emoticonos" aquí :)Pyke, 29 bytes
Pruébalo aquí!
fuente
C, 93
La respuesta de @ Arnauld se transfirió a C
fuente
C (gcc) ,
113108bytesTodas las instancias de
\0
se pueden reemplazar con bytes NUL reales para fines de puntuación.t+*--t-47
es un comportamiento indefinido; esto puede / no funcionará con otros compiladores.Pruébalo en línea!
fuente
JavaScript (ES6), 71
78Mucho más aburrido que la respuesta de Arnauld, pero también más corto.
Ahora agregué la codificación con
btoa
. En la cadena codificada hay 4 bytes que no puedo publicar en este sitio, incluso si son caracteres válidos en una cadena de JavaScript. Así que usé un escape hexadecimal en el formulario\xHH
. Cada uno de estos escapes se cuenta como 1 byte.La cadena codificada es
strength0ignorance0peace0war0slavery0freedom
Este es 82 y no distingue mayúsculas de minúsculas
Prueba
fuente
CJam, 52 (solo ASCII)
Pruébalo en línea
Nota: las cosas que parecen espacios son caracteres de tabulación (uno antes y otro después de "EK {")
Explicación:
La parte hasta "+" es descomprimir la cadena "esclavitudj libertadjwarjpeacejignorancejstrength", utilizando la conversión base:
cadena (tratada como una matriz de códigos de caracteres) → (base 144) número → (base 26) matriz de números → (agregando 'a' a cada uno número) cadena
fuente
> <> (Pez),
8478 bytesPruébalo en línea!
Comenzamos a nadar desde la esquina superior izquierda, hacia la derecha. Primero cargamos la pila con un 0. Luego leemos la primera letra de entrada (
i
), la descartamos (~
), leemos la segunda letra (i
) y reducimos su valor ASCII módulo 10 (a%
). Esto asigna a, e, r, l, g y t a 7, 1, 4, 8, 3 y 6, respectivamente. Llamemos a este número N..
saca dos valores de la pila, N y 0, y salta a línea N, caracter 0.Después de un salto, el pez continúa un tic antes de ejecutar las instrucciones, por lo que ignora el primer carácter y nada a través de la línea N, que carga la palabra correspondiente en la pila. Finalmente, vamos a la línea 2, que genera la pila completa y sale.
fuente
JavaScript, 78 bytes
Este es un tipo de puerto de mi respuesta de Python . Almacenamos las palabras en una cadena donde cada una está en la posición opuesta a su contraparte. Encontramos el índice de la palabra dada
w
, y obtenemos ese índice desde el final, para devolver el resultado.Fragmento de prueba:
fuente
Pari / GP, 86 Byte
Pari / GP es un intérprete interactivo, no necesitamos un "print" -cmd para la salida; sin embargo, la utilidad Try-It_Online necesita una "impresión" -cmd, así que separé esto al "pie de página".
Definimos una "función de objeto" (la letra O me recuerda encantadora de la función de Orwell ... ;-)):
Después de eso, llama
Pruébalo en línea!
(¡Tenga en cuenta que en Pari / GP los tokens dados aquí no son cadenas sino nombres de variables legales! A esas variables nunca se les debe asignar ningún valor)
fuente
Apilado, 70 bytes
Pruébalo aquí! Toma la entrada en la pila y deja la salida en la pila. Por ejemplo:
Este código es bastante autoexplicativo. Ligeramente modificado para ejecutar todos los casos de prueba:
fuente
'LF
hacer?@x
establece una variable,'...'
es una cadena yLF
es la variable de salto de líneaJolf, 35 bytes
Hay muchos no imprimibles. Aquí hay un hexdump, aunque no servirá de mucho:
Aquí hay un enlace en línea.
Básicamente, el código se ve así:
fuente
En realidad , 56 bytes
Pruébalo en línea!
Desafortunadamente, sin ninguna compresión incorporada, es más corto no comprimir la cadena y descomprimirla manualmente.
Explicación:
fuente
Haskell, 104
111bytesIdea:
fromEnum
, mueva 3 pasos hacia la derecha (módulo 6) y vuelva a convertir a la palabra clave::O
es necesario porque la inferencia de tipos tiene algunos problemas. Darf
una firmaf :: O -> O
tendría el mismo efecto pero no es tan corto.Editar:
Reemplazado
por
Gracias a @Laikoni.
fuente
f
es más corto:f s=toEnum$mod(3+fromEnum s)6
Dyalog APL , 66 bytes
Cualquiera de estos:
'slavery' 'freedom' 'ignorance' 'strength' 'war' 'peace'⊃⍨6|⎕UCS⊃⍞
utiliza este método (requiere⎕IO←0
el predeterminado en muchos sistemas).'strength' 'freedom' 'war' 'peace' 'slavery' 'ignorance'(⍳⊃(⌽⊣))⊂⍞
realiza una búsqueda, luego selecciona el elemento correspondiente de la lista invertida.fuente
Qbasic,
13899 bytesD$
almacena todas las palabras del lado izquierdo del mantra, luego todas las del lado derecho. Cada palabra se rellena con espacios para exactamente 9 letras por palabra.D$
luego se adjunta a sí mismo.Luego
instr
se utiliza para encontrar el índice de la palabra ingresada por el usuario. La otra parte del mantra siempre se almacena exactamente 9 * 3 posiciones más adelante en la cadena, por lo que imprimimos una subcadena que comienza en esa posición, tomando 9 caracteres.fuente
SmileBASIC, 92 bytes
fuente
Python , 80 bytes
De alguna manera superó a xnor!
Esta es una función lambda sin nombre, que devuelve el resultado.
Pruébalo en línea!
La lista de palabras está organizada de tal manera que cada una está en la posición opuesta a su contraparte. Dada la palabra
w
, encontramos su índice en la lista de palabras, y luego NO a nivel bit (~
). Esto voltea todos los bits, que se calculan => -n-1
. Debido a la indexación negativa de Python, obtiene el índice opuesto en la lista.Como una especie de bonificación no intencional, puede pasar cualquier lista de palabras de opuestos a esta función como segundo argumento.
fuente