সুডোকু কিংয়ের ভ্রমণ সর্বাধিক করুন


16

পটভূমি

সুডোকু একটি সংখ্যা ধাঁধা যেখানে, একটি দেওয়া হয় এন×এন গ্রিড আকারের বক্স বিভক্ত এন , প্রতিটি সংখ্যা 1 থেকে এন প্রতিটি সারি, কলাম এবং বক্স একবার ঠিক প্রদর্শিত হওয়া উচিত।

দাবা খেলায়, রাজা ঘুরে ঘুরে যে কোনও একটি (সর্বাধিক) 8 সংলগ্ন কোষে যেতে পারেন। "সংলগ্ন" এর অর্থ এখানে অনুভূমিকভাবে, উলম্ব বা ত্রিভুজ সংলগ্ন।

কিংস সফর নাইট সফর একজন উপমা হয়; এটি এমন একটি (সম্ভবত খোলা) পথ যা দাবা কিংয়ের আন্দোলনের সাথে প্রদত্ত বোর্ডে প্রতিটি কক্ষটি একবারে পরিদর্শন করে।

কার্য

6-বাই-6 সুডোকু গ্রিড বিবেচনা করুন:

654 | 321
123 | 654
----+----
462 | 135
315 | 246
----+----
536 | 412
241 | 563

এবং (থেকে একটি কিংস সফর 01করার 36):

01 02 03 | 34 35 36
31 32 33 | 04 05 06
---------+---------
30 23 28 | 27 26 07
22 29 24 | 25 09 08
---------+---------
21 19 16 | 10 14 13
20 17 18 | 15 11 12

ট্যুরটি 36-সংখ্যার নম্বর গঠন করে 654654564463215641325365231214123321

একটি পৃথক কিং সফর গ্রহণ বড় সংখ্যা দেয়; উদাহরণস্বরূপ, আমি এমন একটি পথ খুঁজে পেতে পারি যা শুরু করে 65<6>56446556...যা অবশ্যই অবশ্যই উপরের চেয়ে বড়। আপনি আরও বেশি নম্বর পেতে সুডোকু বোর্ড পরিবর্তন করতে পারেন:

... | ...
.6. | ...
----+----
..6 | ...
.5. | 6..
----+----
.45 | .6.
6.. | 5..

এই অসম্পূর্ণ বোর্ডটি প্রারম্ভিক ক্রম দেয় 666655546...যার 9 টি প্রাথমিক অঙ্কের অনুকূল সিকোয়েন্স।

আপনার টাস্ক হয় 3-দ্বারা-3 বক্স সঙ্গে জন্য আদর্শ 9-দ্বারা-9 সুডোকু বৃহত্তম এমন সংখ্যা খুঁজে বের , অর্থাৎ

... | ... | ...
... | ... | ...
... | ... | ...
----+-----+----
... | ... | ...
... | ... | ...
... | ... | ...
----+-----+----
... | ... | ...
... | ... | ...
... | ... | ...

মনে রাখবেন যে এই চ্যালেঞ্জটি ; ফোকাস হ'ল তাত্ত্বিকভাবে কাজ করা একটি ছোট প্রোগ্রাম লেখার চেয়ে সমাধানগুলি অনুসন্ধান করা।

স্কোরিং এবং বিজয়ী মানদণ্ড

জমা দেওয়ার স্কোরটি হ'ল আপনার প্রোগ্রামের দ্বারা পাওয়া ৮১-সংখ্যার নম্বর। সর্বোচ্চ স্কোর সহ জমাটি জয়লাভ করে। আপনার প্রোগ্রামটি সুডোকু গ্রিড এবং মানব পাঠযোগ্য আকারে কিংয়ের ভ্রমণকে আউটপুট করা উচিত; এগুলি আপনার জমা দেওয়ার অন্তর্ভুক্ত করুন।

আপনার প্রোগ্রাম একাধিক ফলাফল আউটপুট করতে পারে; আপনার স্কোর তাদের সর্বোচ্চ।

আপনার প্রোগ্রামের জন্য কোনও সময়সীমা নেই। যদি আপনার প্রোগ্রামটি চলতে থাকে এবং তার পরে আরও একটি উচ্চ সংখ্যা খুঁজে পায় তবে আপনি পোস্টটি সম্পাদনা করে জমা দেওয়ার স্কোরটি আপডেট করতে পারেন। টাইব্রেকার হ'ল স্কোর অর্জনের প্রথমতম সময়, যেমন হয় পোস্টের সময় (যদি এটি এখনও সম্পাদনা না করা হয়) বা স্কোর আপডেট হওয়ার সময় সম্পাদনার সময় (অন্যথায়)।


2
আপনার উপর এই চ্যালেঞ্জের স্ব-মনোনয়ন PPCG শ্রেষ্ঠ স্বরূপ, আপনি উল্লেখ করেন যে, "এটি সম্ভবত প্রথম [কোড-চ্যালেঞ্জ] বরং কিছু কোড দৈর্ঘ্য বা এই ধরনের সঙ্গে মিলিত স্কোর চেয়ে অপ্টিমাইজ সমাধান জন্য সরাসরি জিজ্ঞাসা করতে হয়।" আমি আপনাকে কেবল এটি জানাতে চেয়েছিলাম যে এটি সত্য নয় - 2015 সালে পোস্ট করা হয়েছে যা সংক্ষিপ্ত ইউনিভার্সাল ম্যাজ এক্সিট স্ট্রিং রয়েছে
এসোলাং ফলস

উত্তর:


19

পাইথন + জেড 3 , 999899898789789787876789658767666545355432471632124566352413452143214125313214321, অনুকূল

উত্পাদন করে, প্রায় আধ ঘন্টা ধরে চলে

1 3 4 8 9 7 6 2 5
2 9 7 1 5 6 8 3 4
5 6 8 4 2 3 7 9 1
4 7 6 2 1 5 9 8 3
8 5 1 6 3 9 2 4 7
9 2 3 7 8 4 1 5 6
3 8 5 9 6 1 4 7 2
6 4 9 5 7 2 3 1 8
7 1 2 3 4 8 5 6 9
81 79 78 14 15 16 54 57 56
80 12 13 77 52 53 17 55 58
34 33 11 51 76 75 18  1 59
35 10 32 50 74 72  2 19 60
 9 36 49 31 73  3 71 61 20
 8 48 37 30  4 69 70 62 21
47  7 38  5 29 68 65 22 63
46 43  6 39 28 67 66 64 23
44 45 42 41 40 27 26 25 24
999899898789789787876789658767666545355432471632124566352413452143214125313214321

কোড

import z3


def adj(a):
    x, y = a
    for x1 in range(max(0, x - 1), min(9, x + 2)):
        for y1 in range(max(0, y - 1), min(9, y + 2)):
            if (x1, y1) != a:
                yield x1, y1


solver = z3.SolverFor("QF_FD")

squares = list((x, y) for x in range(9) for y in range(9))
num = {(x, y): z3.Int(f"num{x}_{y}") for x, y in squares}
for a in squares:
    solver += 1 <= num[a], num[a] <= 9
for cells in (
    [[(x, y) for y in range(9)] for x in range(9)]
    + [[(x, y) for x in range(9)] for y in range(9)]
    + [
        [(x, y) for x in range(i, i + 3) for y in range(j, j + 3)]
        for i in range(0, 9, 3)
        for j in range(0, 9, 3)
    ]
):
    solver += z3.Distinct([num[x, y] for x, y in cells])
    for k in range(1, 10):
        solver += z3.Or([num[x, y] == k for x, y in cells])

move = {
    ((x0, y0), (x1, y1)): z3.Bool(f"move{x0}_{y0}_{x1}_{y1}")
    for x0, y0 in squares
    for x1, y1 in adj((x0, y0))
}
tour = {(x, y): z3.Int(f"tour{x}_{y}") for x, y in squares}
for a in squares:
    solver += 0 <= tour[a], tour[a] < 81
for a in squares:
    solver += z3.PbEq([(move[a, b], 1) for b in adj(a)] + [(tour[a] == 80, 1)], 1)
for b in squares:
    solver += z3.PbEq([(move[a, b], 1) for a in adj(b)] + [(tour[b] == 0, 1)], 1)
solver += z3.Distinct([tour[a] for a in squares])
for t in range(81):
    solver += z3.Or([tour[a] == t for a in squares])
for a in squares:
    for b in adj(a):
        solver += move[a, b] == (tour[a] + 1 == tour[b])

value = [z3.Int(f"value{t}") for t in range(81)]
for t in range(81):
    solver += 1 <= value[t], value[t] <= 9
for a in squares:
    for t in range(81):
        solver += z3.Implies(tour[a] == t, num[a] == value[t])

assert solver.check() != z3.unsat
opt = 0
while opt < 81:
    model = solver.model()
    for y in range(9):
        print(*(model[num[x, y]] for x in range(9)))
    for y in range(9):
        print(*(f"{model[tour[x, y]].as_long() + 1:2}" for x in range(9)))
    best = [model[value[t]].as_long() for t in range(81)]
    print(*best, sep="")
    print()
    while opt < 81:
        improve = z3.Bool(f"improve{opt}_{best[opt]}")
        solver += improve == (value[opt] > best[opt])
        if solver.check(improve) != z3.unsat:
            break
        solver += value[opt] == best[opt]
        opt += 1

নিশ্চয়ই আমি সমস্যাটিকে অনেক বেশি গুরুত্ব দিয়েছি। এবং আমি জেড 3 এর অন্ধকার যাদুটি সম্পূর্ণরূপে ভুলে গিয়েছিলাম ...
বুদ্বুদ

@ বুবলার নিশ্চিত হওয়া যে একটি সর্বোত্তম সমাধান সহজলভ্য নয় is আমি নিজেও একই ভুলটি করেছি - এবং কেউ সর্বোত্তম সমাধান পোস্ট করার আগে আমার চেয়েও কম সময় স্থায়ী হয়েছিল ... কোডগল্ফ.স্ট্যাকেক্সেঞ্জার
৫৯

খনি উদ্ধারযোগ্য নয়, তবে আমি অবাক হয়েছি যে যদি এই চ্যালেঞ্জটি একটি বড় বোর্ড এবং একটি ভিন্ন দাবা টুকরো (সম্ভবত
এটির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.