(aaは多数ありますが、bbはそうではありません)
10!/ 8だと思いました!しかし、どうやら私は何か間違ったことをしているようです。私は困惑しているので、誰も私を助けることができます。
(aaは多数ありますが、bbはそうではありません)
10!/ 8だと思いました!しかし、どうやら私は何か間違ったことをしているようです。私は困惑しているので、誰も私を助けることができます。
回答:
Zahavaの方法に代わる方法:2つの文字a〜fをペアリングする方法があります。ただし、2 b、e、fの文字がないため、「bb」、「ee」、「ff」は使用できないため、単語の数は36 − 3 = 33になります。
あなたが問題にアプローチしようとした方法は、10個の明確な文字がないという事実を無視するようです。10個の個別の文字がある場合、答えは正しいでしょう。
「賢い」方法でそれを推論できない場合、ブルートフォースを試す価値があります。あなたが作ることができるすべての単語のアルファベット順にリストを書き下そうとすることを想像してください。
「A」で始まるものはいくつですか?「A」の後には、A、B、C、D、E、またはFが続くため、6つの方法があります。
「B」で始まるものはいくつですか?その後にA、C、D、E、またはFが続く場合がありますが、2番目の「B」はないため、5つの方法しかありません。
「C」で始まるものはいくつですか?「C」はリストに3回現れるので、「C」の後に単独で、または他の5文字のいずれかを続けることができるため、「A」と同様に6つの方法があります。「C」が「A」よりも多く表示されるという理由だけで、「余分な」方法を取得しないことに注意してください。2番目の外観を超えるものは冗長です。
リストに1回だけ表示される各文字が5語の先頭に表示され、2回以上表示される文字が6語の先頭に表示されることは明らかです。一度だけ現れる文字は「B」、「E」、および「F」であり、それぞれ5語の先頭にあるため、5 + 5 + 5 = 15語になります。2回以上現れる文字は「A」、「C」、および「D」であり、それぞれ6語の先頭にあるため、6 + 6 + 6 = 18語になります。合計で15 + 18 = 33ワードです。
これは他の方法よりも時間がかかりますが、この体系的な方法で答えを考えてみると、高速な方法の1つを「見つける」ことができた可能性があります。
これが確率の質問として表現されていた場合、最初の傾向はツリー図を描くことだったかもしれないことに注意してください。最初の文字は6つのブランチから始まりましたが、2番目の文字は「A」、「C」、「D」から6つのブランチが出ていたはずです(6文字のいずれかが後に続くため)ただし、「B」、「E」、および「F」から出てくるブランチは5つだけです(これらのブランチには自分自身が続くことができないため)。この分岐パターンは事実上、私の答えと同じですが、ツリーでより視覚的に考えることを好むかもしれません。
数学的な観点から見ると、解は、リストと対角線を取り除いたものとの間のデカルト積の要素のセットです。このアルゴリズムを使用してこの問題を解決できます。
セットは明確なオブジェクトの明確に定義されたコレクションであるため、オブジェクトは繰り返されません。
from itertools import product
import numpy as np
letters = list("aabcccddef")
cartesianproduct = np.array(["".join(i) for i in product(letters,letters)]).reshape(10,10)
cartesianproduct
Out :
array([['aa', 'aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['aa', 'aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['ba', 'ba', 'bb', 'bc', 'bc', 'bc', 'bd', 'bd', 'be', 'bf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'dd', 'de', 'df'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'dd', 'de', 'df'],
['ea', 'ea', 'eb', 'ec', 'ec', 'ec', 'ed', 'ed', 'ee', 'ef'],
['fa', 'fa', 'fb', 'fc', 'fc', 'fc', 'fd', 'fd', 'fe', 'ff']],
dtype='|S2')
対角線を削除します
diagremv = np.array([ np.delete(arr,index) for index,arr in enumerate(cartesianproduct)])
diagremv
array([['aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['aa', 'ab', 'ac', 'ac', 'ac', 'ad', 'ad', 'ae', 'af'],
['ba', 'ba', 'bc', 'bc', 'bc', 'bd', 'bd', 'be', 'bf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['ca', 'ca', 'cb', 'cc', 'cc', 'cd', 'cd', 'ce', 'cf'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'de', 'df'],
['da', 'da', 'db', 'dc', 'dc', 'dc', 'dd', 'de', 'df'],
['ea', 'ea', 'eb', 'ec', 'ec', 'ec', 'ed', 'ed', 'ef'],
['fa', 'fa', 'fb', 'fc', 'fc', 'fc', 'fd', 'fd', 'fe']],
dtype='|S2')
要素セットの長さを計算します。
len(set(list(diagremv.flatten())))
Out: 33
「2文字の単語」という用語を使用しているため、疑問が不明確だと考える人がいると思います。誰もが解決策に近づいている方法を考えると、全員が「2文字の単語」を「文字のペア」のようなものと解釈しています。熱心なスクラブル奏者として、私はすぐに「これらの文字から正当な2文字の単語をいくつ作成できるか」という質問に答えました。そしてその答えは-12!少なくとも、公式スクラブルプレーヤー辞書(OSPD5)の最新版によると。単語は、aa、ab、ad、ae、ba、be、da、de、ed、ef、fa、およびfeです。(これらの単語の多くを聞いたことがないという事実は、その有効性を否定しないことに注意してください!); o)
ちょうど私の「2感覚」。
質問の仕方に問題があります。行 "aabcccddef"で実際に許可されるアクションは2文字の単語ですか?後者を置き換えることはできますか、それとも不必要なものを越えるだけですか この条件に応じて2つの可能な答えが見つかりました。
1)前に述べたように、33のように文字を任意の方法で置き換えることができます。30組の異なる文字(6 * 5)と3組の類似文字。
2)文字の場所を切り替えることができず、交差することしかできない場合、答えははるかに少なくなります。最初から最後まで数えましょう。「a」で始まる2番目の文字が6つあり、「b」で始まるのは4文字だけです。「c」には4、「d」-3、「e」-1があります。これは18文字です。
質問に対する私の答え:aabcccddefから2文字の単語をいくつ取得できますか
* //ポイントは質問の読み取りであり、「単語」はペアの組み合わせではありません。単語を使用すると、文字を2回表示する必要があります。たとえば、2つの文字「a」と2つの文字「d」があるため、「ad」を単語として2回記述することができます。
[self-study]
タグを追加してそのwikiを読んでください。