2012-05-08 1 views
2

数字の0-9を使用する最古の日付を見つけるには、0〜9の数字をDD/MM HH:MMの形式で1回だけ使用すると、 :SS。実際の答えは次のようになります:26/03 17:48:59DD/MM HH:MM:SS

+0

ブルートフォース10!可能性は依然として妥当な時間内に計算可能である。最低文字数の月から始めて、賢明にそれを実行し、実現可能な解決策を最初に見つけたときに終了することもできます。 – amit

+3

いいえ、アルゴリズムは必要ありません。すでに質問に対する回答があります。 –

+0

私は答えを知っていますが、プログラムを使って計算しようとしています。 – devsathish

答えて

3

[0 ... 9]のすべての順列を生成し、それらが有効な日付であるかどうかを確認します。

10! = 3 628 800

効率を改善したい場合は、バックトラッキングが役立ちます。この場合、単なる制約充足問題であり、有効日数は順列の数よりはるかに少ない。時間(10秒の時間)の最初の数字が0または1にする必要があるので、また、あなたは、例えば

01が動作しないなど

、その後、最低一日、最低月の順にそれらを考慮することができます 02は、時間の最初の桁が1でなければならず、日付は2月に0,1,2にしかならないため、機能しません。

など。

FWIW - のみ769有効な日付

import datetime 
import itertools 

count = 1 
for perm in itertools.permutations(range(10)): 

    i = 0; 
    day = perm[i]+perm[i+1]*10 
    i+=2 
    month = perm[i]+perm[i+1]*10 
    i+=2 
    hour = perm[i]+perm[i+1]*10 
    i+=2 
    minute = perm[i]+perm[i+1]*10 
    i+=2 
    second = perm[i]+perm[i+1]*10 
    try: 
     print datetime.datetime(2012, month, day, hour, minute, second) 
     count+=1 
    except: 
     pass 

print count 
1

これはconstraint satisfaction problemあるがあります。 MM/DD HH:MM:SSの日付形式で最初に作業し、後で回答を変換することができます。この形式では、辞書的に最小の有効な日付文字列が検索の答えになります。したがって、体系的に検索すると、最初に見つかった有効な日付が解決されます。

本質的に、スペースの検索には12 x 31 x 24 x 60 x 60のほとんど有効な日付があります。だから、あなたの制約が含まれます:

month < 13 
day < 32 
hour < 24 
minutes < 60 
seconds < 60 
occurrence(date, i) == 1 for each i = 0 to 9 

あなたは、検索空間を体系的に進めるためにbacktracking search algorithmを使用することができます。

関連する問題