Tuzağa Düşmüş Şövalye Sırası


10

Giriş

En son çekilen The Trapped Knight - Numberphile videosundan esinlenerek bir meydan okuma buldum.

Tuzak Knight sekansı 1'den başlayarak uzunluğu 2016, sonlu bir tam sayı dizisi ve aşağıdaki yapı kuralları vardır:

  1. Bir sayı spiralini aşağıdaki şekilde yazın:
17 16 15 14 13 ...
18  5  4  3 12 ...
19  6  1  2 11 ...
20  7  8  9 10 ...
21 22 23 24 25 ...
  1. Üzerine bir şövalye koy 1.
  2. Şövalyeyi satranç kurallarına göre (yani 2 birim dikey ve 1 birim yatay veya tersi) daha önce ziyaret edilemeyen en küçük sayıya sahip ızgaraya taşıyın.
  3. Şövalye takılana kadar tekrarlayın.

İşte ilk üç adım:

Aşama 1

 17  [16]  15  [14]  13 
[18]   5    4    3  [12]
 19    6  < 1>   2   11 
[20]   7    8    9  [10]
 21  [22]  23  [24]  25 

Olası hareketler 10, 12, 14, 16, 18, 20, 22, 24'tür, aralarında en küçük 10'dur, bu nedenle ikinci terim 10'dur.

Adım 2

  4  [ 3]  12  [29]  54
( 1)   2   11   28  [53] 
  8    9  <10>  27   52 
[23]  24   25   26  [51] 
 46  [47]  48  [49]  50 

Olası hamleler 1 , 3, 23, 29, 47, 49, 51, 53'tür, aralarında en küçük olanı 3'tür, bu nedenle üçüncü terim 3'tür.

Aşama 3

 35  [34]  33  [32]  31 
[16]  15   14   13  [30] 
  5    4  < 3>  12   29 
[ 6] ( 1)   2   11  [28] 
  7  [ 8]   9  (10)  27 

Olası hamleler 6, 8, 10 , 16, 28, 30, 32, 34'tür, aralarında en küçük 6'dır, bu nedenle dördüncü terim 6'dır.

Dizinin yıldızı:

1 10 3 6 9 4 7 2 5 8 11 14 ...

ile biter

... 2099 2284 2477 2096 2281 2474 2675 2884 3101 2880 2467 2084

Meydan okuma

En kısa program veya işlevi yazın, aralık olarak bir tamsayı [1, 2016](veya [0, 2015]0 dizinli kullanılıyorsa) girdi olarak yazın, yakalanan şövalye dizisinde bu dizindeki sayıyı çıkarın. Diziyi 0 dizinli veya 1 dizinli olarak dizine eklemeyi seçebilirsiniz, ancak hangi dizinleme düzenini kullandığınızı belirtmeniz gerekir.

Test senaryoları (1 endeksli)

n    | s(n)
-----+-----
   1 |    1
   2 |   10
   3 |    3
   6 |    4
  11 |   11
  21 |   23
  51 |   95
 101 |   65
 201 |  235
 501 |  761
1001 | 1069
2001 | 1925
2016 | 2084

Tüm olası çıktılar için lütfen bu sayfaya bakın .

Kazanma Kriterleri

Her dilin en kısa kodu kazanır. Standart boşluklarda kısıtlamalar geçerlidir.



1
@Arnauld Bu soru benimkinden ilham aldı (belirtildiği gibi), sadece ana yoldan gitmek daha hızlı. Ayrıca, bu dizi sonludur, bu nedenle golfte bazı yönler bu anlamda farklı olabilir.
Shieru Asakoto

1
Diğer sekans da sonlu, karede duruyor12851850258
Jo King

2
@JoKing Peki, ama bu oldukça hızlı bir şekilde durduğundan, daha küçük tamsayı aralıkları olan esolangs'daki cevapları görmek istiyorum (16 bitlik tamsayılar uygulayan esolangs var mı?)
Shieru Asakoto

1
Peki, bu soru kum havuzunda ilk olarak gönderildiyse, bu dupe'nin diğer soru olacağı anlamına gelmez mi?
Luis felipe De jesus Munoz

Yanıtlar:


4

JavaScript (ES7),  182  181 bayt

f=(n,[x,y]=[2,1],a=[...Array(4e3)].map((_,n)=>[1,-1].map(s=>(i&1?-s:s)*(i+s*n-(n>0?n:-n)>>1),i=n**.5|0,n-=i*++i)))=>n--?f(n,a.find(([X,Y],j)=>(i=j,(x-X)*(y-Y))**2==4),a,a[i]=[]):i+1

Çevrimiçi deneyin!

Nasıl?

Wildebeest Yolu'na cevabımın biraz değiştirilmiş bir versiyonu kesinlikle bundan daha kısa (ve daha hızlı). Ama farklı bir yaklaşım denemek istedim. Bu arada, bu yöntemi bazı esolang'larda uygulamak daha kolay olabileceğini düşünüyorum .

Algoritma:

  1. 3199
  2. (X,Y)

    ((xX)×(yY))2=4

    (x,y)

    |xX|=1|yY|=2|xX|=2|yY|=1

  3. (x,y)=(X,Y)

  4. 2. adımda yeniden başlıyoruz veya işimiz bittiğinde bulunan son dizini döndürüyoruz.


Node.js , 155 bayt

n=>(g=(x,y)=>n--?g(Buffer('QHUbcdWJ').map(m=c=>g[i=4*((x+=c%6-2)*x>(y+=c%7-2)*y?x:y)**2,i-=(x>y||-1)*(i**.5+x+y)]|i>m||(H=x,V=y,m=i))|H,V,g[m]=1):m+1)(1,2)

Çevrimiçi deneyin!


3

05AB1E , 53 bayt

Xˆ0UF2D(Ÿ0KãʒÄ1¢}εX+}Dε·nàDtyÆ+yO·<.±*->}D¯KßDˆkèU}¯θ

32θn+1

Çevrimiçi deneyin veya daha fazla test vakası doğrulayın (en büyük test senaryoları için zaman aşımına uğradı).

Açıklama:

Bağlantılı Wildebeest cevabımın açıklamasındaki açıklamaya bakın . Sadece değiştirilen parçalar:

2D    # Get a list in the range [-2,2]: [-2,-1,0,1,2]

ve sondaki:

θ       # Only leave the last item of the list

DÜZENLEME: @Arnauld'un JavaScript (ES7) yanıtındaki bir bağlantı noktası (şu anda):

05AB1E , 57 56 bayt

0D‚DˆUF64D(ŸãΣ·nàDtyÆ+yO·<.±*->}©ʒX-Pn4Q}¯¡˜2£DˆU}®J¯Jk>θ

Çevrimiçi deneyin veya daha fazla test vakası doğrulayın (en büyük test senaryoları için zaman aşımına uğradı).

Açıklama:

‚%                # Create a pair of zeros: [0,0]
                  # (by pairing the (implicit) input with itself,
                  #  and then using modulo (implicit) input)
  DˆU             # Set both variable `X` to this, and add it to the global_array
F                 # Loop the (implicit) input amount of times:
 64D            #  Create a list in the range [-64,64]
      ã           #  Create each possible pair of `x,y`-coordinates
       Σ·nàDtyÆ+yO·<.±*->}
                  #  Sort this list in a spiral
        ©         #  Save it in the register (without popping)
 ʒ      }         #  Filter the list of coordinates by:
  X-              #   Subtract the coordinate of variable `X`
    P             #   Take the product
     n            #   Take the square
      4Q          #   Check if its equal to 4
                  # Since 05AB1E cannot remove inner lists, we use a workaround:
         ¯¡       # Split this list on each coordinate in the global_array
           ˜      # Flatten the entire list
            2£    # Only leave the first two integers as `x,y`-coordinate
                  # (if 05AB1E could remove inner lists, this would've been `¯Kн` instead)
              DˆU # Replace variable `X` with this, and add it to the global_array
                # After the loop: push all coordinates sorted in a spiral from the register
  J               # Join each coordinate together to a string
   ¯J             # Push the global_array, and also join them together to a string
                  # (if 05AB1E could index inner lists, both `J` could have been removed)
     k            # Get the index of each item of the global_array in the spiral list
      >           # Increase the 0-indexed index by 1 to make it 1-based
       θ          # And only leave the last one (which is output implicitly)

Σ·nàDtyÆ+yO·<.±*->}x,y


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.