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!


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:



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.


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?


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



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!


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 .


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.

@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);}}}}

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]


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)

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.


11
t(t(m))é uma abreviação paraas.matrix(m)
JAD
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.