सुडोकू राजा के दौरे को अधिकतम करें


16

पृष्ठभूमि

सुडोकू एक संख्या पहेली है, जहाँ एक n×n ग्रिड को आकार n बक्सों में विभाजित किया गया है , प्रत्येक संख्या 1 से n प्रत्येक पंक्ति, स्तंभ और बॉक्स में एक बार दिखाई देनी चाहिए।

शतरंज के खेल में, राजा एक बारी में (आस-पास) 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 शुरुआती अंकों का इष्टतम अनुक्रम है।

आपका कार्य मानक 9-बाय -9 सुडोकू के लिए 3-बाय -3 बॉक्स के साथ सबसे बड़ी संख्या ढूंढना है , अर्थात

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

ध्यान दें कि यह चुनौती ; फोकस वास्तव में एक छोटे से प्रोग्राम को लिखने के बजाय समाधान खोजने के लिए है जो सैद्धांतिक रूप से काम करता है।

स्कोरिंग और जीतने की कसौटी

सबमिशन का स्कोर आपके प्रोग्राम द्वारा पाया गया 81-अंकीय संख्या है।उच्चतम स्कोर के साथ सबमिशन जीतता है। आपके कार्यक्रम को मानव-पठनीय रूप में सुडोकू ग्रिड और राजा के दौरे का भी उत्पादन करना चाहिए; कृपया उन्हें अपने सबमिशन में शामिल करें।

आपका कार्यक्रम कई परिणामों का उत्पादन कर सकता है; आपका स्कोर उनमें से अधिकतम है।

आपके कार्यक्रम के लिए कोई समय सीमा नहीं है। यदि आपका कार्यक्रम चलता रहता है और बाद में अधिक संख्या पाता है, तो आप पोस्ट को संपादित करके सबमिशन के स्कोर को अपडेट कर सकते हैं। टाईब्रेकर स्कोर प्राप्त करने का सबसे शुरुआती समय है, अर्थात या तो पोस्ट का समय (यदि इसे अभी तक संपादित नहीं किया गया है) या स्कोर के अद्यतन के समय (अन्यथा)।


2
बेस्ट ऑफ़ पीपीसीजी के लिए इस चुनौती के अपने नामांकन पर , आपने उल्लेख किया है कि "कोड की लंबाई या ऐसे के साथ संयुक्त कुछ स्कोर के बजाय, अनुकूलित समाधान के लिए सीधे पूछने के लिए यह संभवतः पहली [कोड-चुनौती] है।" मैं आपको यह बताना चाहता हूं कि यह सच नहीं है - इसमें सबसे छोटा यूनिवर्सल भूलभुलैया एग्जिट स्ट्रिंग है, जो 2015 में पोस्ट किया गया था
फल

जवाबों:


19

अजगर + जेड ३ , ९९९ 89 ९९९ on89656587878765678989896587878787676666666666 +6565656565454545454535353535353535535 5 51231243242424242424 242424242424242413454545454545454545125125125125125 125 32३३२३१२३१४३११, इष्टतम

उत्पादन के बारे में आधे घंटे में चलता है

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

निश्चित रूप से मैंने समस्या के तरीके को बहुत अधिक बढ़ा दिया। और मैं Z3 के काले जादू को पूरी तरह से भूल गया ...
बुबलर

@ बबलर निश्चित रूप से एक इष्टतम समाधान है जो पहुंच से बाहर है मुश्किल है। मैंने खुद वही गलती की है - और मेरा इससे भी कम समय पहले किसी ने एक इष्टतम समाधान पोस्ट किया ... codegolf.stackexchange.com/a/51974/20283
trichoplax

मेरा बचाव योग्य नहीं है, लेकिन मुझे आश्चर्य है कि अगर यह चुनौती एक बड़े बोर्ड और एक अलग शतरंज के टुकड़े के साथ भिन्नता के रूप में काम कर सकती है (शायद यह एक को वापस जोड़ने की चुनौती पर एक अनुसरण करें)
ट्राइकोप्लेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.