Dos cadenas son "César equivalente" si la distancia (contando) entre los caracteres correspondientes es la misma. Sí, inventé este término. Aquí hay un ejemplo:
"Abc" y "Cde" son equivalentes porque
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
La capitalización no hace ninguna diferencia.
"Hola" y "Mundo" no son equivalentes al 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" son equivalentes de 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
Debe escribir un programa completo que tome dos cadenas de STDIN e imprima un valor verdadero si son equivalentes a César y un valor falso si no lo son.
Entrada válida
Dado que las mayúsculas no importan, es aceptable si su programa requiere que la entrada sea en minúsculas, mayúsculas o cualquier combinación que desee, siempre que esto se especifique en su respuesta.
La entrada no tendrá espacios ni signos de puntuación.
Las entradas serán de la misma longitud.
Respuestas:
Pyth, 9 bytes
Las dos cadenas se esperan en minúsculas, separadas por una nueva línea.
Demostración.
Cómo funciona:
.r
es la función de traducción rotatoria de Pyth. Mapea cada elemento en el primer argumento desde su primera aparición en el segundo argumento hasta la siguiente entrada en el segundo argumento. En este caso, el segundo argumento esG
, el alfabeto en minúsculas, por lo que es equivalente a un desplazamiento César de 1.Poner un
=
en frente de la función lo hace en su lugar. Por lo tanto,=.rzG
asigna el desplazamiento César dez
por uno az
. Tenga en cuenta quez
se inicializa en la primera línea de entrada en Pyth.Esta expresión se usa dentro de un mapa.
m=.rzGG
aplica esta transformación az
26 veces, una vez para cada elemento deG
, y guarda los resultados en una lista. Esto proporciona la lista de todos los posibles cambios de Césarz
.Finalmente,
}w
verifica si la siguiente línea de entrada está en esa lista.fuente
CJam,
171211 bytes1 byte guardado por Dennis.
Pruébalo aquí.
Espera que la primera cadena sea minúscula y la segunda sea mayúscula. Imprime
1
para cadenas equivalentes a César y de0
otra manera.Explicación
La razón por la que requerimos la primera cadena en minúsculas y la segunda en mayúsculas es para garantizar que la diferencia sea siempre positiva. De lo contrario, tomar el módulo podría devolver algo negativo y no sería necesariamente único, incluso para cadenas equivalentes a César.
fuente
26f%
para guardar un byte.!
no tendría 0 o 1 sino una matriz vacía o no vacía.Python2,
68677069 BytesPython3,
6766 bytesEs un poco difícil deshacerse del golf, así que solo explicando las piezas:
zip(*raw_input().split())
toma la entrada, la divide en una lista de dos palabras, suponiendo que las palabras estén separadas por espacios en blanco. Después de eso, cada palabra se pasa como un parámetro de lazip
función, mediante el uso del*
operador. Lazip
función creará una lista de pares de letras, para letras en la misma posición.(ord(y)-ord(x))%26for x,y in ...
Esto solo transforma la lista de 2 letras en una expresión generadora de las distancias entre esas letras.{...}
reduce esta expresión a un conjunto, esencialmente tirando duplicadoslen(...)<2
comprueba si solo queda un elemento en el conjunto (o 0 para cadenas vacías), lo que esencialmente significa que todas las letras tenían la misma distancia.print
produce ese valorGracias a xnor por recordarme
set(...)
se puede reemplazar{...}
yfor
no se requiere el espacio anterior . También gracias a Josay para el<=1
de<2
optimización.fuente
<=1
a '<2'.{...}
lugar de hacerloset((...))
. Su código necesita realmente imprimir el resultado.lambda
para ahorrar en escrituraprint
oreturn
.for
; Python lexer se divide correctamente26for
.APL (15)
Necesita que las letras sean mayúsculas, y se imprime
1
o0
, así:Explicación:
↑⍞⍞
: lee dos líneas desde el teclado y organiza los caracteres en una matriz N × 2.⎕A⍳
: para cada carácter, encuentre en qué posición se encuentra⎕A
(el alfabeto en mayúsculas).-⌿
: para cada columna, reste el segundo valor del primer valor26|
: tome el mod-26 de cada uno de esos números.≢∪
: encuentra el número de valores únicos en la lista1=
: compara eso con1
.fuente
J, 19 bytes
Las letras en la misma posición deben tener el mismo caso.
Después de convertir ambas cadenas de entrada a su representación de punto de código con
&(3&u:)
, comparamos1
con la longitud#
de la protuberancia~.
del módulo 2626|
de la diferencia-
de las dos matrices. La protuberancia será1
si todas las distancias César son iguales.Uso:
Pruébelo en línea aquí.
fuente
Julia,
918783 bytesUngolfed + explicación:
Esto aprovecha el hecho de que las cadenas en Julia se pueden tratar como matrices de caracteres y que las operaciones aritméticas se pueden realizar en valores de caracteres. Las cadenas de entrada pueden tener cualquier combinación de mayúsculas que desee, siempre que la capitalización en cada posición coincida entre las cadenas.
fuente
C99,
92 bytes con error10192 bytesMuy claro; asume que las palabras vienen como primer y segundo argumento, respectivamente. Compilado con
-std=c99
.fuente
Javascript ( borrador ES7 ), 87 bytes
Requiere entradas para ser el mismo caso.
fuente
CJam, 13 bytes
Requiere que el primer carácter en cada palabra esté en mayúscula, otros en minúscula.
Probar aquí . ( Firefox aquí ).
Lástima que las variantes APL no sean compatibles con la aritmética de personajes ...
Explicación
fuente
Perl, 80
Editar : una optimización fallida se había deslizado en el código de golf. Ahora coincide con la versión sin golf. (Sin embargo, el recuento de bytes fue correcto).
Ejecutar con Perl versión 5.10 (
perl -M5.10.0
operl -E …
) parasay()
. Versión ligeramente expandida:El código genera
1
(verdad en Perl) si las cadenas son equivalentes a César, y la cadena vacía (falso en Perl) si no lo son. Si esta interpretación es demasiado floja, necesito agregar 2 bytes parasay$p+0
, que imprime1
o0
.El caso de los caracteres debe coincidir entre las entradas.
fuente
-i
para tomar la segunda cadena, que la almacenaría en la variable$^I
. Además, el uso en-E
lugar de-e
cuando se ejecuta en la línea de comando lo conseguirásay
de forma gratuita, por lo que puede usarlo sin agregar bytes. Intenta ejecutar esto:perl -iteststring -E'say$^I'
es posible que puedas acortar esto con el-i
truco.-i
truco es bueno (¡y no lo sabía!). En este caso no creo que ayude porque$^I
es más largo que<>
.-M5.10.0
todos modos. (Pero mencioné el-E
cambio en la edición)Matlab,
4948 bytesEsta fue muy rápida. Lamentablemente, obtener una cadena de stdin es bastante costoso.
Tenga en cuenta que, como la mayoría de las respuestas, si no todas, distingue entre mayúsculas y minúsculas.
EDITAR: ¡afeitado un byte definiendo una función anónima!
fuente
Prólogo, 56 bytes
No todas las combinaciones de casos son compatibles.
uso
Pruébalo en línea aquí
fuente
C, 97 bytes
fuente
d
y declaraa
el tipo fuera de parámetros como este:d,r;main(int c,char**a){
→r;main(d,a)char**a;{
Scala, 57 bytes
Poco más que los demás, y esencialmente equivalente, ¡pero tiene un estilo de lenguaje diferente!
También tengo esta versión (56 bytes):
Pero no sé si el trabajo x $ 1 es una coincidencia o por diseño ...
fuente
x$1
funciona sinx
ser definido?Python 2, 80 bytes
Toma 2 cadenas de caracteres similares de stdin separadas por un espacio:
Probado en los siguientes casos de prueba:
fuente
Pitón 2 -
241237188147 BytesToma la entrada como una cadena en minúsculas entre comillas, separadas por espacios. Tiene que haber una mejor manera..
Sin golf (260 bytes impares)
fuente
"
s adicionales en su entrada.R, 83
84Bastante más o menos lo mismo que las otras soluciones. Convierte las cadenas en un vector de enteros. Modifique la diferencia de los vectores por 26. Haga un único sobre la lista ya que verifique que la longitud sea 1. Se espera que el caso sea el mismo en los caracteres correspondientes en cada cadena.
Espera a que se ingresen las dos cadenas
fuente
<2
lugar de==1
.1
0
Matlab / Octave,
5352La entrada debe ser del mismo caso.
Lamentablemente, Matlab no es muy bueno con la entrada del usuario. Como identificador anónimo, esto podría tener solo 35 bytes:
Matlab trata los caracteres de una cadena como un vector de números. Hacer resta nos da su diferencia y
unique
convierte ese vector en un vector que contiene solo valores únicos. Si solo hay un número, las palabras son equivalentes de césar y isscalar devuelve 1; de lo contrario, devolverá 0.fuente
bash,
7148Usando el programa "estándar" de Unix
caesar(6)
.Nueva versión (con mucha ayuda de @DigitalTrauma):
1
para verdadero o nada para falso.Si se permite la entrada a través de argumentos de línea de comando, se puede acortar a 39 bytes :
Versión antigua para el registro:
fuente
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
el resultado está en la$?
variable integrada, donde 0 == FALSO y 1 == VERDADERO, según la semántica de shell estándar.seq -f | bash
bit. El resultado$?
no es válido al leer el desafío, pero al igual que mi código, el suyo no genera nada falso y algo verdadero (excepto en el caso límite de dos cadenas de entrada vacías). De todos modos, se sentiría como una trampa usar todo esto en mi respuesta, tal vez deberías enviar la tuya.[ 0 == 0 ] ; echo $?
y[ 0 == 1 ] ; echo $?
> <> (Pescado) , 50 bytes
Espera que las letras en la misma posición tengan el mismo caso.
Explicación
i:3b*(?v
lee la primera palabra en la pila al88+0.
proporcionar el salto en bucle~ri-&
elimina~
el espacio de separación de la pila, invierte la pilar
(la primera letra estará en la parte superior), lee la primera letra de la segunda palabrai
, calcula el desplazamiento de la primera letra de la primera palabra-
y la almacena en el registro&
.l?!^i-&:&-2d*%0)?v
lee cada letra siguiente de la segunda palabra restándola de la letra correspondiente de la primera palabra que está en la parte superior de la pila resta el desplazamiento&:&-
almacenado en el registro y comprueba si el resultado es 0 mod 262d*%
. Si no imprime 0 y termina0n;
.c1.
proporciona el salto en bucle.1n;
.fuente
KDB (Q), 35 bytes
Explicación
Prueba
fuente
Java 281
expandido:
Podría ahorrar 14 bytes si me deshago de convertir todo a mayúsculas, pero siento que es más completo dejarlo.
fuente
Jalea , 5 bytes
Pruébalo en línea!
Emite un entero positivo para equivalente, 0 de lo contrario
Cómo funciona
fuente