Sua tarefa é pegar uma sequência criptografada como entrada e produzir a sequência descriptografada, para revelar sua mensagem oculta.
As cadeias, tanto a entrada quanto a saída, conterão caracteres desta lista de 64 caracteres ASCII (observe o espaço à esquerda):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Esses caracteres recebem números, na ordem em que estão listados acima:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Portanto, o espaço é o número 0, !
é o número 1 e ~
é o número 63. Esses números podem ser representados no código binário de 6 bits:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
A criptografia é muito simples:
Vou usar eC
para caracteres criptografados e C
para caracteres da string original. C(n)
é o enésimo caractere da sequência original, enquanto eC(n)
é o enésimo caractere da sequência criptografada.
Você usará a representação binária de 6 bits dos caracteres. O primeiro caractere será eC(0) = not(C(0))
. A partir daí, todos os personagens serão eC(n) = xor(C(n),C(n-1))
.
Exemplo:
Vamos supor que a string de entrada seja code
.
c
é o 38º caractere (zero indexado) ou100110
em binário. A versão criptografada tem todos os bits invertidos, então011001 -> 25 -> '9'
(novamente, zero indexado).o
é o 50º caractere ou110010
em binário.xor(100110, 110010) = 010100 = 20 = '4'
.d
é o 39º caractere ou100111
em binário.xor(100111, 110010) = 010101 = 21 = '5'
.e
é o 40º caractere ou101000
em binário.xor(101000, 100111) = 001111 = 15 = '/'
.
Portanto, se a sequência original for code
, a sequência criptografada se tornará 945/
.
Casos de teste:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
fonte
Respostas:
Geléia ,
2726 bytesExperimente online!
Versão alternativa, 22 bytes (não concorrente)
Jelly finalmente alcançou outras habilidades de golfe e conseguiu um átomo ASCII imprimível , então isso funciona agora.
Experimente online!
Como funciona
fonte
JavaScript (ES6), 115 bytes
Casos de teste
Mostrar snippet de código
fonte
^
que a direita vai do]
. A resposta ainda funciona com essa mudança para os casos de teste que acredito.d
partir do que está faltando?Geléia ,
3431 bytes-3 bytes graças a Dennis (use
ḟ
duas vezes em vez deœ-
,;
e¤
; use em”~
vez de 63 )Um link monádico que recebe e retorna listas de caracteres.
* Nota: os argumentos de entrada para um programa Jelly utilizar cordas Python formatação, por isso, citando com
"
,'
,'''
(ou se inequívoca não cita) são todas as opções.Experimente online!
Quão?
Bitwise-xor é invertível (dados "zeros à esquerda").
Bitwise-Not é um xor com "todos os um" - nesse caso, apenas 6 são necessários, então 2 7 -1 = 63 .
Depois de termos criado a matriz ou os caracteres e consultado os índices dos caracteres de entrada, a decodificação em si é simplesmente uma redução cumulativa pelo bit a bit-xor, após o qual podemos indexar novamente na mesma matriz.
* Observação: procurar um espaço em p renderá um 64, mas tudo bem, já que a indexação de volta para p é modular, portanto, adicionar um líder
1
é como adicionar 64, levando o índice de volta para onde ele precisa).fonte
Java, 225 bytes
Não pratico golfe em Java há muito tempo, portanto, todas as dicas de golfe são apreciadas.
Experimente Online!
fonte
String D(String E){
torna - seE->{
(-15 bytes);-1-J
pode ser+~J
(-1 byte); ei=-1
pode seri=0
,++
pode ser movido parai++<1?
e depoisi-1
se tornai-2
(-1 byte). Experimente online: 208 bytes05AB1E , 40 bytes
Experimente online!
Explicação
fonte
Conjunto de instruções da CPU x86, 235 bytes
A função find () e deCript () + a cadeia abc: 171 bytes + 64 bytes = 235 assembly com nasmw e compilador / biblioteca com o compilador Borland C:
resultados:
Assembly é melhor (por exemplo, o verdadeiro eu uso um sistema macro, sim, eu sei que é muito longo, mas como o C one + - com sistema macro, por exemplo o verdadeiro porque as instruções são mais simples, é fácil escrever código na montagem mesmo sem faça correções como uma escrita em inglês (não eu))
fonte
C (gcc) , 153 bytes
Experimente online!
Pouco golfe menos
fonte
APL (Dyalog Unicode) , 52 bytes SBCS
Requer
⎕IO←0
Experimente online!
fonte
¨
:{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, você pode salvar dois bytes por conversão em um programa completo:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Röda ,
120100 bytesExperimente online!
Eu usei o
l=63
truque da resposta JavaScript.No momento, estou trabalhando para reduzirA
o golfe em andamento ...fonte
Python 2 , 155 bytes
Experimente online!
fonte
PHP, 103 bytes
Experimente online!
PHP, 107 bytes
Experimente online!
PHP, 118 bytes
Experimente online!
fonte
Python + Numpy, 214 bytes
Não é possível competir com outra solução Python, embora use uma abordagem numérica pura e diferente:
Um pouco de explicação:
S=A(r(32,60)+...)
- definir alfabeto como intervalos de códigoT=A(r(128))
- tabela hash init de tamanho 128 (maior ponto de código)T[S]=A(r(64))
- preencha a tabela de hash, isto é, escreva índices 0-63 nos elementos com índices ASCIIW=T[fromstring(s,"b")]
- converta a entrada em array e converte-a em novos códigosW[0]=~W[0]
- inverter primeiro valorW=S[bitwise_xor.accumulate(W)&63]
- use o método de acumulação do Numpy com xor para evitar loop, redefina 2 bits restantes e traduza novamente para asciifonte
Alice , 46 bytes
Experimente online!
Explicação
A primeira metade do programa é executada no modo ordinal e configura o mapeamento de números para caracteres. A segunda metade é executada no modo cardinal e usa esse mapeamento para decodificar a entrada.
fonte
Japonês
-P
, 33 bytesExperimente online!
Por alguma razão, os casos de teste se opõem à execução como um conjunto, então aqui está o segundo , terceiro e quarto individualmente.
Explicação:
fonte
APL (NARS), 72 caracteres, 144 bytes
Isso supõe que a entrada esteja sempre no array 's' ... Para entender como decifrar, tive que escrever a versão do assembly primeiro ... test:
fonte
105103 bytes, código de máquina (16 bits x86), 57 instruçõesEm execução: salve em codegolf.com, dosbox:
codegolf.com < input.bin
Quase esqueci a parte divertida:
Olá, esta é a minha segunda entrada. O anterior foi o RC4 . Feito usando o hexeditor HT , sem compilador , mas desta vez eu estava usando Ctrl-a
assemble instruction
, ainda não sei se isso conta como uma entrada ou não.Porque como
De maneira semelhante, comecei criando arquivos com
NOP
s, depois reutilizei a leitura / gravação do RC4 . Escrevi pela primeira vez em python 'translation ladder' de ascii para indexar. e usei isso na montagem, criei uma escada semelhante na direção inversa, finalmente adicionei um pequeno truque para lidar com o primeiro byteDe maneira semelhante ao RC4, o último passo foi eliminar os adicionais
nops
, que exigiam a correção de saltos.Dissecação
Novamente, o programa depende dos valores iniciais do registro .
Manequim, será necessário mais tarde
ler byte
saia se stdin terminar
escada que traduz ascii em índice (lembre-se de que todos os saltos vão para 0x134)
xor byte por byte anterior,
SI
aponta para o endereço0x100
, que inicialmente contém 0xFF do código de operação de uma instrução fictícia na parte superior, o que resulta em comportamento negativo (lembrete: as COMs são carregadas em 0x100)limitar o resultado ao índice e armazenar byte em 0x100,
escada na direção inversa
coloque byte em [di], escreva byte para stdout (lembre-se de que AH = 40h usa DX como endereço, mas foi definido no topo, ao ler byte)
lembre-se de que stdin -> stdout e stdout para stdin é feito usando inc bx / dec bx
loop ^^
Ferramentas e recursos
fonte