Descrição
Um deslocamento de César é uma cifra monoalfabética muito simples, em que cada letra é substituída por uma depois do alfabeto. Exemplo:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
é o resultado do desafio real, esse foi um exemplo de mudança de 1).
Como você pode ver, o espaçamento e a pontuação permanecem inalterados. No entanto, para evitar adivinhar a mensagem, todas as letras são maiúsculas. Ao mudar as cartas de volta, a mensagem foi decifrada, conveniente, mas também muito fácil de decifrar por outras pessoas que deveriam não saber o que significa a mensagem.
Então, ajudaremos César um pouco usando uma forma avançada de sua cifra: a mudança de César com mudança automática !
Desafio
Sua tarefa é escrever um programa ou função que, dada uma cadeia de caracteres para codificar, produza a cadeia de caracteres criptografada correspondente à entrada. O avançado Caesar Shift funciona assim:
1. Compute letter differences of all adjacent letters:
1.1. Letter difference is computed like this:
Position of 2nd letter in the alphabet
-Position of 1st letter in the alphabet
=======================================
Letter difference
1.2. Example input: Hello
H - e|e - l|l - l|l - o
7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
=3| =-7| =0| =-3
2. Assign the letters continously a letter difference from the list,
starting at the second letter and inverting the differences:
2.1. 2nd letter: first difference, 3rd letter: second difference, etc.
2.2. The first letter is assigned a 1.
2.3. Example input: Hello with differences 3; -7; 0; -3
Letter || Value
=======||======
H || 1
E || -3
L || 7
L || 0
O || 3
3. Shift the letters by the value x they have been assigned:
3.1. In case of a positive x, the letter is shifted x letters to the right.
3.2. In case of a negative x, the letter is shifted |x| letters to the left.
3.3. In case of x = 0, the letter is not shifted.
3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
Example: Y + Shift of 2 --> A
3.5. Example input: See the table under 2.3.
|| || Shifted
Letter || Value || Letter
=======||=======||=========
H || 1 || I
E || -3 || B Program output:
L || 7 || S IBSLR
L || 0 || L
O || 3 || R
Espaços e outros símbolos especiais, como pontuação, são ignorados neste processo. É garantido que o seu programa receberá uma sequência contendo apenas caracteres ASCII imprimíveis. A saída da sua função / programa deve estar apenas em maiúsculas.
Isso é código-golfe , então as brechas padrão se aplicam e pode vencer a resposta mais curta em bytes!
fonte
E
-3
?ZEN
, por exemplo.Z
deslocado por 1 é ...A
? (como uma nota lateral, os 05AB1E resposta voltasZ
emA
)RELIEF
eRELIES
para ambas codificar para o mesmo resultadoSRSFAG
?Respostas:
05AB1E ,
282724 bytesExperimente online!
Explicação
fonte
IBSLR, EGUFV!
paraHello, World!
, isso é correto? O OP acabou de estragar esse exemplo?Python 3 , 100 bytes
Experimente online!
b
mantém registro do código ASCII da última letra ou é inicialmente zero; a fórmulac+c-(b or~-x)
significa que uma letra com código ASCIIc
é deslocadac-b
seb
for diferente de zero ec-(c-1) == +1
seb
for zero (para a primeira letra).b
nunca se tornará zero novamente, pois é garantido que a string consiste em caracteres ASCII imprimíveis .Por fim,
64<c<91
verifica sec
há uma letra ASCII maiúscula e(…-65)%26+65
coloca tudo de volta noA-Z
intervalo.ovs salvou um byte. Obrigado!
fonte
05AB1E ,
323029 bytesExperimente online!
fonte
ES6 (Javascript), 138 bytes:
http://jsbin.com/manurenasa/edit?console
fonte
MATL , 27 bytes
Experimente online!
Eu acho que esse é o menor tempo possível, mas existem muitas variedades diferentes, pois há muita reutilização de 'variáveis' (existem 3
t
(duplicação) e 2w
(troca) operações, a área de transferênciaH
é usada e mesmo assim ainda existe uma duplicata1Y2
...). Infelizmente, não consegui salvar bytes com aM
área de transferência automática .Mais da metade do programa é dedicado a torná-lo em maiúsculas e ignorando caracteres não alfabéticos - apenas a cifra não passa de 13 bytes ( Experimente on-line! )
fonte
Perl,
9089Embora as línguas não codegolfas raramente sejam competitivas, podemos ficar abaixo de 100;)
Eu decidi desgolfar isso:
@a = split//,<>;
Recebe informações de STDIN, armazena a lista de caracteres (com nova linha!) Em @a.say uc(++$a[0])
primeira letra maiúscula de saída deslocada em 1. Acontece que você pode incrementar uma letra em perl se usar um prefixo ++. Este é um mutador ofc.2*ord($a[$_+1])-ord($a[$_])+!$_
Somos solicitados a pegar o caractere em x e adicionar a diferença + (x- (x-1)). Bem, isso é 2x - (x-1). No entanto: mudei a primeira letra! Portanto, eu tenho que corrigir esse erro, portanto+!$_
, que corrigirá por ter subtraído um número demais na posição 0 (o único caso! $ _ Não é indefinido). Em seguida,uc chr
obtemos uma letra maiúscula do valor ASCII calculado.map{ ... } $#a-2
-$#a
é a posição para acessar o último elemento da matriz. Desde que eu estou adicionando um que eu quero$#a-1
, mas como a nova linha da entrada precisa ser ignorada, é isso$#a-2
.Isso é concatenado com a primeira letra e terminamos :)
fonte
Perl 5
-F
,737774 bytesExperimente online!
fonte
Hello, World!
deveria resultarIBSLR, EGUFV!
, nãoIBSLR, XGUFV!
.PHP,
10698 bytesbastante desagradável ... se
base_convert
não fosse tão longo (ouctype_alpha
) ...mas fiquei com menos de 100. satisfeito.
Execute como pipe
-nR
ou experimente online .fonte
JavaScript (Node.js) ,
86838781 bytesExperimente online!
fonte