つまり、すべての数字 _ _ _ _ _ _ は個別のものであり、入力できるのは 2 から 9 までの値のみです。配列とループを使用してみましたが、すべての数値を表示する解決策がわかりませんでした。例 2 から 9 までの 7 桁の数字: 234567 234568 234569
324567 324568 324569
これらの値の数字が繰り返されていないことに注意してください。何が起こっているのか本当にわかりません。私を助けてください!
つまり、すべての数字 _ _ _ _ _ _ は個別のものであり、入力できるのは 2 から 9 までの値のみです。配列とループを使用してみましたが、すべての数値を表示する解決策がわかりませんでした。例 2 から 9 までの 7 桁の数字: 234567 234568 234569
324567 324568 324569
これらの値の数字が繰り返されていないことに注意してください。何が起こっているのか本当にわかりません。私を助けてください!
言語を指定しなかったので、ここに Haskell の回答があります。
import Control.Monad
selectPerms :: MonadPlus m => [a] -> Int -> m [a]
selectPerms _ 0 = return []
selectPerms universe n = do
(digit, remain) <- selectDigit universe
xs <- selectPerms remain (n - 1)
return (digit:xs)
selectDigit :: MonadPlus m => [a] -> m (a, [a])
selectDigit [] = mzero
selectDigit (x:xs) = capture `mplus` next
where
capture = return (x, xs)
next = do
(digit, remain) <- selectDigit xs
return (digit, x:remain)
yourAnswer :: [[Int]]
yourAnswer = selectPerms [2..9] 7
これはどうも宿題のように聞こえるので、ここでの教育は段階的なプロセスになります。まず、力ずくで試してみてください。これを行うアルゴリズム(まあ、実際にはPython)は次のとおりです。
for n1 in range(2,10):
for n2 in range(2,10):
if n2 != n1:
for n3 in range(2,10):
if n3 != n2 and n3 != n1:
for n4 in range(2,10):
if n4 != n3 and n4 != n2 and n4 != n1:
for n5 in range(2,10):
if n5 != n4 and n5 != n3 and n5 != n2 and n5 != n1:
for n6 in range(2,10):
if n6 != n5 and n6 != n4 and n6 != n3 and n6 != n2 and n6 != n1:
for n7 in range(2,10):
if n7 != n6 and n7 != n5 and n7 != n4 and n7 != n3 and n7 != n2 and n7 != n1:
print "%d%d%d%d%d%d%d"%(n1,n2,n3,n4,n5,n6,n7)
これは基本的に、各桁位置に 1 つずつ、7 つのネストされたループであり、どの時点でも重複がないことを確認します。これは、多数の桁位置に適切にスケーリングできるソリューションではないことに注意してください。ただし、7 つの桁位置では非常にうまく機能します。もっと多くが必要な場合は、ブルートフォースの少ないソリューションが適しています。
abcdefg を並べ替える方法は 7!=5040 通りあります。
123456789 の中から 7 つの数を選ぶには9 C 7 =36 の方法があります。
順列 "bfgdeac" と {1,3,4,5,6,8,9} のセットが与えられた場合、順列を使用してセットの順序を指定する自然な方法があります。つまり、[3,8,9 、5,6,1,4]。
Python のitertools docsから借用。
def permutations(iterable, r=None):
# http://docs.python.org/library/itertools.html#itertools.permutations
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n:
return
indices = range(n)
cycles = range(n, n-r, -1)
yield tuple(pool[i] for i in indices[:r])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
yield tuple(pool[i] for i in indices[:r])
break
else:
return
for number in permutations('23456789',6): # you said 7, but your examples were 6
print number
編集:またはとにかくPythonを持っている場合...
import itertools
for number in itertools.permutations('23456789',6): print number