Introducción:
Tengo un montón de cifrados diferentes almacenados en un documento que una vez compilé cuando era niño, elegí algunos de los que pensé que eran los más adecuados para los desafíos (no demasiado triviales y no demasiado difíciles) y los transformé en desafíos. La mayoría de ellos todavía están en la caja de arena, y todavía no estoy seguro de si los publicaré todos, o solo unos pocos. Pero aquí está el primero de ellos para comenzar.
Un cifrado de computadora cifrará el texto dado en grupos de caracteres 'aleatorios' de un determinado length
. Si dicho grupo contiene un dígito, usará ese dígito para indexar en su propio grupo para el carácter cifrado. Si no hay ningún dígito presente en el grupo, significa que se usa el primer carácter.
Por ejemplo, supongamos que queremos cifrar el texto this is a computer cipher
con una longitud determinada de 5
. Esta es una salida potencial (nota: los números están indexados en 1 en el siguiente ejemplo):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Tomemos algunos grupos como ejemplos para explicar cómo descifrar el grupo:
qu5dt
: Este grupo contiene un dígito5
, por lo que el (1-indexada) quinto carácter de este grupo es el carácter utilizado para el texto descifrado:t
.hprit
: Este grupo contiene ningún dígito, por lo que el primer carácter de este grupo se utiliza implícitamente el texto descifrado:h
.osyw2
: Este grupo contiene un dígito2
, por lo que el (indexada 1) segundo carácter de este grupo es el carácter utilizado para el texto descifrado:s
.
Desafío:
Dado un entero length
y una cadena word_to_encipher
, genera una cadena cifrada aleatoria como se describió anteriormente.
Solo tiene que cifrar dado el length
y word_to_encipher
, por lo que no es necesario crear un programa / función de descifrado también. Sin embargo, podría hacer un desafío de la parte 2 para descifrar en el futuro.
Reglas de desafío:
- Puede suponer
length
que estará en el rango[3,9]
. - Puede suponer
word_to_encipher
que solo contendrá letras. - Puede usar minúsculas o mayúsculas (indique cuál ha utilizado en su respuesta).
- Sus salidas, cada grupo y las posiciones de los dígitos en un grupo (si está presente) deben ser uniformemente al azar . Entonces, todas las letras aleatorias del alfabeto tienen la misma posibilidad de aparecer; la posición de la letra cifrada en cada grupo tiene la misma posibilidad de ocurrir; y la posición del dígito tiene la misma posibilidad de ocurrir (excepto cuando es el primer carácter y no hay ningún dígito presente; y obviamente no puede estar en la misma posición que el carácter cifrado).
- También puede usar dígitos indexados 0 en lugar de 1 indexado. Indique cuál de los dos ha utilizado en su respuesta.
- El dígito
1
(o0
cuando está indexado a 0) nunca estará presente en la salida. Porb1ndh
lo tanto, no es un grupo válido para cifrar el carácter 'b'. Sin embargo,b4tbw
es válida, en donde los4
se cifra losb
en la cuarta posición (1-indexada), y los otros personajesb
,t
,w
son aleatorios (que casualmente también contiene unab
). Otros grupos válidos posibles delength
5 a cifrar el carácter 'b' son:abcd2
,ab2de
,babbk
,hue5b
, etc.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
,ab2de
,babbk
todos iguales? ¿También esb1akk
válido?b1akk
yo diría que no. Lo editará en la descripción del desafío para aclararlo. Si el primer carácter es el cifrado, no debe haber ningún dígito."a??"
tiene 676 resultados posibles, pero"1a?"
,"?a1"
,"2?a"
,"?2a"
, tiene only104 resultados. Entonces, si estoy tratando de elegir un resultado de todos estos 780 resultados, la distribución de "posición de la letra cifrada" es 13: 1: 1, no 1: 1: 1. Y consideraría esto como un trabajo "uniformemente aleatorio".Respuestas:
Pyth, 22 bytes
Pruébalo en línea.
Utiliza minúsculas y cero indexación.
Explicación
Algoritmo muy sencillo.
fuente
Perl 6 , 125 bytes
Pruébalo en línea!
Toma entrada y salida en mayúsculas. Toma entrada curry, como
f(n)(string)
. Utiliza 1 indexación.Explicación:
fuente
Python 2 ,
187177176156154148 bytesPruébalo en línea!
Utiliza letras mayúsculas y números indexados a 0.
-3 bytes, gracias a Kevin Cruijssen
fuente
sample(R(l),2)[::1|-(random()<.5)]
significarange(l)
y los baraja. Pero aparentemente la muestra no garantiza el pedido, por lo que no es necesaria :)(j==i)*(n>0)
? La multiplicación tiene prioridad de operador sobre la resta, ¿no?JavaScript (Node.js) , 135 bytes
Pruébalo en línea!
Gracias Arnauld por 1B
fuente
R ,
134132123 bytesPruébalo en línea!
Toma letras mayúsculas.
Explicación del código antiguo (principalmente el mismo enfoque):
fuente
Java (JDK) , 193 bytes
Pruébalo en línea!
IntStream
(conseguidoString::chars
) como entrada, así como un número y devuelve otroIntStream
.double
aint
son innecesarios debido al+=
hack.fuente
Japt , 29 bytes
Pruébalo en línea!
Indexado a cero.
Explicación:
fuente
C, 115 bytes
Pruébalo en línea!
0 indexado, en minúsculas.
Ligeramente sin golf y expandido:
El código debería ser bastante sencillo. Los dos randoms
i
,j
generados en unarand()
llamada, son buenos como independientes ya que gcd (n
,~-n
) = 1 yRAND_MAX
es grande.fuente
Limpio , 256 bytes
Pruébalo en línea!
Elige:
x
(posición del personaje en el segmento)y
que no es igual ax
(posición del dígito en el segmento)x
y no sea igual ay
menos quex
sea cerofuente
JavaScript, 134 bytes
Pruébalo en línea!
Esta respuesta eligió la cadena codificada de todas las posibles cadenas codificadas de manera uniforme. Por lo tanto, es más posible hacer que la letra codificada sea la primera.
fuente
C # (compilador interactivo de Visual C #) , 171 bytes
Pruébalo en línea!
Explicación...
fuente
Carbón ,
3530 bytesPruébalo en línea! El enlace es a la versión detallada del código. 0 indexado. Explicación:
Ingrese la longitud.
Ingrese la palabra y pase sobre los caracteres.
Elija una posición aleatoria para la letra descifrada.
Elija una posición aleatoria diferente para el dígito, a menos que la letra esté en la posición 0, en cuyo caso coloque también el dígito en la posición 0.
Haga un bucle para cada carácter de salida y encienda la posición.
Si esta es la posición del dígito, envíe la posición de la letra descifrada.
Pero si esta es la posición de la letra descifrada, entonces envíe la letra. Esto tiene prioridad sobre la posición del dígito porque el carbón vegetal toma la última entrada si varios casos de cambio tienen el mismo valor.
De lo contrario, genera una letra aleatoria.
fuente
05AB1E , 26 bytes
0 indexado.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente