Introducción
El Enigma fue una de las primeras máquinas de cifrado de rotor electromecánico utilizadas en la Segunda Guerra Mundial. Eso significa que después de que se codifica una sola letra, cambiaría la clave para la siguiente letra. Esto fue considerado irrompible por los alemanes, debido al enorme espacio clave. Incluso la fuerza bruta era casi imposible. Sin embargo, hubo un error de diseño en el Enigma. Cifrar una carta nunca resultaría en sí mismo. Eso significa que la letra A
puede cifrarse en cada letra, excepto la letra A
.
Tomemos un ejemplo de un mensaje codificado:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
Una palabra típica alemana era WETTERBERICHT
, o informe meteorológico en inglés. Con el principio anterior, podemos determinar en qué lugares la palabra podría ser:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Esto no es posible, porque I
no se puede cifrar a sí mismo, por lo que nos movemos en 1 lugar:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Esto tampoco es posible, así que nos mudamos de nuevo a otro lugar:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Esto nuevamente no es posible. De hecho, la primera posible aparición de WETTERBERICHT
es:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
^
13
Entonces, devolvemos la posición indexada a 0 de la primera ocurrencia posible, que es 13 .
La tarea
- Dado un mensaje codificado y una palabra, encuentre el índice de la primera ocurrencia posible .
- Suponga que solo se usarán caracteres alfabéticos en mayúsculas básicos (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
). - Si no se encuentra ninguna ocurrencia, puede generar cualquier número entero negativo , carácter o nada (por ejemplo
-1
,X
). - La entrada puede aceptarse como argumento, en líneas nuevas separadas, listas o cualquier otra cosa.
- Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
Casos de prueba
Input: BHGEFXWFTIUPITHHLPETTTCLOEWOELM, WETTERBERICHT
Output: 13
Input: ABCDEFGHIJKL, HELLO
Output: 0
Input: EEEEEEEEEEEE, HELLO
Output: -1
Input: XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF, DEUTSCHLAND
Output: 11
Input: HKKH, JJJJJ
Output: -1
E
nunca resultaría en unE
. De eso se trata todo este desafío.Respuestas:
Pyth, 14 bytes
No estoy seguro de si esto está bien, pero si la entrada es imposible, no se escribe nada en stdout y se escribe un error de división cero en stderr. Toma la entrada en 2 líneas, la segunda está rodeada de comillas.
Explicación:
Pruébalo aquí!
fuente
JavaScript, 40
Utilizando
replace
, esto asigna la entrada de texto sin formato en una expresión regular de forma/[^H][^E][^L][^L][^O]/
(por ejemplo, para la entrada de texto sin formatoHELLO
) y luego usasearch
para probar el primer índice de la subcadena de texto cifrado que coincide con esa expresión regular. Esta expresión regular significa "un patrón donde el primer carácter no esH
, el segundo carácter no lo esE
, etc."$&
es una secuencia especial para lareplace
salida que sustituye el valor que coincide con el primerreplace
argumento (en este caso, cada uno de los caracteres coincide con/./
).fuente
$&
! Gracias por enseñarme algo hoy.$'
en el proceso de investigar esta respuesta, que proporciona" la porción de la cadena que precede / sigue a la subcadena coincidente "Turing Machine Simulator - 15660 bytes (no competidor)
No se puede tener un desafío Enigma sin configurar el código de máquina.
Pruébalo aquí
Breve descripción:
fuente
SWI-Prolog, 115 bytes
Ejemplo de uso:
a(`ABCDEFGHIJKL`,`HELLO`,R).
. Esto utiliza las cadenas de códigos de caracteres declaradas con backticks. La respuesta está unificada conR
. Si no se encuentra ninguna coincidencia, esto generafalse.
.Explicación:
Pruébalo aquí
fuente
Ruby,
9179 bytes¡Maldito seas
Enumerator
! ¿Por qué tengo que convertir de cadena en matriz a Enumerator en matriz y desperdiciar bytes preciosos? > :(fuente
[*...]
como una alternativa de golf a #to_a es un buen toque.CJam,
1716 bytesPruébalo aquí .
Gracias a @PeterTaylor por guardar un byte.
Explicación:
fuente
array block #
puede ahorrarte un char:ll:A,ew{A.=:+!}#
ew
(hacer cortes), todo lo demás simplemente sigue.MATL , 27 bytes
Ejemplos
Explicación
fuente
Haskell, 72 bytes
Uso:
h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"
->11
.Enfoque recursivo simple: si la palabra
w
se puede colocar al comienzo de la cadenas
, devuelva el contador de índicei
, de lo contrario , repita coni
incremental y la cola des
. Pare y regrese-1
si la longitud des
es menor que la longitud dew
.fuente
Python 2.7, 111 caracteres
Intenta todas las posiciones iniciales (a) y verifica que cualquiera de las letras coincida (usando la comprensión de la lista). Devuelve "Ninguno" ("NULL" de Python) si no se encuentra nada (el bucle for finaliza y no se devuelve nada, que por defecto es "Ninguno".
Banco de pruebas:
fuente
def d(c,s): for a in range(len(c)): if a not in[a+(c+s)[a+i:].index(l)for i,l in enumerate(s)]:return a
Brachylog , 48 bytes
Esta es una traducción directa de mi respuesta de Prolog. El
brachylog_main/2
predicado generado espera una lista de cadenas de códigos de dos caracteres con la cadena codificada primero como entrada y devuelve el índice como salida, por ejemplobrachylog_main([`ABCDEFGHIJKL`,`HELLO`],R).
.Explicación
fuente
Japt, 12 bytes (no competitivo)
Necesitaré ayuda con este.
fuente
.search
? facepalmUàVr'."[^$&]
por 12.PHP - 155 bytes
Guardar como
crack.php
y ejecutar con los argumentos en la línea de comando. P.ej:fuente
for($r=-1;$i<strlen($p=$argv[1])-$l=strlen($q=$argv[2]);$i++)if(levenshtein($q,substr($p,$i,$l),2,1,2)==$l&&$r=$i)break;echo"$r↵";
levenshtein
, pero probablemente una iteración directa dentro de una iteración podría hacerlo en menos bytes.JavaScript,
129121118119 *118 bytesw
es el mensaje codificado,t
es la cadena de prueba. Esto no usa expresiones regulares, sino que solo compara letra por letra, desplazando la cadena de prueba (es decir, "WETTERBERICHT") agregando espacio antes. Fácil y aburrido.* el caso de prueba sin coincidencia no funcionó, ahora sí
fuente
𝔼𝕊𝕄𝕚𝕟, 14 caracteres / 25 bytes
Try it here (Firefox only).
Felicitaciones a @apsillers por la idea.
Explicación
fuente
TeaScript, 14 bytes
20Al igual que en @aspillers JavaScript ingeniosa solución .
No compite porque esto usa características hechas después de este concurso.
Explicación
fuente
$&
No funciona en lugar de${l}
?Ruby,
4336 byteseditar: interpolación de cadenas dentro de la interpolación de cadenas dentro de una expresión regular, yikes.
El enfoque perezoso: traduce la palabra a una expresión regular "negativa" - El
=~
operador hace el resto.Prueba:
fuente
Python 3 , 79 bytes
Pruébalo en línea!
fuente
05AB1E , 14 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Jolf , 14 bytes
Pruébalo aquí!
fuente
Perl, 38 + 1 = 39 bytes
donde la entrada se ve así:
Esta es la misma idea que la de JavaScript.
fuente
Java, 136 caracteres
Solución basada en expresiones regulares inspirada en la versión JavaScript de apsillers .
fuente
Brachylog (v2), 16 bytes
Pruébalo en línea!
Brachylog suele ser muy bueno para fallar cuando resolver algo es imposible.
Este no es uno de esos momentos.
(toma la entrada como una lista
[message, word]
. El encabezado lo imprime todo muy bien, pero la salida del predicado real es solo un número si tiene éxito)bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧
parece funcionar igual de bien para el mismo número de bytes.fuente
C ++ (gcc) ,
160153150 bytesPruébalo en línea!
fuente
goto
y sin todos los errores ...Perl 5 , 46 bytes
Utiliza la idea de expresiones regulares de @apsillers.
Pruébalo en línea!
fuente