도움! 비밀번호를 잊어 버렸습니다!


24

도움! 방금 Stack Exchange에 로그인했지만 암호가 무엇인지 잊었습니다! 로그 오프하기 전에 문제를 해결할 방법이 필요합니다.

운 좋게도 나는 훌륭한 해커입니다. 암호 해시를 찾을 수 있었을뿐만 아니라 Stack Exchange의 해싱 알고리즘도 찾았습니다! 각 자릿수의 ASCII 값에 해당 자릿수를 곱한 다음 모든 값을 합산합니다. 예를 들면 다음과 같습니다.

"135" -> 1*49 + 2*51 + 3*53 = 310

내 비밀번호는 3 자리 길이이며 각 문자는 0에서 5 사이의 숫자 (정규식과 일치하도록 ^[0-5]{3}$)입니다.하지만 여전히 추측하기에는 너무 많습니다. 해시를 잠재적 인 암호로 다시 변환 할 수있는 프로그램이 필요하지만 전문가 해커 임에도 불구하고 생명을 구하기 위해 코딩 할 수 없습니다! 나는이 테스트를 손으로 쓸 수있었습니다.

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

여러분 중 한 명이 해시를 받아 사용할 수있는 모든 가능한 암호를 인쇄하는 프로그램을 작성할 수 있습니까?

입력은 항상 하나 이상의 유효한 비밀번호를 생성 할 수 있습니다. 문자열을 명확하게 식별 할 수있는 한 모든 출력 형식이 허용됩니다. 또한 선행 0을 걱정하지 않으므로 잠재적 암호가 인 경우 또는 001을 수락 합니다.011

Stack Exchange에 갇히지 않도록 도와주세요!

채점

이것은 이므로 각 언어에서 가장 짧은 답변이 이깁니다!


아닌가 1의 아스키 값이 49대신 48?
LiefdeWen

1
@LordFarquaad 테스트 사례는 괜찮아 보이지만 예는 다음과 같습니다."135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen

1
쉼표로 구분해야합니다 (쉼표 뒤에 하나 이상의 공백도 허용됨) 왜 제한적인 출력 형식입니까? 우리는 일반적으로 유연한 형식을 허용합니다
Luis Mendo

1
여기에서 일반적으로 "문자열을 명확하게 식별 할 수있는 한 출력 형식이 허용됩니다"와 같은 것을 말합니다. 또는 숫자가 아닌 구분 기호를 허용하십시오. 변경하면, 현재 답변자에게 답변에 코멘트를 제공하십시오
Luis Mendo

1
@FelipeNardiBatista Yep, 선행 0은 선택 사항입니다. 나는 3 자리 숫자를 사용했음을 기억 54합니다. 방문하면 0을 앞에 올릴 수 있습니다.
Lord Farquaad

답변:



9

C , 113108 바이트

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

출력의 의미를 확인하는 것이 고유하며 출력 형식은 200010입니다.

모든 비밀번호는 구분 기호없이 3 자리 숫자로 작성됩니다.


2
이봐, 내가 읽을 수있는 코드! 젤리와는 대조적입니다. 고전 언어를 사용하는 경우 +1 :)
와일드 카드

8

젤리 , 16 바이트

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

자릿수 목록을 리턴하는 모나드 링크.

온라인으로 사용해보십시오!

방법?

Ṿ€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 바이트

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

온라인으로 사용해보십시오!

설명

'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 코어) , 133131125123 바이트

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},");}

온라인으로 사용해보십시오!


이전에 더 철저한 조언을했지만 제대로 작동하지 않았습니다. 지금은 간단한 최적화가 Console.Write($"{i%48}{j%48}{k%48},");반환 값을 작성하고 if 문 주위의 불필요한 괄호를 제거하여 8 바이트를 절약하는 대신 출력 에 사용 하는 것입니다.
Kamil Drakari

이전에 해당 옵션을 시도했지만 Lambda에 반환 값이 필요합니다. 그래도 브래킷을 제거하면 작동합니다. 감사합니다 :)
jkelm

람다는을로 정의하면 반환 값이 필요 Func<int,string>하지만 정의 Action<int>하면 반환 값을 기대하지 않습니다.
Kamil Drakari

그것을 몰랐다! 나는 C #과 골프를 처음 접했지만 직장에서 할 일이 없으면 시도해보기로했다. 팁 주셔서 다시 한 번 감사드립니다. 나는 그들을 크게 환영합니다.
jkelm

1
C # charintC # 사이의 모호성을 가지고 노는 경우 char첫 번째 루프 에서처럼 반복 변수를 선언 하고 Console.Write()문장 을 단순화하면서 해시 계산을 그대로 수행 할 수 있습니다. 따라서 적절한 119 바이트 솔루션을 얻을 수 있습니다. 온라인으로 사용해보십시오!
Charlie

2

, 33 바이트

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

온라인으로 사용해보십시오!

다른 답변에 대한 비슷한 접근법 : 0에서 5까지의 루프 세 번, 해시를 계산하고 입력 해시와 일치하는 경우 반복 변수의 상태를 인쇄하십시오.

자세한 버전으로 연결합니다 .


2

CJam , 26 25 바이트

Challenger5 덕분에 -1 바이트

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

스택에서 해시 (정수로)를 예상하고 결과를 스택에 (문자열 목록으로) 남겨둔 익명 블록.

온라인으로 사용해보십시오!

설명

: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 오, 어 ... 어쩌면 처음에 그것을 보지 못해서 운이 좋은 것 같아요
Business Cat

{:H;6Zm*{s:i3,:).*:+H=},}1 바이트 더 짧습니다. m*자동 범위 를 사용하기 위해 숫자 대신 숫자 문자열을 필터에 사용 합니다.
Esolanging 과일

@ Challenger5 Nice 감사합니다!
비즈니스 고양이

2

자바, 162 바이트

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

자바 스크립트 (Firefox 30-57), 72 바이트

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 바이트

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

설명

[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 바이트

Jarko Dubbeldam 덕분에 -5 바이트

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

온라인으로 사용해보십시오!

에서 숫자를 읽습니다 stdin. 행이 문자 인 행렬을 반환합니다.

행렬 형식 ( b) 으로 가능한 모든 자릿수의 트리오를 생성하고 , 행렬 곱을 계산하고 b * [1,2,3], b일치 하는 행을 가져 오고 ( 288있는 입력에서 빼기 1*48+2*28+3*48) 반환합니다.


1
t(t(m))속기에 대한 인as.matrix(m)
JAD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.