नाइट डिस्टेंस


24

शतरंज में, ग्रिड पर एक नाइट (x, y) (x-2, y-1), (x-2, y + 1), (x-1, y-2), (x-1) पर जा सकती है y + 2), (x + 1, y-2), (x + 1, y + 2), (x + 2, y-1), (x + 2, y + 1) एक चरण में। केवल एक नाइट (0, 0) पर एक अनंत शतरंज की बिसात की कल्पना करें:

(0, 0) से (t x , t y ) तक नाइट ले जाने के लिए कितने चरणों की आवश्यकता होती है ?

इनपुट

दो पूर्णांक: टी एक्स , टी वाई ;

-100 <t x <100, -100 <t y <100

उत्पादन

न्यूनतम कदम (0, 0) से (t x , t y ) तक नाइट ले जाने के लिए आवश्यक कदम ।

नियम

  • कोड गोल्फ

परीक्षण के मामलों

  x    y -> out
  0,   0 ->  0
  0,   1 ->  3
  0,   2 ->  2
  1,   1 ->  2
  1,   2 ->  1
  3,   3 ->  2
  4,   0 ->  2
 42,  22 -> 22
 84,  73 -> 53
 45,  66 -> 37
 99,  99 -> 66
-45, -91 -> 46
-81,   1 -> 42
 11,  -2 ->  7

document.write('<div>');[..."EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CBCBABA9A9898787878787878787878989A9ABABCBC;BCBABA9A989878767676767676767878989A9ABABCB;CBABA9A98987876767676767676767878989A9ABABC;BABA9A9898787676565656565656767878989A9ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432323032323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA9A9898787676565656565656767878989A9ABAB;CBABA9A98987876767676767676767878989A9ABABC;BCBABA9A989878767676767676767878989A9ABABCB;CBCBABA9A9898787878787878787878989A9ABABCBC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE"].forEach(c=>document.write(c==';'?'<br>':`<span class="d-${c}">${c}</span>`));
document.write('<style>body{line-height:16px;color:rgba(255,255,255,0.2);}span{display:inline-block;width:16px;font-size:16px;text-align:center;}div{white-space:pre;}');[...'0123456789ABCDEF'].map((c,i)=>document.write(`.d-${c}{background:hsl(${60-4*i},80%,${65-2*i}%)}`));

संबंधित OEIS

आगे पढ़ने के लिए यहां कुछ OEIS दिए गए हैं

  • A018837 : अनंत शतरंज पर पहुंचने के लिए नाइट के लिए चरणों की संख्या (एन, 0)।
  • A018838 : अनंत शतरंज पर पहुंचने के लिए शूरवीरों की संख्या (n, n)।
  • A065775 : विकर्णों द्वारा पढ़ा गया ऐरे टी: टी (i, j) = एक बिसात पर शूरवीरों की कम से कम संख्या (सभी दिशाओं में अनंत) (0,0) से (i, j) तक जाने के लिए आवश्यक है।
  • A183041 : अनंत चेसबोर्ड पर नाइट की चालों की संख्या (0,0) से (n, 1)।


2
क्या मैं एक जटिल संख्या के रूप में इनपुट ले सकता हूं x+yi?
लिन

1
@ मुझे लगता है कि यह स्वीकार्य है।
tsh

@ user202729 ने परिणाम दिखाने के लिए कोड स्निपेट को अपडेट किया।
टीश

एक बहुत अच्छा नक्शा।
विलटेक

जवाबों:


11

वोल्फ्राम भाषा (गणितज्ञ) , 64 बाइट्स

अंतर्निहित का उपयोग करना KnightTourGraph

सहेजे गए 2 बाइट्स Mathe172 के लिए धन्यवाद ।

GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+4),y+2,(x-2)y-2]&

इसे ऑनलाइन आज़माएं!

ArrayPlot @ सरणी [GraphDistance [KnightTourGraph @@ ({एक्स, वाई} = पेट @ {##} + 5), 2y + 3, (एक्स 2) y-2] और, {} 65,65, - 32]


14
Mathematica
buildins

1
थोड़ा छोटा:GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+5),2y+3,(x-2)y-2]&
लुकास लैंग

इस भाषा के साथ क्या है? ये सभी बिल्ट-इन प्रीलोड कैसे आए हैं? क्या टैब के साथ एक वाक्यांश को पूरा करने की कोशिश में उम्र लगती है?
OganM

@OganM Mathematica अपने कमांड लाइन इंटरफ़ेस में ऑटो समापन का समर्थन नहीं करता है। नोटबुक इंटरफ़ेस में पूरा होने वाला ऑटो इस तरह दिखता है ।
alephalpha

1
@OganM हो सकता है कि डेवलपर्स एक ट्राइ (डेटा संरचना) का उपयोग करें, या सॉर्ट किए गए बिल-इन की सूची पर केवल द्विआधारी खोज। हां, रैखिक खोज क्यों? | ध्यान दें कि गणितज्ञ एक गैर-मुक्त बंद स्रोत भाषा है, इसलिए कोई भी नहीं जानता कि भविष्यवक्ता वास्तव में कैसे काम करता है। | वास्तविक प्रोग्रामर को ऑटो-पूर्ण की आवश्यकता नहीं है। : पी
user202729

7

जावास्क्रिप्ट (ईएस 6), 90 75 72 बाइट्स

A065775 के लिए दिए गए सूत्र से प्रेरित । लंबी दूरी के लिए नरक के रूप में धीमा (ऐसा नहीं)।

f=(x,y,z=x|y)=>z<0?f(-y,x):z>1?1+Math.min(f(x-1,y-2),f(x-2,y-1)):z*3^x&y

इसे ऑनलाइन आज़माएं!

कैसे?

हम z को बिटवाइज़ या x और y के बीच परिभाषित करते हैं ।

चरण 1

हम पहले यह सुनिश्चित करते हैं कि हम x और y दोनों को गैर-नकारात्मक होने के लिए मजबूर करके एक विशिष्ट चतुर्थांश में स्थित हैं । जब तक z <0 (जिसका अर्थ है कि या तो x या y ऋणात्मक है), हम पुनरावर्ती कॉल f (-y, x) की प्रक्रिया करते हैं :

(+1, -2) --> (+2, +1)
(-1, +2) --> (-2, -1) --> (+1, -2) --> (+2, +1)
(-1, -2) --> (+2, -1) --> (+1, +2)

चरण 2

जबकि हमारे पास z> 1 है (जिसका अर्थ है कि x या y 1 से अधिक है ), हम पुनरावर्ती रूप से उन दो चालों को आज़माते हैं जो हमें (0, 0) : f (x-1, y-2) और f के करीब लाते हैं ( x-2, y-1) । हम अंततः सबसे छोटा रास्ता रखते हैं।

चरण 3

जब z 1 से कम या उसके बराबर होता है , तो हम 3 संभावनाओं से बचे रहते हैं, जिन्हें संसाधित किया जाता है z*3^x&y(हम z*3-x*yइसके बजाय उपयोग कर सकते हैं )

  • x & y == 1 का तात्पर्य x | y == 1 और इसका मतलब है कि x = y = 1 । हमें (0, 0) तक पहुंचने के लिए दो और चालें चाहिए :

    २ चाल

  • x & y == 0 और x | y == 1 का मतलब है कि हमारे पास x = 1 / y = 0 या x = 0 / y = 1 है । हमें (0, 0) तक पहुंचने के लिए तीन और चालें चाहिए :

    3 चाल

  • x & y == 0 और x | y == 0 का अर्थ है कि हमारे पास पहले से ही x = y = 0 है

Chess.com से उधार लिए गए ग्राफिक्स


5

पायथन 3 , 90 बाइट्स

धन्यवाद tsh -11 बाइट्स के लिए!

def f(x,y):x=abs(x);y=abs(y);s=x+y;return(.9+max(x/4,y/4,s/6)-s/2+(s==1or x==y==2))//1*2+s

इसे ऑनलाइन आज़माएं!

(पाठकों को स्क्रॉल करने से बचने के लिए इनलाइन कोड फ़ॉर्मेटिंग। माफ़ करना, लेकिन मुझे अपना कार्यक्रम गोल्फ करना होगा)

बहुत कुशल है।


मैं इसके साथ कैसे आ सकता हूँ !?

1. समता

मान लेता है कि पूरा बोर्ड चेकरबोर्ड पैटर्न में रंगा हुआ है (यानी x+yविषम वाले सेल और x+yयहां तक ​​कि अलग-अलग रंगों से रंगे हुए हैं)।

ध्यान दें कि प्रत्येक चरण को दो अलग-अलग रंग की सेल के बीच कूदना चाहिए। इसलिए:

  • चरणों की संख्या की समता समता के बराबर होनी चाहिए x+y

2. अनुमोदन

मानता है कि नाइट समन्वय से शुरू होता है (0,0), और nकदम बढ़ गया है , और वर्तमान में है (x,y)
सरलता के लिए, मान लिया गया है x ≥ 0, y ≥ 0
हम निष्कर्ष निकाल सकते हैं:

  • के बाद से हर कदम xज्यादा से ज्यादा से बढ़ जाती है 2, x ≤ 2×n। इसी तरह, y ≤ 2×n
  • के बाद से हर कदम x+yज्यादा से ज्यादा से बढ़ जाती है 3, x+y ≤ 3×n

इसलिए, n ≥ l(x,y)जहां l(x,y) = max(max(x,y)/2, (x+y)/3। (ध्यान दें कि हम शामिल करने के लिए की जरूरत नहीं है -xया x-yसूत्र में इस धारणा से क्योंकि, x ≥ 0 and y ≥ 0है, तो x+y ≥ max(x-y,y-x,-x-y)और x ≥ -x, y ≥ -y)

यह पता चला है कि a(x,y) = round(0.4 + l(x,y))एक अच्छा सन्निकटन है n

  • मान लें a(x,y)कि त्रुटि के साथ एक सन्निकटन है 1, द्वारा सही मान दिया गया है

    f(x,y) = round((a(x,y) - (x+y)) / 2) * 2 + (x+y)

    ( x+y2 से घटाकर और विभाजित करके गोल )

3. विशेष मामले जो सूत्र को विफल करते हैं

मान लो x ≥ 0और y ≥ 0। 2 विशेष मामले हैं जहां एल्गोरिथ्म विफल रहता है:

  • x == 1 and y == 0या x == 0 and y == 1: 1सही उत्तर होने पर एल्गोरिथ्म गलत तरीके से लौटता है 3
  • x == y == 2: 2सही उत्तर होने पर एल्गोरिथ्म गलत तरीके से लौटता है 4

तो, बस विशेष-मामला उन। द्वारा परिणाम जोड़े 2की अगर मूल्य xऔर yउन में से एक रहे हैं।


1
@tsh लेकिन यह सच x==y==0भी है।
user202729

क्यों max(x+y,x-y,y-x)?
tsh

@tsh: नहीं, देखें: x = -5, y = 5. x + y = 0, abs (xy) = 10 और इसलिए x + y <abs (xy)
Nova

@ नोवा "मान लें x ≥ 0और y ≥ 0"।
user202729


4

टीआई-बेसिक, 86 54 बाइट्स

@ User202729 के पुराने समाधान पर आधारित है

Input :abs(X->C:abs(Y->D:C+Ans
Ans+2int(.9+(S=1 or C=2 and D=2)-.5Ans+max({C/4,D/4,Ans/6

2

MATL , 29 बाइट्स

`JEQ2J-htZjht_h@Z^2&sG=~}@Gg*

इनपुट पूर्णांक वास्तविक और काल्पनिक भागों के साथ एक जटिल संख्या है।

कोड बहुत अक्षम है। इसकी मेमोरी आवश्यकताएं आउटपुट के साथ तेजी से बढ़ती हैं। यह 7 से अधिक आउटपुट वाले परीक्षण मामलों के लिए टीआईओ में कई बार है।

इसे ऑनलाइन आज़माएं!


2

हास्केल, 79 72 बाइट्स

p l|elem(0,0)l=0|r<-[-2..2]=1+p[(x+i,y+j)|(x,y)<-l,i<-r,j<-r,(i*j)^2==4]

इसे ऑनलाइन आज़माएं!

इनपुट को संख्याओं के जोड़े की एकल सूची के रूप में लेता है ।

एक साधारण जानवर बल। परिणामों के लिए बहुत समय और मेमोरी चाहिए> 8. निर्देशांक (इनपुट) की एकल तत्व सूची के साथ शुरू करते हुए, बार-बार उन सभी पदों को जोड़ते हैं (0,0)जो इस सूची में होने तक हर तत्व तक पहुंच सकते हैं । पुनरावृत्ति स्तर पर नज़र रखें और परिणाम के रूप में इसे वापस करें।

संपादित करें: -7 बाइट्स @Lynn के लिए धन्यवाद।



1

जावास्क्रिप्ट (ईएस 6), 90 78 बाइट्स

f=(x,y)=>y<0?f(x,-y):x<y?f(y,x):x+y<3?4-x-y&3:x-3|y-1?x-4|y-3?f(x-2,y-1)+1:3:2

संपादित करें: सहेजे गए 12 बाइट्स @supercat को इंगित करते हुए बताते हैं कि या x<0तो इसका अर्थ है । स्पष्टीकरण: यह एक पुनरावर्ती समाधान है। पहली दो स्थितियाँ ही अन्य स्थितियों के लिए सही चतुर्थांश सुनिश्चित करती हैं। तीसरी स्थिति मूल के निकट निर्देशांक के लिए उत्तर उत्पन्न करती है, जबकि अंतिम दो स्थितियाँ अन्य दो विशेष मामलों (दोनों चालों के परीक्षण से कम 1 बाइट) के साथ व्यवहार करती हैं:y<0x<y

0
32
2++
+2++
+++3+
++++++
(etc.)

चिह्नित किए गए सभी वर्गों को +सीधे मूल की ओर ले जाकर और फिर पीछे हटते हुए निर्धारित किया जा सकता है।


क्या आपको x<0परीक्षण की आवश्यकता है ? उदाहरण के लिए -3,6 को देखते हुए, x<yपरीक्षण 6, -3 में बदल जाएगा, जो y<0परीक्षण 6,3 में बदल जाएगा, जो कि x<yपरीक्षण 3,6 में बदल जाएगा।
सुपरकैट

@ सिक्सरकट वास्तव में, जैसा कि पायथन कहेंगे, x>=y>=0...
नील

1

कोटलिन , 148 146 140 बाइट्स

fun s(x:Int,y:Int):Int=if(y<0)s(x,-y)else
if(x<y)s(y,x)else if(x+y<3)4-x-y and 3
else if(x!=3||y!=1)if(x!=4||y!=3)s(x-2,y-1)+1
else 3 else 2

इसे ऑनलाइन आज़माएं!


बहुत यकीन है कि आपको :Intरिटर्न प्रकार निर्दिष्ट करने की आवश्यकता नहीं है ।
थेरैल्फेरफैड

पुनरावर्ती कार्यों के लिए रिटर्न प्रकार की आवश्यकता होती है क्योंकि कंपाइलर स्मार्ट नहीं है कि वह किस प्रकार का पता लगा सके।
जॉनवेल्स

1
ओह, मैं पुनरावर्ती कॉल करने से चूक गया। वूप्स
therealfarfetchd

1

जेली , 27 26 25 23 बाइट्स

1,-pḤµ;UÆị
¢ṗS€;0i
0ç1#

इसे ऑनलाइन आज़माएं!

बहुत धीमी गति से; आउटपुट के लिए TIO पर कई बार 6 से अधिक। इनपुट के रूप में एक जटिल संख्या लेता है।

व्याख्या

कोड जटिल संख्याओं का उपयोग करता है क्योंकि यह एक मध्यवर्ती चरण में छोटा था और यह बहुत तेज़ भी लगता है; आप भी निकाल कर जोड़े इस्तेमाल कर सकते हैं Æiऔर जगह 0के साथ 0,0दूसरी पंक्ति पर।

1,-pḤµ;UÆị    Helper link. No arguments.
1,-             Get the pair [1,-1].
    Ḥ           Double each to get [2,-2].
   p            Cartesian product: get [[1,2],[1,-2],[-1,2],[-1,-2]].
     µ          Start a new chain with the list of pairs as argument.
       U        Reverse each pair.
      ;         Append the reversed pairs to the list.
        Æi      Convert each pair [real,imag] to a complex number.

¢ṗS€;0i    Helper link. Arguments: iterations, target
¢            Call the previous link to get knight moves as complex numbers.
 ṗ           Get the iterations-th Cartesian power of the list. This will
             yield 8^n tuples containing move sequences.
  S€         Sum each move sequence to get the resulting square.
    ;0       Add the starting square, since the zeroth iteration results
             in no move sequences.
      i      Find the target squares (1-based) index in the results, or 0.

0ç1#    Main link. Argument: target
0         Starting from 0,
   #      find the
  1       first number of iterations where
 ç        calling the previous link results in a nonzero result.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.