Introdução:
Tenho muitas cifras diferentes armazenadas em um documento que compilei quando criança, escolhi algumas das que achei mais adequadas para desafios (não muito triviais e nem muito difíceis) e as transformei em desafios. A maioria deles ainda está na caixa de areia, e ainda não tenho certeza se vou postar todos, ou apenas alguns. Mas aqui está o primeiro deles a começar.
Uma Cifra de Computador codificará o texto fornecido em grupos de caracteres 'aleatórios' de uma determinada informação length
. Se esse grupo contiver um dígito, ele será usado para indexar em seu próprio grupo o caractere codificado. Se nenhum dígito estiver presente no grupo, significa que o primeiro caractere é usado.
Por exemplo, digamos que queremos codificar o texto this is a computer cipher
com um determinado comprimento de 5
. Esta é uma saída potencial (nota: os números são indexados 1 no exemplo abaixo):
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)
Vamos dar alguns grupos como exemplos para explicar como decifrar o grupo:
qu5dt
: Este grupo contém um dígito5
, assim que o (1-indexada) 5 caráter deste grupo é o caráter usado para o texto decifrado:t
.hprit
: Este grupo não contém dígitos, de modo que o primeiro caractere desse grupo é usado implicitamente para o texto decifrado:h
.osyw2
: Este grupo contém um dígito2
, assim que o (1-indexada) 2º caráter deste grupo é o caráter usado para o texto decifrado:s
.
Desafio:
Dado um número inteiro length
e uma sequência word_to_encipher
, produza uma sequência codificada aleatória, conforme descrito acima.
Você só precisa codificar os dados length
e word_to_encipher
, portanto, não é necessário criar um programa / função de decifração também. No entanto, posso fazer um desafio da parte 2 para a decifração no futuro.
Regras do desafio:
- Você pode assumir que o valor
length
estará no intervalo[3,9]
. - Você pode assumir
word_to_encipher
que conterá apenas letras. - Você pode usar letras minúsculas ou maiúsculas completas (indique qual delas você usou na sua resposta).
- Suas saídas, cada grupo e as posições dos dígitos em um grupo (se houver) devem ser uniformemente aleatórias . Portanto, todas as letras aleatórias do alfabeto têm a mesma chance de ocorrer; a posição da letra criptografada em cada grupo tem a mesma chance de ocorrer; e a posição do dígito tem a mesma chance de ocorrer (exceto quando é o primeiro caractere e nenhum dígito está presente; e obviamente não pode estar na mesma posição que o caractere codificado).
- Você também pode usar dígitos indexados a 0 em vez de indexados a 1. Indique qual dos dois você usou na sua resposta.
- O dígito
1
(ou0
quando indexado com 0) nunca estará presente na saída. Portanto,b1ndh
não é um grupo válido para codificar o caractere 'b'. No entanto,b4tbw
é válido, onde os4
encripta osb
na posição 4 (1-indexada), e os outros caracteresb
,t
,w
são aleatórios (que por coincidência, também contém umb
). Outros grupos válidos possíveis delength
5 para codificar o caractere 'b' são:abcd2
,ab2de
,babbk
,hue5b
, etc.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste:
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
tudo mesmo? Também éb1akk
válido?b1akk
eu diria que não. Irá editá-lo na descrição do desafio para esclarecer. Se o primeiro caractere for o codificado, nenhum dígito deve estar presente."a??"
tem 676 possíveis resultados, mas"1a?"
,"?a1"
,"2?a"
,"?2a"
, tem only104 resultados. Portanto, se estou tentando escolher um resultado de todos esses resultados do 780, a distribuição da "posição da letra criptografada" é 13: 1: 1, não 1: 1: 1. E eu consideraria isso como o trabalho "uniformemente aleatório".Respostas:
Pitão, 22 bytes
Experimente online.
Usa letras minúsculas e indexação zero.
Explicação
Algoritmo muito simples.
fonte
Perl 6 , 125 bytes
Experimente online!
Leva entrada e saída em maiúsculas. Leva a entrada ao curry, como
f(n)(string)
. Usa 1 indexação.Explicação:
fonte
Python 2 ,
187177176156154148 bytesExperimente online!
Usa letras maiúsculas e números indexados em 0.
-3 bytes, graças a Kevin Cruijssen
fonte
sample(R(l),2)[::1|-(random()<.5)]
significa isso ?range(l)
e os embaralha. Mas, aparentemente amostra não garantir a ordem, por isso não é necessário :)(j==i)*(n>0)
? A multiplicação tem precedência de operador sobre a subtração, não é?JavaScript (Node.js) , 135 bytes
Experimente online!
Obrigado Arnauld por 1B
fonte
R ,
134132123 bytesExperimente online!
Leva letras maiúsculas.
Explicação do código antigo (principalmente a mesma abordagem):
fonte
Java (JDK) , 193 bytes
Experimente online!
IntStream
(obtidoString::chars
) como entrada, bem como um número e retorna outroIntStream
.double
paraint
são desnecessárias devido ao+=
hack.fonte
Japonês , 29 bytes
Experimente online!
Indexado a zero.
Explicação:
fonte
C, 115 bytes
Experimente online!
Indexado a 0, minúsculo.
Um pouco sem golfe e expandido:
O código deve ser bem direto. Os dois randoms
i
,j
gerados em umarand()
chamada, são bons como independentes, pois gcd (n
,~-n
) = 1 eRAND_MAX
é grande.fonte
Limpo , 256 bytes
Experimente online!
Escolhe:
x
(posição do personagem no segmento)y
que não é igual ax
(posição do dígito no segmento)x
e igual ay
, a menos quex
seja zerofonte
JavaScript, 134 bytes
Experimente online!
Esta resposta escolheu a sequência codificada de todas as sequências codificadas possíveis de maneira uniforme. Portanto, é mais possível criar a letra codificada como a primeira.
fonte
C # (compilador interativo do Visual C #) , 171 bytes
Experimente online!
Explicação...
fonte
Carvão ,
3530 bytesExperimente online! Link é a versão detalhada do código. Indexado a 0. Explicação:
Insira o comprimento.
Insira a palavra e faça um loop sobre os caracteres.
Escolha uma posição aleatória para a letra decifrada.
Escolha uma posição aleatória diferente para o dígito, a menos que a letra esteja na posição 0; nesse caso, coloque o dígito também na posição 0.
Faça um loop uma vez para cada caractere de saída e ative a posição.
Se esta for a posição do dígito, emita a posição da letra decifrada.
Mas se essa é a posição da letra decifrada, emita a letra. Isso tem precedência sobre a posição do dígito porque o carvão vegetal faz a última entrada se vários casos de chave tiverem o mesmo valor.
Caso contrário, imprima uma letra aleatória.
fonte
05AB1E , 26 bytes
Indexado a 0.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte