Şövalye mesafe


24

Satrançta, ızgaradaki bir şövalye (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) bir adımda. Sadece bir şövalye ile (0, 0) sonsuz bir satranç tahtası düşünün:

Bir Şövalyeyi (0, 0) 'dan (t x , t y )' ya taşımak için kaç adım gerekir ?

Girdiler

İki tamsayı: t x , t y ;

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

Çıktı

Bir Şövalyeyi (0, 0) 'dan (t x , t y )' ye taşımak için minimum adım gerekir .

kurallar

  • kod golf

testcases

  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}%)}`));

İlgili OEIS

İşte daha fazla okuma için bazı OEIS

  • A018837 : Şövalyenin sonsuz satranç tahtasında ulaşabileceği adım sayısı (n, 0).
  • A018838 : Şövalyenin sonsuz satranç tahtasında ulaşabileceği adım sayısı (n, n).
  • A065775 : Dizi T köşegenlerle okundu: T (i, j) = (0,0) 'den (i, j)' e hareket etmek için gerekli olan en az sayıda şövalye satranç tahtası (her yöne sonsuz) hareketi.
  • A183041 : En az sayıda şövalye, sonsuz satranç tahtasında (0,0) 'dan (n, 1)' e hareket eder.


2
Girdiyi karmaşık sayı olarak alabilir miyim x+yi?
Lynn,

1
@ Lynn kabul edilebilir olduğunu düşünüyorum.
tsh 27/18

@ user202729 sonucu göstermek için kod pasajını güncelledi.
tsh

Çok güzel bir harita.
Willtech

Yanıtlar:


11

Wolfram Dili (Mathematica) , 64 bayt

Yerleşik kullanımı KnightTourGraph.

Mathe172 sayesinde 2 bayt kaydedildi .

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

Çevrimiçi deneyin!

ArrayPlot @ Dizi [GraphDistance [KnightTourGraph @@ ({x, y} '= Abs @ {##} + 5), 2y + 3, (a-2) y-2], {65,65}, - 32]


14
Mathematica yerleşikleri tekrar grev
27.03.2018

1
Biraz daha kısa:GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+5),2y+3,(x-2)y-2]&
Lukas Lang

Bu dilin nesi var? Tüm bu yerleşikler nasıl önceden yüklenir? Sekmeli bir cümleyi tamamlamaya çalışmak yaş alır mı?
OganM

@OganM Mathematica, komut satırı arayüzünde otomatik tamamlamayı desteklemiyor. Dizüstü arayüzünde otomatik tamamlama benziyor bu .
alephalpha

1
@OganM Belki geliştiriciler bir Trie (veri yapısı) ya da sıralanmış yerleşikler listesinde sadece ikili arama kullanırlar. Evet, neden doğrusal arama? | Mathematica'nın özgür olmayan bir kapalı kaynak dili olduğunu unutmayın, bu nedenle tahmin edenin gerçekte nasıl çalıştığını kimse bilmiyor. | Gerçek programcılar otomatik tamamlama gerektirmez. : P
kullanıcı202729

7

JavaScript (ES6), 90 75 72 bayt

A065775 için verilen formülden esinlenmiştir . Uzun mesafeler için cehennem kadar yavaş.

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

Çevrimiçi deneyin!

Nasıl?

Z yi bit cinsinden VEYA x ve y arasında tanımlarız .

Aşama 1

Biz ilk biz de zorlayarak belirli kadranında yer almıyor sağlamak x ve y negatif olmayan olmak. Z <0 olduğu sürece (bu, x veya y'nin negatif olduğu anlamına gelir ), özyinelemeli f (-y, x) çağrısını işleriz :

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

Adım 2

Elimizdeki da z> 1 (ya da hangi bu araçlar X veya Y den daha büyük olan 1 ), biz yinelemeli olarak iki yakın bize getirmek hareket deneyin (0, 0) : f (x-1, Y-2) ve f ( x-2, y-1) . Sonunda en kısa yolu izliyoruz.

Aşama 3

Tüm Z daha az ya da buna eşit olan , 1 , biz işlenir 3 olası ile sol z*3^x&y(yarar bir z*3-x*yyerine):

  • x & y == 1 , x anlamına gelir | y == 1 ve x = y = 1 olduğu anlamına gelir . Ulaşmak için iki hamle daha yapmamız gerekiyor (0, 0) :

    2 hamle

  • x & y == 0 ve x | y == 1 , ya x = 1 / y = 0 ya da x = 0 / y = 1 olduğunu gösterir . Ulaşmak için üç hamle daha ihtiyacımız var (0, 0) :

    3 hamle

  • x & y == 0 ve x | y == 0 zaten x = y = 0 olduğumuz anlamına gelir .

Chess.com'dan ödünç alınan grafikler


5

Python 3 , 90 bayt

-11 bayt için teşekkürler tsh!

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

Çevrimiçi deneyin!

(satır içi kod biçimlendirme okuyucuların kaydırma yapmaktan kaçınmasını önlemek için. Üzgünüm, ancak programımı golf oynamak zorundayım)

Çok çok verimli.


Bununla nasıl gelebilirim?

1. Parite

Tüm tahtanın dama tahtası renginde (yani, x+ytek hücreli ve x+yhatta farklı renklerle renkli) olduğunu varsayalım.

Her adımın iki farklı renkli hücre arasında atlanması gerektiğini unutmayın. Bu nedenle:

  • Adım sayısının paritesi, paritesine eşit olmalıdır x+y.

2. Yaklaşım

Şövalyenin koordinattan başladığını (0,0)ve nadım attığını ve şu anda bulunduğunu varsayar (x,y).
Kolaylık olması açısından, varsayar x ≥ 0, y ≥ 0.
Sonuçlandırabiliriz:

  • Her bir adım yana xen artar 2, x ≤ 2×n. Benzer şekilde y ≤ 2×n.
  • Her bir adım yana x+yen artar 3, x+y ≤ 3×n.

Bu nedenle, n ≥ l(x,y)nerede l(x,y) = max(max(x,y)/2, (x+y)/3. (biz dahil etmek gerekmez notu -xveya x-yformüldeki çünkü varsayımı ile, x ≥ 0 and y ≥ 0bu yüzden x+y ≥ max(x-y,y-x,-x-y)ve x ≥ -x, y ≥ -y)

Bunun a(x,y) = round(0.4 + l(x,y))için iyi bir yaklaşım olduğu ortaya çıktı n.

  • Varsayalım a(x,y)ki hatadan daha az olan bir yaklaşımdır 1, doğru değer

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

    (çıkarma x+yve ikiye bölen yuvarlak )

3. Formülün başarısız olduğu özel durumlar

Varsayalım x ≥ 0ve y ≥ 0. Algoritmanın başarısız olduğu 2 özel durum vardır:

  • x == 1 and y == 0veya x == 0 and y == 1: 1Doğru cevap ise algoritma yanlış döner 3.
  • x == y == 2: 2Doğru cevap ise algoritma yanlış döner 4.

Yani, sadece özel durumda olanlar. 2Sonucu, değeri xve ybunlardan biriyse ekleyin .


1
@ tsh Ama bu da doğru x==y==0.
user202729

Neden max(x+y,x-y,y-x)?
tsh

@tsh: Hayır, bakınız: x = -5, y = 5. x + y = 0, abs (xy) = 10 ve bu nedenle x + y <abs (xy)
Nova

@ Nova "Varsay x ≥ 0ve y ≥ 0".
user202729

4

Python 2 , 87 bayt

f=lambda z,a={0}:1-({z}<=a)and-~f(z,{k+1j**i*(2-i/4*4+1j)for k in a for i in range(8)})

Çevrimiçi deneyin!

Girdiyi karmaşık sayı olarak alır z = complex(tx, ty).


4

TI-Basic, 86 54 bayt

@ User202729 eski çözümüne göre

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 bayt

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

Girdi, tamsayı ve hayali parçaları olan karmaşık bir sayıdır.

Kod çok verimsiz. Bellek gereksinimleri çıktı ile katlanarak artar. Çıkışı 7'yi aşan test durumları için TIO'da zaman aşımına uğradı.

Çevrimiçi deneyin!


2

Haskell, 79 72 bayt

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]

Çevrimiçi deneyin!

Girdiyi tek bir çift ​​sayısının listesi olarak alır.

Basit bir kaba kuvvet. Sonuçlar> 8 için çok zaman ve bellek gerekiyor. Tek bir öğe koordinat listesiyle (giriş) başlayarak (0,0), bu listeye girene kadar her öğe için ulaşılabilecek tüm konumları tekrar tekrar ekleyin . Özyineleme seviyesini takip edin ve sonuç olarak geri gönderin.

Düzenleme: @Lynn sayesinde -7 bayt.



1

JavaScript (ES6), 90 78 bayt

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

Düzenleme: işaret @supercat buna Kaydedilen 12 sayesinde bayt x<0ima ya y<0yax<y . Açıklama: Bu özyinelemeli bir çözümdür. İlk iki koşul, diğer şartlar için doğru kadranı sağlar. Üçüncü koşul, menşei yakınlarındaki koordinatlara cevap verirken, son iki koşul diğer iki özel durumla ilgilidir (her iki hareketi de test etmekten 1 bayt daha kısa):

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

+İşaretlenen tüm kareler doğrudan orijinale doğru hareket ettirilerek ve sonra tekrarlanarak belirlenebilir.


x<0Teste ihtiyacın var mı? Örneğin -3,6 verildiğinde, x<ytest 6, -3 y<0değerine dönüşür ve x<ytest 6,3 olur ve bu değer test 3,6 olur.
Supercat,

@supercat Indeed, Python'un dediği gibi x>=y>=0...
Neil

1

Kotlin , 148 146 140 bayt

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

Çevrimiçi deneyin!


:IntGeri dönüş türünü belirtmeniz gerekmediğinden emin olabilirsiniz .
therealfarfetchd

Özyinelemeli işlevler, geri dönüş tipini gerektirir, çünkü derleyici, türü anlayacak kadar akıllı değildir.
JohnWells

1
Özyinelemeli aramaları özledim. Boğmaca
therealfarfetchd

1

Jöle , 27 26 25 23 bayt

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

Çevrimiçi deneyin!

Çok yavaş; 6'dan büyük çıktılar için TIO'da zaman aşımına uğradı. Girdi olarak karmaşık bir sayı alır.

açıklama

Kod karmaşık sayıları kullanır çünkü ara adımda daha kısadır ve çok daha hızlı görünür; Ayrıca kaldırarak çiftleri kullanabilirsiniz Æive değiştirilmesi 0ile 0,0ikinci satırda.

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.