Socorro! Acabei de entrar no Stack Exchange, mas esqueci qual é a minha senha! Preciso de uma maneira de resolver isso antes de sair.
Felizmente, sou um excelente hacker. Não só consegui encontrar o hash da minha senha, como também encontrei o algoritmo de hash do Stack Exchange! Ele pega o valor ASCII de cada dígito multiplicado pelo local desse dígito e depois soma todos esses valores. Por exemplo:
"135" -> 1*49 + 2*51 + 3*53 = 310
Lembro que minha senha tem três dígitos e que cada caractere é um número entre 0 e 5, inclusive (de modo que corresponda ao regex :) ^[0-5]{3}$
, mas ainda há muitas possibilidades de adivinhação. Preciso de um programa que possa converter um hash de volta em senhas em potencial, mas, apesar de ser um hacker experiente, não posso codificar para salvar minha vida! Consegui escrever esses testes manualmente:
input -> output
288 -> 000 // lowest possible hash
290 -> 200, 010
298 -> 022, 050, 103, 131, 212, 240, 321, 402, 430, 511
318 -> 555 // highest possible hash
Alguém pode escrever um programa para mim que use um hash e imprima todas as senhas possíveis que eu poderia ter usado?
A entrada sempre poderá produzir pelo menos uma senha válida. Qualquer formato de saída é permitido, desde que as cadeias possam ser claramente identificadas. Também não estou preocupado com zeros à esquerda, portanto, se houver uma senha em potencial 001
, também aceitarei 01
ou 1
.
Por favor, ajude-me a ficar fora do Stack Exchange!
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence!
1
é o valor Ascii em49
vez de48
?"135" -> 1*49 + 2*51 + 3*53 = 310
54
, consigo calcular os zeros na frente.Respostas:
05AB1E , 9 bytes
Experimente online!
Retorna a lista de listas de dígitos.
fonte
C ,
113108 bytesÉ exclusivo ver o que se entende por saída, a saída é do formato: 200010
Todas as senhas são escritas como 3 dígitos sem delimitador.
fonte
Gelatina , 16 bytes
Um link monádico retornando uma lista de listas de dígitos.
Experimente online!
Quão?
fonte
Python 2 ,
12675 bytes-2 graças a @ArnoldPalmer
Experimente online!
fonte
P/6/6
's comP/36
, você salva 2 bytesMATL , 20 bytes
Experimente online!
Explicação
fonte
Python 2 , 81 bytes
Experimente online!
fonte
Haskell,
71706461 bytesExperimente online!
fonte
C # (.NET Core) ,
133 131 125123 bytesExperimente online!
fonte
Console.Write($"{i%48}{j%48}{k%48},");
a saída em vez de criar um valor de retorno e remover os colchetes desnecessários ao redor da instrução if para economizar 8 bytes.Func<int,string>
, mas se você o definir comoAction<int>
não esperará um valor de retorno.char
eint
em C #, pode declarar suas variáveis de iteração comochar
no primeiro loop e ainda fazer o cálculo de hash exatamente como faz ao simplificar aConsole.Write()
frase. Assim, você pode obter uma solução adequada de 119 bytes. Experimente online!Carvão , 33 bytes
Experimente online!
Uma abordagem semelhante a outras respostas: faça um loop três vezes de 0 a 5, calcule o hash e imprima o estado das variáveis de iteração se coincidir com o hash de entrada.
Link para a versão detalhada .
fonte
CJam ,
2625 bytes-1 byte graças a Challenger5
Bloco anônimo que espera o hash na pilha (como um número inteiro) e deixa o resultado na pilha (como uma lista de cadeias).
Experimente online!
Explicação
fonte
{:H;6Zm*{s:i3,:).*:+H=},}
é 1 byte mais curto. Ele usa cadeias de dígitos no filtro, em vez de números, para usarm*
o intervalo automático do filtro .Java, 162 bytes
fonte
JavaScript (Firefox 30-57), 72 bytes
fonte
Pitão, 18 bytes
fonte
QBIC , 40 bytes
Explicação
fonte
R ,
676261 bytes-5 bytes graças a Jarko Dubbeldam
Experimente online!
lê o número de
stdin
; retorna uma matriz em que as linhas são os caracteres.Ele gera todos os trios possíveis de dígitos em um formato de matriz (
b
), calcula o produto da matrizb * [1,2,3]
, pega as linhasb
correspondentes (subtraindo288
da entrada que é1*48+2*28+3*48
) e as retorna.fonte
t(t(m))
é uma abreviação paraas.matrix(m)