(aa는 많은 사람 중 하나 일 것이고, bb는 그렇지 않을 것입니다)
나는 그것이 10이라고 생각했다! / 8! 그러나 분명히 나는 뭔가 잘못하고 있습니다. 내가 혼란스러워서 누구든지 나를 도울 수 있습니까?
(aa는 많은 사람 중 하나 일 것이고, bb는 그렇지 않을 것입니다)
나는 그것이 10이라고 생각했다! / 8! 그러나 분명히 나는 뭔가 잘못하고 있습니다. 내가 혼란스러워서 누구든지 나를 도울 수 있습니까?
답변:
Zahava의 방법에 대한 대안 : 두 글자 af의 방법이 있습니다. 그러나, 단어 수 만드는 것은 불가능 2 B, E 또는 F 문자이므로 "BB", "EE"및 "FF"가 아니다이다 (36) - (3) =는 .
당신이 문제에 접근하려고 시도한 방식은 10 개의 별개의 문자가 없다는 사실을 무시하는 것 같습니다. 10 개의 고유 한 글자가 있다면 답이 맞을 것입니다.
당신이 그것을 "영리한"방식으로 추론 할 수 없다면, 종종 무차별적인 힘을 시도해 볼 가치가 있습니다. 알파벳순으로 정렬 할 수있는 모든 단어 목록을 작성한다고 상상해보십시오.
"A"로 시작할 수있는 사람은 몇 명입니까? "A"뒤에 A, B, C, D, E 또는 F가 올 수 있으므로 6 가지 방법이 있습니다.
"B"로 시작할 수있는 사람은 몇 명입니까? 두 번째 "B"가 없기 때문에 A, C, D, E 또는 F가 뒤따를 수 있습니다.
"C"로 시작할 수있는 사람은 몇 명입니까? "C"가 목록에 3 번 나타나므로 "A"와 같이 6 가지 방법이있는 것처럼 그 뒤에 5 개 문자가 올 수 있습니다. "C"가 "A"보다 여러 번 나타나기 때문에 "추가"방법은 없습니다. 두 번째 외형은 중복되지 않습니다.
이제 목록에 한 번만 나타나는 각 문자가 다섯 단어의 시작 부분에 나타날 수 있고 두 번 이상 나타나는 문자가 여섯 단어의 시작 부분에 나타날 수 있음이 분명합니다. 한 번만 나타나는 문자는 "B", "E"및 "F"이며 각각 5 개 단어의 시작 부분에있을 수 있으므로 5 + 5 + 5 = 15 개 단어를 만듭니다. 두 번 이상 나타나는 문자는 "A", "C"및 "D"이며 각각 6 단어의 시작 부분에있을 수 있으므로 6 + 6 + 6 = 18 단어가됩니다. 총 15 + 18 = 33 단어가 있습니다.
이 방법은 다른 방법보다 훨씬 오래 걸리지 만이 체계적인 방식으로 답을 생각하면보다 빠른 방법 중 하나를 "발견"했을 수 있습니다.
이것이 확률 질문으로 표현 된 경우, 첫 번째 성향은 트리 다이어그램 을 그리는 것일 수 있습니다 . 첫 번째 글자는 6 개의 지점으로 시작했지만 두 번째 글자는 "A", "C"및 "D"에서 나오는 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! 적어도 공식 Scrabble Players Dictionary (OSPD5) 최신판에 따르면. 단어는 aa, ab, ad, ae, ba, be, da, de, ed, ef, fa 및 fe입니다. (이 단어들에 대해 들어 본 적이 없다는 사실이 그 유효성을 부정하지는 않는다는 점을 명심하십시오!); o)
내 "2 감각".
질문하는 방식에 문제가 있습니다. 실제로 "aabcccddef"행에서 2 글자 단어를 사용할 수있는 작업은 무엇입니까? 후자를 교체 할 수 있습니까? 아니면 불필요한 것을 건너 뛸 수 있습니까? 이 조건에 따라 두 가지 가능한 답변을 찾았습니다.
1) 우리는 이전에 언급 한 것처럼 어떤 식 으로든 답을 33으로 바꿀 수 있습니다. 30 쌍의 다른 글자 (6 * 5)와 3 쌍의 비슷한 글자.
2) 글자 위치를 바꿀 수없고 교차 할 수만 있다면 훨씬 적은 답을 얻을 수 있습니다. 처음부터 끝까지 세어 보자. "a"로 시작하면 두 번째로 6 글자가 있으며 "b"로 시작하면 4입니다. "c"에는 4, "d"-3 및 "e"-1도 있습니다. 총 18 자입니다.
질문에 대한 나의 대답 : aabcccddef에서 몇 자로 된 2 글자 단어를 얻을 수 있습니까?
* // 요점은 "단어 조합"이 아니라 "단어"라는 질문입니다. 단어를 사용하여 단어를 두 번 이상 사용하려면 문자가 두 번 나타나야합니다. 예를 들어 문자 'a'중 두 개와 문자 'd'중 두 개가 있으므로 'ad'를 단어로 두 번 쓸 수 있습니다.
[self-study]
태그 를 추가 하고 위키를 읽으십시오 .