Socorro! Esqueci a minha senha!

24

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 01ou 1.

Por favor, ajude-me a ficar fora do Stack Exchange!

Pontuação

Isso é , então a resposta mais curta em cada idioma vence!

Lord Farquaad
fonte
Não 1é o valor Ascii em 49vez de 48?
LiefdeWen
11
Casos de teste @LordFarquaad olhar bem mas o exemplo deve ser"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen
11
deve ser delimitado por uma vírgula (uma vírgula seguida por um ou mais espaços também é aceitável) Por que o formato de saída restritivo? Nós usualy permitem formatos flexíveis
Luis Mendo
11
O habitual aqui é dizer algo como "qualquer formato de saída é permitido, desde que as strings possam ser claramente identificadas". Ou talvez permita qualquer separador não numérico. Se você o alterar, notifique os respondentes atuais com um comentário na resposta deles
Luis Mendo
11
@FelipeNardiBatista Sim, os zeros à esquerda são opcionais. Lembro que usei três dígitos, então, se eu apenas ver 54, consigo calcular os zeros na frente.
Lord Farquaad

Respostas:

10

05AB1E , 9 bytes

5Ý3ãʒÇƶOQ

Experimente online!

Retorna a lista de listas de dígitos.

Erik, o Outgolfer
fonte
3
Isso cria uma senha bastante decente.
Veedrac
9

C , 113 108 bytes

f(int h){int i=47,j,k;while(++i<54)for(j=47;++j<54)for(k=47;++k<54;)if(h==i+j+j+k*3)printf("%c%c%c",i,j,k);}

É 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.

xanoetux
fonte
2
Ei, código que eu posso ler! Bom contraste com Jelly e tal. +1 para usar um idioma clássico. :)
Curinga
8

Gelatina , 16 bytes

Ṿ€Oæ.J
6Ḷṗ3Ç⁼¥Ðf

Um link monádico retornando uma lista de listas de dígitos.

Experimente online!

Quão?

Ṿ€Oæ.J - Link 1, hash: list of integers (the digits of a password)
Ṿ€     - unevaluate €ach (giving a list of characters)
  O    - cast to ordinals (Ṿ€O could actually be replaced with +48 too)
     J - range of length (i.e. [1,2,3] in all use-cases)
   æ.  - dot product

6Ḷṗ3Ç⁼¥Ðf - Main link: number, n
6Ḷ        - lowered range of 6 = [0,1,2,3,4,5]
  ṗ3      - Cartesian power with 3 = [[0,0,0],[0,0,1],...,[5,5,5]] (all passwords)
       Ðf - filter keep if:
      ¥   -   last two links as a dyad (right implicitly n):
    Ç     -     call last link (1) as a monad
     ⁼    -     equals right?
Jonathan Allan
fonte
5

Python 2 , 126 75 bytes

-2 graças a @ArnoldPalmer

lambda h:[(P/36,P%36/6,P%6)for P in range(216)if P/36+P%36/6*2+P%6*3==h&31]

Experimente online!

Felipe Nardi Batista
fonte
Se você substituir os dois P/6/6's com P/36, você salva 2 bytes
Arnold Palmer
Isso é exatamente o que eu estava prestes a escrever, +1
musicman523 17/17
@Felipe Nardi Batista, eu não sei por que isso seria o caso
Arnold Palmer
4

MATL , 20 bytes

'0':'5'3Z^t3:*!si=Y)

Experimente online!

Explicação

'0':'5'   % Push inclusive range from '0' to '5', that is, '012345'
3Z^       % Cartesian power with exponent 3. Each Cartesian tuple is a row
t         % Duplicate
3:        % Push [1 2 3]
*         % Multiply element-wise with broadcast
!s        % Sum of each row
i         % Input number
=         % Logical mask of values that equal the input
Y)        % Use as logical index into the rows of the matrix. Implicit display
Luis Mendo
fonte
3

Python 2 , 81 bytes

lambda h:[(a,b,c)for a in r for b in r for c in r if a+2*b+3*c+288==h]
r=range(6)

Experimente online!

musicman523
fonte
3

Haskell, 71 70 64 61 bytes

l=[0..5]
f p=[show=<<[a,b,c]|a<-l,b<-l,c<-l,p-288==a+2*b+3*c]

Experimente online!

nimi
fonte
2

C # (.NET Core) , 133 131 125 123 bytes

n=>{int i,j,k;for(i=48;i<54;++i)for(j=48;j<54;++j)for(k=48;k<54;++k)if(i+j*2+k*3==n)Console.Write($"{i%48}{j%48}{k%48},");}

Experimente online!

jkelm
fonte
Eu dei conselhos mais completos anteriormente, mas não consegui que funcionasse corretamente. Por enquanto, minha otimização simples é usar 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.
Kamil Drakari 17/07
Eu tentei essa opção anteriormente, mas o Lambda requer um valor de retorno. A remoção dos suportes funcionará. Obrigado :)
jkelm
O lambda requer um valor de retorno se você o definir como Func<int,string>, mas se você o definir como Action<int>não esperará um valor de retorno.
Kamil Drakari 17/07
Não percebi isso! Eu sou novo em c # e golfe, mas decidi experimentá-lo quando não tenho mais nada para fazer no trabalho. Mais uma vez obrigado pelas dicas. Eu os aprecio muito.
jkelm
11
Se você brinca com a ambiguidade entre chare intem C #, pode declarar suas variáveis ​​de iteração como charno primeiro loop e ainda fazer o cálculo de hash exatamente como faz ao simplificar a Console.Write()frase. Assim, você pode obter uma solução adequada de 119 bytes. Experimente online!
1877 Charlie
2

Carvão , 33 bytes

F⁶F⁶F⁶¿⁼⁺℅Iι⁺×℅Iκ²×℅Iλ³Iθ«IιIκIλ⸿

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 .

Charlie
fonte
2

CJam , 26 25 bytes

-1 byte graças a Challenger5

{:H;6Zm*{s:i3,:).*:+H=},}

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

:H;    e# Store the hash in H.
6Zm*   e# 3rd Cartesian power of [0 1 2 3 4 5].
{      e# For each tuple in the power:
 s     e#  Stringify the tuple.
 :i    e#  Get the code point of each digit.
 3,:)  e#  Push [1 2 3].
 .*    e#  Element-wise multiplication of the two lists.
 :+    e#  Sum the result.
 H=    e#  Check if it's equal to the hash.
},     e# Filter the tuples to only ones for which this block gave a truthy result.
Gato de negócios
fonte
@LordFarquaad Oh, uh ... eu nem sequer ver que, em primeiro lugar, então eu acho que é sorte
Cat Negócios
{:H;6Zm*{s:i3,:).*:+H=},}é 1 byte mais curto. Ele usa cadeias de dígitos no filtro, em vez de números, para usar m*o intervalo automático do filtro .
Esolanging Fruit
@ Challenger5 Bom, obrigado!
Business Cat
2

Java, 162 bytes

static void f(int n){for(int i=48;i<54;i++){for(int j=48;j<54;j++){for(int k=48;k<54;k++){if(i+j*2+k*3==n)System.out.println((char)i+""+(char)j+""+(char)k);}}}}
0x45
fonte
2

JavaScript (Firefox 30-57), 72 bytes

n=>[for(i of s="012345")for(j of s)for(k of s)if(n-i-j*2-k*3==288)i+j+k]
Neil
fonte
1

Pitão, 18 bytes

fqQs*VS3CMT^jkU6 3
isaacg
fonte
1

QBIC , 40 bytes

[0,5|[0,5|[0,5|~a+b+b+c+c+c+288=:\?a,b,c

Explicação

[0,5|                Make a FOR loop run through the possible digits for pos 1, called a
[0,5|                Loop for #2, b
[0,5|                Loop for #3, c
                     Calculate the hash by taking a once, b twice and c thrice, 
                     and raising all to their ASCII codepoints
 a+b+b+c+c+c+288       
~               =:   IF thta is euqal to the given hash (read from cmd line)
\?a,b,c              THEN print the digits
                     (the IF and the FOR loops are auto-closed by QBIC)
steenbergh
fonte
1

R , 67 62 61 bytes

-5 bytes graças a Jarko Dubbeldam

b=t(t(expand.grid(rep(list(0:5),3))));b[b%*%1:3==scan()-288,]

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 matriz b * [1,2,3], pega as linhas bcorrespondentes (subtraindo 288da entrada que é 1*48+2*28+3*48) e as retorna.

Giuseppe
fonte
11
t(t(m))é uma abreviação paraas.matrix(m)
JAD