Duas cadeias são "equivalentes a César" se a distância (contando) entre os caracteres correspondentes for a mesma. Sim, eu inventei esse termo. Aqui está um exemplo:
"Abc" e "Cde" são equivalentes porque
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
A capitalização não faz diferença.
"Olá" e "Mundo" não são equivalentes a César porque
distance from h-w == 15
distance from e-o == 10
distance from l-r == 6
distance from l-l == 0
distance from o-d == 15
"Abcd" e "Yzab" são equivalentes a César porque
distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24
Você deve escrever um programa completo que use duas strings de STDIN e imprima um valor verdadeiro, se eles forem equivalentes a César, e um valor falso, se não forem.
Entrada válida
Como a capitalização não importa, é aceitável que o seu programa exija que a entrada seja minúscula, maiúscula ou qualquer combinação desejada, desde que isso seja especificado em sua resposta.
A entrada não terá espaços ou pontuação.
As entradas terão o mesmo comprimento.
Respostas:
Pitão, 9 bytes
As duas seqüências são esperadas em minúsculas, nova linha separada.
Demonstração.
Como funciona:
.r
é a função de translação rotativa de Pyth. Ele mapeia cada elemento no primeiro argumento, desde sua primeira ocorrência no segundo argumento até a próxima entrada no segundo argumento. Nesse caso, o segundo argumento éG
o alfabeto em minúsculas, portanto, isso é equivalente a um deslocamento de César de 1.Colocar um
=
na frente da função a coloca no lugar. Assim,=.rzG
atribui o deslocamento de César dez
um az
. Observe quez
é inicializado na primeira linha de entrada no Pyth.Essa expressão é usada dentro de um mapa.
m=.rzGG
aplica essa transformação az
26 vezes, uma vez para cada elemento deG
, e salva os resultados em uma lista. Isso fornece a lista de todos os turnos possíveis de Césarz
.Por fim,
}w
verifica se a próxima linha de entrada está nessa lista.fonte
CJam,
171211 bytes1 byte salvo por Dennis.
Teste aqui.
Espera que a primeira string seja minúscula e a segunda maiúscula. Imprime
1
para seqüências equivalentes a César e0
outras.Explicação
A razão pela qual exigimos a primeira string em minúscula e a segunda em maiúscula é garantir que a diferença seja sempre positiva. Caso contrário, tomar o módulo pode retornar algo negativo e não seria necessariamente único, mesmo para seqüências equivalentes a César.
fonte
26f%
para salvar um byte.!
eu não teria 0 ou 1, mas uma matriz vazia ou não vazia.Python2,
68677069 BytesPython3,
6766 bytesÉ um pouco difícil de ser jogado, então apenas explique as peças:
zip(*raw_input().split())
pega a entrada, divide-a em uma lista de duas palavras, assumindo que as palavras sejam separadas por espaços em branco. Depois disso, cada palavra é passada como parâmetro dazip
função, pelo uso do*
operador. Azip
função criará uma lista de pares de letras, para letras na mesma posição.(ord(y)-ord(x))%26for x,y in ...
Isso apenas transforma a lista de 2 letras em uma expressão geradora das distâncias entre essas letras.{...}
reduz essa expressão a um conjunto, basicamente descartando duplicataslen(...)<2
verifica se existe apenas um item no conjunto (ou 0 para cadeias vazias), o que significa essencialmente que todas as letras tinham a mesma distância.print
gera esse valorObrigado ao xnor por me lembrar que
set(...)
pode ser substituído{...}
e o espaço anteriorfor
não é necessário. Também graças ao Josay para<=1
a<2
otimização.fonte
<=1
para '<2'.{...}
vez deset((...))
. Seu código precisa realmente imprimir o resultado.lambda
para economizar na gravaçãoprint
oureturn
.for
; o lexer Python se divide corretamente26for
.APL (15)
Ele precisa que as letras estejam em maiúsculas e imprima uma
1
ou mais ou0
menos:Explicação:
↑⍞⍞
: leia duas linhas do teclado e organize os caracteres em uma matriz N × 2.⎕A⍳
: para cada caractere, encontre em qual posição ele ocorre⎕A
(o alfabeto maiúsculo).-⌿
: para cada coluna, subtraia o segundo valor do primeiro valor26|
: pegue o mod-26 de cada um desses números.≢∪
: encontre o número de valores exclusivos na lista1=
: compare isso com1
.fonte
J, 19 bytes
Letras na mesma posição devem ter o mesmo caso.
Depois de converter as duas cadeias de entrada em sua representação de ponto de código
&(3&u:)
, comparamos1
com o comprimento#
do nó~.
do módulo 2626|
da diferença-
das duas matrizes. O problema será1
se todas as distâncias de César forem iguais.Uso:
Experimente online aqui.
fonte
Julia,
918783 bytesUngolfed + explicação:
Isso tira vantagem do fato de que seqüências de caracteres em Julia podem ser tratadas como matrizes de caracteres e que operações aritméticas podem ser executadas em valores de caracteres. As cadeias de entrada podem ter qualquer combinação de letras maiúsculas, desde que a capitalização em cada posição corresponda entre as seqüências.
fonte
C99,
92 bytes com bug10192 bytesBem direto; assume que as palavras vêm como primeiro e segundo argumentos, respectivamente. Compilado com
-std=c99
.fonte
Javascript ( ES7 Draft ), 87 bytes
Requer entradas para ser o mesmo caso.
fonte
CJam, 13 bytes
Requer que o primeiro caractere de cada palavra esteja em maiúscula, outros em minúscula.
Experimente aqui . ( Firefox aqui .)
Pena que as variantes APL não suportam aritmética de caracteres ...
Explicação
fonte
Perl, 80
Editar : uma falha na otimização caiu no código do golfe. Agora, ele combina com a versão não destruída. (A contagem de bytes estava correta, no entanto.)
Execute com Perl versão 5.10 (
perl -M5.10.0
ouperl -E …
) parasay()
. Versão ligeiramente expandida:O código gera
1
(verdade em Perl) se as seqüências de caracteres forem equivalentes a César, e a sequência vazia (falsy em Perl), se não forem. Se essa interpretação for muito flexível, preciso adicionar 2 bytes parasay$p+0
, que imprime1
ou0
.O caso do caractere deve corresponder entre as entradas.
fonte
-i
a tomar na segunda corda, que seria armazená-lo na variável$^I
. Além disso, usar em-E
vez de-e
executar na linha de comando o levarásay
gratuitamente, para que você possa usá-lo sem adicionar bytes. Tente executar o seguinte:perl -iteststring -E'say$^I'
você pode reduzi-lo com o-i
truque.-i
truque é legal (e eu não sabia!). Nesse caso, não acho que ajude porque$^I
é mais longo que<>
.-M5.10.0
qualquer maneira. (Mas eu mencionei o-E
interruptor na edição)Matlab,
4948 bytesEssa foi realmente rápida. Infelizmente, obter uma string de stdin é bastante caro.
Observe que, como a maioria, senão todas as respostas, diferencia maiúsculas de minúsculas.
Edição: raspou um byte, definindo uma função anônima!
fonte
Prolog, 56 bytes
Nem todas as combinações de casos são suportadas.
uso
Experimente online aqui
fonte
C, 97 bytes
fonte
d
e declarara
o tipo fora dos parâmetros como este:d,r;main(int c,char**a){
→r;main(d,a)char**a;{
Scala, 57 bytes
Pouco mais que os outros, e essencialmente equivalente, mas está em um estilo de linguagem diferente!
Eu também tenho esta versão (56 bytes):
Mas eu não sei se x $ 1 de trabalho é coincidência ou por design ...
fonte
x$1
funciona semx
nunca ser definido?Python 2, 80 bytes
Pega 2 seqüências de caracteres semelhantes de stdin separadas por um espaço:
Testado nos seguintes casos de teste:
fonte
Python 2 -
241237188147 BytesRecebe a entrada como uma sequência minúscula entre aspas, com espaço separado. Tem que haver uma maneira melhor ..
Ungolfed (260 bytes ímpares)
fonte
"
s extras em sua entrada.R, 83
84Praticamente o mesmo que as outras soluções. Converta as seqüências de caracteres em um vetor de números inteiros. Modifique a diferença dos vetores em 26. Faça um único sobre a lista, pois verifique se o comprimento é 1. Ele espera que o caso seja o mesmo nos caracteres correspondentes em cada sequência.
Espera que as duas cadeias sejam inseridas
fonte
<2
vez de==1
.1
0
Matlab / Octave,
5352A entrada deve ser do mesmo caso.
Infelizmente, o Matlab não é muito bom com a entrada do usuário. Como um identificador anônimo, isso pode ter apenas 35 bytes:
O Matlab trata os caracteres de uma string como um vetor de números. Fazer subtração nos faz a diferença e
unique
converte esse vetor em um vetor que contém apenas valores únicos. Se houver apenas um número, as palavras serão equivalentes a maiúsculas e o retorno isscalar 1, caso contrário, retornará 0.fonte
festança,
7148Usando o programa Unix "padrão"
caesar(6)
.Nova versão (com muita ajuda do @DigitalTrauma):
1
para verdadeiro ou nada para falso.Se a entrada via argumentos da linha de comando for permitida, ela poderá ser reduzida para 39 bytes :
Versão antiga para o registro:
fonte
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
O resultado está na$?
variável interna, onde 0 == FALSE e 1 == TRUE, conforme a semântica padrão do shell.seq -f | bash
pouco. O resultado$?
não é válido pela minha leitura do desafio, mas, assim como meu código, o seu não gera nada para falso e algo para verdadeiro (exceto no caso limítrofe de duas seqüências de entrada vazias). Enfim, seria uma trapaça usar tudo isso na minha resposta, talvez você deva enviar a sua própria.[ 0 == 0 ] ; echo $?
and[ 0 == 1 ] ; echo $?
> <> (Peixe) , 50 bytes
Espera que as letras na mesma posição tenham o mesmo caso.
Explicação
i:3b*(?v
lê a primeira palavra na pilha88+0.
fornecendo o salto em loop~ri-&
remove~
o espaço de separação da pilha, inverte a pilhar
(a primeira letra estará no topo), lê a primeira letra da segunda palavrai
, calcula o deslocamento da primeira letra da primeira palavra-
e a armazena no registro&
.l?!^i-&:&-2d*%0)?v
lê cada letra seguinte da segunda palavra, subtraindo-a da letra correspondente da primeira palavra, que está no topo da pilha, substratos o deslocamento&:&-
armazenado no registro e verifica se o resultado é 0 mod 262d*%
. Caso contrário, imprime 0 e termina0n;
.c1.
fornece o salto em loop.1n;
.fonte
KDB (Q), 35 bytes
Explicação
Teste
fonte
Java 281
expandido:
Eu poderia economizar 14 bytes se me livrasse da conversão de tudo para maiúsculas, mas acho que é mais completo deixá-lo.
fonte
Geléia , 5 bytes
Experimente online!
Emite um número inteiro positivo para equivalente, 0 caso contrário
Como funciona
fonte