質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

6回答

17781閲覧

(言語不問)全通りの組み合わせを作るアルゴリズム

niship

総合スコア37

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

1グッド

1クリップ

投稿2018/01/11 23:58

お世話になります。
ふと気になったので、ご質問させて頂きます。
言語は問わないのですが、アルゴリズムをご教示頂けますと幸いです。

0123456789abcdefghijklmnopqrstuvwxyz

上記の文字列から全通りの組み合わせを配列にするためには、
どのようなアルゴリズムがありますでしょうか?

現実的に、
計算すると動作が固まってしまいますか?

de9👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2018/01/12 00:01

何個選ぶ組み合わせですか?00など重複ありですか?
niship

2018/01/12 00:15

ozwk様、お世話になります。全ての重複も含む本当の意味での全通りは、計算不可能でしょうか?
退会済みユーザー

退会済みユーザー

2018/01/12 00:31

やってほしいことだけ記述している上に、仕様が明確ではないです。質問を整理してください。
ozwk

2018/01/12 00:31

いや、何が「本当の意味」なんですか?
quickquip

2018/01/12 00:45

アルゴリズムを考える時でも質問する時でも一緒なんですが、紙と鉛筆で解けるぐらいまで問題を小さくして、具体的な例で取り扱ったらいいと思います。例えば問題が abc だとしたら、欲しい出力は何ですか?
maisumakun

2018/01/12 00:46

重複ありの場合、「0を無限に選び続ける」ようなパターンを含むのであれば、当然ながらパターン数も無限になります。どのようなパターンが許されるのか、もっと詳しく定義してください。
guest

回答6

0

まず、全パターンは、各文字について「入れるか入れないか」2通りなので、36文字についてそれを行えば、2の36乗通り(687
億通り)となります。

あとは、0から2の36乗-1までを順番に作っていって、各ビットが立っているかを文字の有無に対応付ければいいでしょう。

投稿2018/01/12 00:44

maisumakun

総合スコア145186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/01/12 00:45

なお、これは重複しないことが前提です。
niship

2018/01/12 01:11

ご回答有難うございました。
think49

2018/01/12 01:56 編集

> 各文字について「入れるか入れないか」2通りなので、36文字についてそれを行えば、2の36乗通り(687億通り) 36bitの組み合わせは確かにその通りなのですが、そのアルゴリズムは「順不同」なので、"34" と "43" が合わせて1通りという扱いになってしまうのではありませんか。
swordone

2018/01/12 03:50

「組み合わせ」と取ったのでこういう回答なんだと思いますよ。
think49

2018/01/13 00:09

なるほど、「重複しない0~36文字の組み合わせ」と受け取るのであれば、その通りですね。
guest

0

ベストアンサー

36個(数字10+英字26)の順列組み合わせなら、その総数は 36! 個になります。
約 3.72 * 10^41 ですね。
現実的に全部出力しようとしたらとんでもないことになりますね。

毎秒1兆個(=10^12)の順列を出力できたとしても、3.72 × 10^29 秒。1日は 8.64 * 10^4 秒ですから、ざっくり 4.305 × 10^24 日。1年はざっくり 365.25 日として、
1.1787 × 10^22 年かかります。
宇宙の年齢が多く見積もっても 140億年(=1.4×10^10)ですから、宇宙開闢以来やってたとしても全然終わりが見えませんね。

投稿2018/01/12 00:50

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niship

2018/01/12 01:12

ご回答有難うございました。
guest

0

重複可、長さ制限無しなら組み合わせは無限ですね。
メモリは有限なのでどの言語でも配列にはできない……と思います。

使い道次第ですが無限リストにすることで解決するかもしれません。

投稿2018/01/12 00:47

de9

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niship

2018/01/12 01:11

ご回答有難うございました。
guest

0

解決済になってしまいましたけど、「無限の組み合わせ」というのでこんなネタを、、配列にしてみました笑

言語はpython3です。pythonの場合正確にはリストですけども。

python

1from random import randint 2 3class randomStr(object): 4 def __init__(self,n): 5 self._n = n 6 7 def __getitem__(self,_): 8 strKinds = '0123456789abcdefghijklmnopqrstuvwxyz' 9 result = '' 10 while randint(0,self._n) != 0: 11 result += strKinds[randint(0,35)] 12 13 return result 14 15if __name__=='__main__': 16 arr = randomStr(10) # 毎回1/11の確率で連続が終了 17 print(arr[5]) 18 print(arr[114514])

出力例

uqiz2w6dwk8zyrxl57m0d7y i9sthvbtws021w6zi08gkftm

くだらないですね。ただのネタです。

テキトーなアカウント名生成するのには使えるかも…?

まぁ添字でアクセスするたびに結果が変わるので配列とは絶対に言えませんね。

投稿2018/01/12 01:28

編集2018/01/12 01:43
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

勝手なこと蛇足ですが、この文章の質問で、パスワードの問題だ文字数指定しろよ。と理解できるのすごい。
僕は36文字の順列組み合わせだと読んで(36!だな)と思ってしまった。

よく読めば、レインボーテーブルの構築の概算を知りたいのかも、とわかったかも。

未来の技術は、結果を保存より高速に解を見つけ出すようですよ。

投稿2018/01/17 02:44

leiqunni

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/01/17 02:57

文字数不定で重複可なので 36! にはなりません。
takito

2018/01/17 03:10

質問者の質問に対する回答、ではなく個人の感想のようなので評価を下げさせていただきました 特定の方の回答について何かおっしゃりたいことや疑問があれば、そちらのコメント欄にて議論すべきと思います
leiqunni

2018/01/17 04:56

評価を下げるのに理由はいりません。そんなご丁寧に。 特定の誰か向けでなく、あえて言えば質問向けにと投稿したので、 新たな回答にしました。僕が言いたいことは上に書いたことです。 誰かを揶揄してるように読めたらすみません。 僕はtakitoさんが、僕が特定の方の回答に一言あると思った理由と、 その内容を知りたいです。 あるとすれば、質問は拙いなら、その人は初心者なんだろうし、 質問者の知りたいことを解決できるような議論になればと思いました。 いま読み返せば、組み合わせのアルゴリズムを質問しているので、 文字列を降順に並べて昇順にバブルソート。という答えかも。 質問者がバカにされる質問ってなんだよ。
Zuishin

2018/01/17 05:02

くどい言い方になりますが、解決済みなので解決しているはずです。 議論は不要でしょう。
guest

0

もしかして総当たりでパスワードを破ろうとしていますか?
瞬時に解けるならパスワードの意味がありません。
8 文字程度のパスワードでも相当時間がかかります。
それを「固まる」と表現するなら固まります。
数秒とか数時間ではありません。数ヶ月とか数年単位です。

投稿2018/01/12 00:58

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niship

2018/01/12 01:10

質問にも書いている通り、ふと気になったので、質問させて頂いただけなのですが、そう捉えられるようであれば、削除申請しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問