Como George Orwell escreveu em 1984 :
Escreva um programa ou função que capte uma das seis palavras principais da citação de Orwell e emita sua contraparte.
Especificamente:
[input] -> [output]
war -> peace
peace -> war
freedom -> slavery
slavery -> freedom
ignorance -> strength
strength -> ignorance
Nenhum outro par de entrada / saída é necessário.
Você deve assumir que as palavras estão sempre em minúsculas, como acima. Alternativamente, você pode supor que as palavras são sempre totalmente maiúsculas: WAR -> PEACE
, PEACE -> WAR
, etc.
O código mais curto em bytes vence.
code-golf
string
kolmogorov-complexity
Passatempos de Calvin
fonte
fonte
w p f s i
) não são encontradas em nenhum outro lugar em nenhuma das palavras. Uma propriedade intrigante.Respostas:
05AB1E , 30 bytes
05AB1E usa CP-1252 .
Experimente online! ou como um conjunto de testes
Explicação
A abordagem direta
ignorance strength war peace freedom slavery
fonte
ignorance strength war peace freedom slavery
, sinto que estou perdendo cerca de uma dúzia de passos lá!JavaScript (ES6), 80 bytes
Como funciona
Utilizamos uma pequena tabela de pesquisa baseada no código ASCII do 2º caractere de cada palavra, retornando o índice de sua contraparte.
Como observação lateral, se a combinação de maiúsculas e minúsculas fosse permitida, o uso
war PEACE FREEDOM slavery IGNORANCE strength
com o módulo 6 levaria a um hash perfeito.Teste
Mostrar snippet de código
fonte
z
e, em seguida, compactando a string comatob
economiza 8 bytes?atob
você obtém uma string que é na maior parte javascript válido - eventualmente você precisa escapar apenas do `\` e da citação de fechamento. Pode ser difícil publicá-lo neste site, mas isso não invalida a resposta. Veja a resposta perl de smisGelatina , 24 bytes
Experimente online!
Como funciona
Primeiro, o token
índices no dicionário de Jelly para criar a string
que
Ḳ
divide em espaços para gerar a matriz de stringsµ
inicia uma nova cadeia monádica, com essa matriz de string como argumento, que também é o valor de retorno atual.ɠ
lê uma linha de entrada de STDIN ei
encontra seu índice do valor de retorno anterior, ou seja, a matriz de strings gerada.Agora,
^1
pegue o XOR bit a bit desse índice e 1 . Para índices mesmo - lembre-se que os índices de geléia são um baseado e modular, assim que a força tem índice 1 e ignorância tem índice de 6 / 0 - isto incrementa o índice; para índices ímpares, diminui-os.Por fim,
ị
recupera a sequência nesse índice a partir do argumento da cadeia.fonte
Mathematica, 84 bytes
Explicação
Mais "aritmética" com cordas! Como na resposta vinculada, isso se baseia no fato de que você pode "multiplicar" cadeias no Mathematica, o que as deixará sem avaliação (semelhante à multiplicação de duas variáveis não atribuídas
x*y
), mas o Mathematica aplicará simplificações básicas, como fatores de cancelamento em uma divisão.Então, vamos começar por armazenar os três pares de produtos
x
,y
,z
, respectivamente, e multiplicá-los todos juntos:Isso avalia como
(O Mathematica classifica automaticamente os fatores, mas não nos importamos com o pedido.)
Dividimos isso pela entrada para remover a palavra com a qual não queremos
.../#
, pois o Mathematica cancela os fatores. Por exemplo, se a entrada fosse"peace"
, teríamos:Finalmente, se livrar dos pares que não está interessado, substituindo cada um
x
,y
ez
com1
. Novamente, a simplificação do Mathematica1*a
é sempre assima
. Esta parte é feita com:O bom é que o Mathematica sabe que a multiplicação é
Orderless
assim, e isso encontrará os dois fatores, independentemente de serem adjacentes ao produto ou não. Somente a palavra oposta à entrada não é mais emparelhada no produto, para que não seja removida e permaneça como a única saída.fonte
WordList[][[<|"l"->14007,"t"->17083,"a"->25105,"r"->32106,"g"->33790,"e"->39048|>@#[[2]]]]&
.WordList
é legal. Pegar uma lista de caracteres como entrada e retornar uma string parece um pouco complicado. ;) Dito isto, você pode fazer 4 bytes melhor comx[[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
Experimente online! no intérprete V compatível com versões anteriores.
Obviamente, se mudarmos para V, poderemos salvar um byte usando um método de entrada mais conveniente. Mas como essa é uma diferença tão pequena, prefiro usar a versão que não seja de golfe.
Explicação:
fonte
C (gcc) ,
120107 bytesMáximo abuso de ponteiro! Requer uma máquina little-endian e comprimentos de 64 bits.
O código contém alguns não imprimíveis, mas a cópia e colagem ainda deve funcionar.
Experimente online!
fonte
Python, 81 bytes
Ou mesmo comprimento:
fonte
l
como um argumento opcional.Perl 6 , 61 bytes
Com caracteres não imprimíveis mostrados como (porque o StackExchange os retira do contrário):
Aqui está um
xxd
dump hexadecimal:Versão expandida (caracteres não imprimíveis substituídos por seqüências de escape e espaço em branco e comentários adicionados):
fonte
Bash ,
100878678 bytesExperimente online!
A segunda letra de cada palavra identifica exclusivamente essa palavra, então eu uso esse caractere como um nome de variável; o valor dessa variável é a outra palavra correspondente.
Por exemplo, a segunda letra de
peace
ée
e a palavra correspondente apeace
éwar
, então eu definoe=war
.Dada uma string de entrada, o segundo caractere dessa string é usado como um nome de variável para exibir a palavra correspondente desejada, usando a expansão indireta dos parâmetros do bash.
fonte
TI-Basic,
1038477 bytesReduzir para uma linha economizou muitos bytes!Haha, como essa afirmação foi irônica ...fonte
Perl , 63 bytes
62 bytes +
-p
sinalizador.Experimente online!
ord
retorna o código de caractere do primeiro caractere da palavra de entrada.Após o
%6
, temos:Portanto, temos
slavery
estrength
retornamos 1 (já que ambos começam com a mesma letra), e nenhum retornando 2. Portanto, adicionamos1
forstrength
(é a única palavra que corresponderá/h/
) e cada uma delas será mapeada para um índice de 0 a 5)fonte
R, 86
8792BytesAlterado para uma função sem nome e
gsub
parasub
por alguns bytes. Osgrep
determina qual das cordas 3 é usado e a entrada é removida da cadeia comsub
.fonte
PHP, 70 bytes
fonte
Befunge,
8988 bytesExperimente online!
Explicação
Começamos colocando todas as seqüências de saída possíveis na pilha, terminadas em nulo. Essa sequência é executada da direita para a esquerda, para que os valores sejam pressionados ao contrário, pois essa é a ordem em que os caracteres serão necessários quando forem exibidos.
Em seguida, lemos os dois primeiros caracteres do stdin, o que é tudo o que precisamos para identificar a string de entrada. Se pegarmos o valor ASCII da primeira letra mod 2, mais a segunda letra mod 7, obteremos um número único no intervalo de 2 a 7.
Esse número pode ser usado como um tipo de índice na lista de cadeias na pilha. Nós decrementamos iterativamente o índice (a primeira vez em 2) e, para cada iteração, limpamos uma sequência da pilha com a sequência
>_
.Quando o índice chega a zero, ficamos com a string de saída correta no topo da pilha, então usamos uma sequência simples de saída de string para gravar o resultado em stdout.
fonte
:-<
e@>:#
"smileys" aqui :)Pyke, 29 bytes
Experimente aqui!
fonte
C, 93
A resposta de @ Arnauld foi portada para C
fonte
C (gcc) ,
113108 bytesTodas as instâncias de
\0
podem ser substituídas por bytes NUL reais para fins de pontuação.t+*--t-47
é um comportamento indefinido; isso pode / não irá funcionar com outros compiladores.Experimente online!
fonte
JavaScript (ES6), 71
78Tão chato que a resposta de Arnauld, mas mais curto também.
Agora eu adicionei a codificação com
btoa
. Na string codificada, existem 4 bytes que não posso postar neste site, mesmo que sejam caracteres válidos em uma string javascript. Então eu usei um escape hexadecimal no formulário\xHH
. Cada uma dessas escapes é contada como 1 byte.A cadeia codificada é
strength0ignorance0peace0war0slavery0freedom
Este é 82 e não diferencia maiúsculas de minúsculas
Teste
fonte
CJam, 52 (apenas ASCII)
Experimente online
Nota: as coisas que parecem espaço são caracteres de tabulação (um antes e outro depois de "EK {")
Explicação:
A parte até "+" está descompactando a sequência "slaveryjfreedomjwarjpeacejignorancejstrength", usando a conversão base:
string (tratada como matriz de códigos de caracteres) → (base 144) número → (base 26) número → (base 26) matriz de números → (adicionando 'a' a cada número) sequência
fonte
> <> (Peixe),
8478 bytesExperimente online!
Começamos a nadar a partir do canto superior esquerdo, indo para a direita. Primeiro, carregamos a pilha com um 0. Em seguida, lemos a primeira letra da entrada (
i
), descartamos (~
), lemos a segunda letra (i
) e reduzimos seu valor ASCII módulo 10 (a%
). Isso mapeia a, e, r, l, ge t para 7, 1, 4, 8, 3 e 6, respectivamente - vamos chamar esse número N..
exibe dois valores da pilha - N e 0 - e salta para linha N, caractere 0.Após um salto, o peixe prossegue um tiquetaque antes de executar as instruções, por isso ignora o primeiro caractere e nada pela linha N, que carrega a palavra correspondente na pilha. Finalmente, vamos para a linha 2, que gera toda a pilha e sai.
fonte
JavaScript, 78 bytes
Este é um tipo de porta da minha resposta Python . Armazenamos as palavras em uma sequência em que cada uma está na posição oposta à sua contraparte. Encontramos o índice da palavra dada
w
e obtemos esse índice no final, para retornar o resultado.Snippet de teste:
fonte
Pari / GP, 86 Byte
Pari / GP é um intérprete interativo, não precisamos de um "print" -cmd para a saída; no entanto, o utilitário Try-It_Online precisa de um "print" -cmd, então separei isso para o "rodapé".
Definimos uma "função-objeto" (a letra O me lembra muito a função Orwell ... ;-)):
Depois disso, ligue
Experimente online!
(Observe que, no Pari / GP, os tokens fornecidos aqui não são cadeias, mas nomes de variáveis legais! Essas variáveis nunca devem ter nenhum valor atribuído)
fonte
Empilhados, 70 bytes
Experimente aqui! Recebe entrada na pilha e deixa a saída na pilha. Por exemplo:
Este código é bastante auto-explicativo. Ligeiramente modificado para executar todos os casos de teste:
fonte
'LF
faz?@x
define uma variável,'...'
é uma string, eLF
é a variável de avanço de linhaJolf, 35 bytes
Existem muitos imprimíveis. Aqui está um hexdump, embora não faça muito bem:
Aqui está um link online.
Basicamente, o código se parece com:
fonte
Na verdade , 56 bytes
Experimente online!
Infelizmente, sem nenhum componente de compactação, é mais curto não compactar a string e descompactá-la manualmente.
Explicação:
fonte
Haskell, 104
111bytesIdéia:
fromEnum
, mova 3 etapas para a direita (módulo 6) e converta novamente para a palavra-chave::O
é necessária porque a inferência de tipo tem alguns problemas. Darf
uma assinaturaf :: O -> O
teria o mesmo efeito, mas não é tão curto.Editar:
Substituído
por
graças a @Laikoni.
fonte
f
é mais curto:f s=toEnum$mod(3+fromEnum s)6
Dyalog APL , 66 bytes
Qualquer um destes:
'slavery' 'freedom' 'ignorance' 'strength' 'war' 'peace'⊃⍨6|⎕UCS⊃⍞
usa esse método (requer o⎕IO←0
padrão em muitos sistemas).'strength' 'freedom' 'war' 'peace' 'slavery' 'ignorance'(⍳⊃(⌽⊣))⊂⍞
faz uma pesquisa e escolhe o elemento correspondente da lista invertida.fonte
Qbasic,
13899 bytesD$
armazena todas as palavras do lado esquerdo do mantra, depois todas as do lado direito. Cada palavra é preenchida com espaços para exatamente 9 letras por palavra.D$
depois é anexado a si mesmo.Em seguida,
instr
é usado para encontrar o índice da palavra inserida pelo usuário. A outra parte do mantra é sempre armazenada exatamente 9 * 3 posições ainda mais na cadeia, por isso imprimimos uma substring começando nessa posição, tendo 9 caracteres.fonte
SmileBASIC, 92 bytes
fonte
Python , 80 bytes
De alguma forma superou o xnor!
Essa é uma função lambda sem nome, que retorna o resultado.
Experimente online!
A lista de palavras é organizada de modo que cada uma esteja na posição oposta à sua contraparte. Dada a palavra
w
, encontramos seu índice na lista de palavras e, em seguida, bit a bit NOT (~
). Isso vira todos os bits, que são computadosn => -n-1
. Devido à indexação negativa do Python, obtém o índice oposto na lista.Como uma espécie de bônus não intencional, você pode passar qualquer lista de palavras opostas para essa função como o segundo argumento.
fonte