助けて!パスワードを忘れた!


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

ハッシュの1つを受け取り、使用できるすべての可能なパスワードを印刷するプログラムを作成できますか?

入力は常に少なくとも1つの有効なパスワードを生成できます。文字列を明確に識別できる限り、任意の出力形式が許可されます。また、先行ゼロについても心配していません。したがって、潜在的なパスワードがの場合、またはを001受け入れます。011

Stack Exchangeからロックアウトされるのを助けてください!

得点

これはなので、各言語で最短の答えが勝ちです!


ではない1のは、ASCII値49の代わりに48
LiefdeWen

1
@LordFarquaadテストケースは細かいが、例があるべき見える"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen

1
コンマで区切る必要があります(コンマの後に1つ以上のスペースを続けてもかまいません)なぜ出力形式が制限されるのですか?通常、柔軟な形式を許可します
ルイスメンドー

1
ここでの通常のことは、「文字列が明確に識別できる限り、任意の出力形式が許可されている」というようなことです。または、数値以外の区切り文字を許可することもできます。あなたはそれを変更する場合は、その答えにコメントして現在の回答を通知
ルイス・Mendo

1
@FelipeNardiBatistaうん、先行ゼロはオプションです。3桁の数字を使用したことを覚えているので、表示されている場合は54、前のゼロを確認できます。
主ファルカード

回答:



9

C113108バイト

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?

5

パイソン2126の 75バイト

-2 @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]

オンラインでお試しください!


あなたは、両方交換した場合P/6/6とのをP/36、あなたは2バイト保存
アーノルド・パーマー

これはまさに私が書いていたものです、+ 1
musicman523

@フェリペ・ナルディ・バティスタ、なぜそうなるのかわかりません
アーノルド・パーマー

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 Core)133 131125123バイト

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},");、戻り値を作成するのではなく、出力に使用し、8バイトを節約するためにifステートメントの周りの不要な括弧を削除することです。
カミルドラカリ

以前にこのオプションを試しましたが、Lambdaには戻り値が必要です。ただし、ブラケットを取り外しても機能します。ありがとう:)
jkelm

として定義する場合、ラムダは戻り値を必要としますFunc<int,string>が、それを定義する場合Action<int>、戻り値を期待しません。
カミルドラカリ

気づかなかった!私はc#とゴルフの両方に慣れていませんが、仕事で他に何もすることがないときに試してみることにしました。ヒントをありがとう。とても感謝しています。
jkelm

1
C#charとの間のあいまいさで遊ぶ場合、最初のループのintようcharに反復変数を宣言し、Console.Write()文を単純化しながら正確にハッシュ計算を行うことができます。したがって、適切な119バイトのソリューションを取得できます。オンラインでお試しください!
チャーリー


2

CJam26 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ああ、ええと...私も最初の場所で私は幸運だと思うので、見ていなかった
ビジネス猫

{:H;6Zm*{s:i3,:).*:+H=},}1バイト短くなります。m*の自動範囲を使用するために、数字ではなく数字の文字列をフィルターで使用します。
エソランジングフルーツ

@ Challenger5いいね、ありがとう!
ビジネス猫

2

Java、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

JavaScript(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

R67 62 61バイト

Jarko Dubbeldamのおかげで-5バイト

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

オンラインでお試しください!

から番号を読み取ります stdinます。行が文字である行列を返します。

可能なすべての3桁の数字を行列形式(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.