गणितज्ञ, परीक्षण मामलों पर इष्टतम व्यवहार, 260 बाइट्स
For[a=f=1;{c,h}=Input@Grid;z=Characters;t=<|Thread[z@#->#2]|>&;r="";v=Floor[+##/2]&;b:=a~v~c;g:=f~v~h,r!="y",r=Input[g Alphabet[][[b]]];{{a,c},{f,h}}={t["NSu",{{a,b-1},{b+1,c},{b,b}}]@#,t["uWX",{{g,g},{f,g-1},{g+1,h}}]@#2}&@@Sort[z@r/.{c_}:>{c,"u"}/."E"->"X"]]
इस कार्यक्रम को वुल्फराम क्लाउड में उपरोक्त कोड को काटकर और पेस्ट करके परीक्षण किया जा सकता है । (जल्दी से परीक्षण करें, हालांकि: मुझे लगता है कि प्रत्येक कार्यक्रम को चलाने के लिए एक समय सीमा है।) कार्यक्रम का अनुमान 2 c
इसके बजाय की तरह दिखता है C2
, लेकिन अन्यथा यह ऊपर की कल्पना के अनुसार चलता है। ग्रिड को एक पूर्ण जोड़े के पूर्णांक के रूप में इनपुट होना चाहिए, जैसे {26,100}
, और प्रोग्राम के अनुमानों पर प्रतिक्रियाएं स्ट्रिंग्स के रूप में "NE"
या जैसे इनपुट होनी चाहिए "y"
।
कार्यक्रम छोटी और सबसे बड़ी पंक्ति संख्या और स्तंभ संख्या का ट्रैक रखता है जो अब तक के इनपुट के अनुरूप है, और हमेशा संभावनाओं के सबग्रिड के केंद्र बिंदु का अनुमान लगाता है (एनडब्ल्यू को गोल करता है)। कार्यक्रम नियतात्मक है, इसलिए एक निश्चित ग्रिड पर औसतन इसके लिए आवश्यक अनुमानों की संख्या की गणना करना आसान है। 10x10 ग्रिड पर, प्रोग्राम को एक एकल वर्ग के लिए 1 अनुमान, 8 वर्ग के लिए 2 अनुमान, 64 वर्गों के लिए 3 अनुमान और शेष 27 वर्गों के लिए 4 अनुमान, 3.17 के औसत के लिए आवश्यक है; और यह सैद्धांतिक न्यूनतम है, यह देखते हुए कि कितने 1-अनुमान, 2-अनुमान, आदि अनुक्रम सही अनुमान लगा सकते हैं। वास्तव में, कार्यक्रम को समान कारणों के लिए किसी भी आकार के ग्रिड पर सैद्धांतिक न्यूनतम हासिल करना चाहिए। (5x5 ग्रिड पर, अनुमानों की औसत संख्या 2.6 है।)
थोड़ा कोड स्पष्टीकरण, हालांकि यह गोल्फिंग के अलावा काफी सीधा है। (मैंने एक्सपोज़ररी उद्देश्यों के लिए कुछ प्रारंभिक बयानों के क्रम का आदान-प्रदान किया - बाइट काउंट पर कोई प्रभाव नहीं।)
1 For[a = f = 1; z = Characters; t = <|Thread[z@# -> #2]|> &;
2 v = Floor[+##/2] &; b := a~v~c; g := f~v~h;
3 r = ""; {c, h} = Input@Grid,
4 r != "y",
5 r = Input[g Alphabet[][[b]]];
6 {{a, c}, {f, h}} = {t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]@#,
7 t["uWX", {{g, g}, {f, g - 1}, {g + 1, h}}]@#2} & @@
8 Sort[z@r /. {c_} :> {c, "u"} /. "E" -> "X"]
]
लाइनें 1-3 For
लूप को इनिशियलाइज़ करती हैं , जो वास्तव While
में भेस में सिर्फ एक लूप है, इसलिए हे, दो कम बाइट्स। किसी भी क्षण संभव पंक्ति-संख्या और स्तंभ-संख्या श्रेणियां संग्रहीत होती हैं {{a, c}, {f, h}}
, और उस उप-ग्रिड में केंद्रित अनुमान {b, g}
पंक्ति 2 में परिभाषित कार्यों द्वारा गणना की जाती है । पंक्ति 3 उपयोगकर्ता इनपुट से अधिकतम-पंक्ति c
और अधिकतम-स्तंभ h
को प्रारंभ करती है , और r
लूप-टेस्टेड वैरिएबल और इसके बाद के यूजर इनपुट्स को भी इनिशियलाइज़ करता है।
जबकि लाइन 4 पर परीक्षण संतुष्ट है, लाइन 5 को उपयोगकर्ता से इनपुट मिलता है, जहां वर्तमान अनुमान से संकेत मिलता है {b, g}
( Alphabet[][[b]]]
पंक्ति संख्या को एक पत्र में परिवर्तित करता है)। फिर लाइनें 6-8 सबग्रिड-ऑफ-प्रॉस्पेक्ट्स को अपडेट करती हैं (और इसलिए अगले अनुमान से)। उदाहरण के लिए, t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
( t
लाइन 1 की परिभाषा को देखते हुए ) का विस्तार होता है
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
जहां आप उपयोगकर्ता के अंतिम इनपुट के अनुसार अपडेट की जा रही न्यूनतम-पंक्ति और अधिकतम-पंक्ति संख्या देख सकते हैं। पंक्ति 8 किसी भी संभावित इनपुट को प्रपत्र के वर्णों के क्रमबद्ध जोड़े में परिवर्तित करती है { "N" | "S" | "u", "u" | "W" | "X"}
; यहाँ "u"
एक सही पंक्ति या स्तंभ है, और "X"
पूर्व के लिए खड़ा है (सिर्फ Sort
अच्छी तरह से काम करने की अनुमति देने के लिए)। जब उपयोगकर्ता अंततः इनपुट करता है "y"
, तो ये लाइनें एक त्रुटि फेंकती हैं, लेकिन फिर लूप-टेस्ट विफल हो जाता है और त्रुटि कभी भी प्रचारित नहीं होती है (कार्यक्रम बस वैसे भी रुक जाता है)।
A1
और कंप्यूटर अनुमान लगा रहा हैB9
, तो उचित प्रतिक्रिया हैNW
याW
?