Koopa Kabuk Dizisi


19

Çeşitli Süper Mario oyunlarında yeşil ve kırmızı Koopa Troopa kabukları düz yüzeylerde sürtünmesizce kayabilir ve yollarındaki tuğla blokları yok edebilir . Bir kabuk bir tuğla bloğa çarptığında, blok kırılır ve boş alana dönüştürülür ve Koopa kabuğu yönü tersine çevirir. Örnek olarak, burada kırmızı kabuğu izleyin .

Süper Mario seviyesinin sadece bir blok yüksek olduğunu ve sağa doğru hareket eden bir kabuk içeren en soldaki hücre hariç her ızgara hücresinin bir tuğla veya boş alan olduğunu varsayalım. Seviye ayrıca periyodiktir , bu nedenle kabuk seviyenin sağ veya sol kenarından çıkarsa, karşı tarafa tekrar girer. Bu durumda, kabuk daha fazla kalmayıncaya kadar zıplamaya ve seviyedeki tüm tuğla blokları kırmaya devam edecektir. Kabuk, son tuğla blok kırıldıktan hemen sonra ne kadar ilerleyecek?

Meydan okuma

Negatif olmayan bir ondalık sayı içeren bir program veya işlev yazın. Başında sıfır olmadan (tek istisna 0 kendisidir) ikili olarak ifade edilen bu sayı, bir blok-üst düzey düzeni kodlar. A 1bir tuğla blok ve bir 0boş alandır.

Koopa Kabuğu, seviyenin en sol kenarına yerleştirilir ve başlangıçta sağa hareket eder. Örneğin, giriş ile ilişkili düzeyde 39olduğu

>100111

çünkü 100111ikilik sistemde 39 ve >ve <sağ temsil ve sırasıyla kabukları hareketli bıraktı.

Son tuğla blok (aka 1) kırıldıktan sonra kabuğun kat ettiği toplam mesafeyi yazdırmanız veya geri göndermeniz gerekir .

İçin çıkış 39IS 7ve böyle düzey görünüm değişiklikleri:

Level      Cumulative Distance
>100111    0
<000111    0
>000110    0
0>00110    1
00>0110    2
000>110    3
000<010    3
00<0010    4
0<00010    5
<000010    6
000001<    7
000000>    7  <-- output

Benzer bir şekilde, çıkış 6IS 1:

Level    Cumulative Distance
>110     0
<010     0
001<     1
000>     1  <-- output

Bayt cinsinden en kısa kod kazanır.

Referans olarak, girişler 0için çıkışlar şunlardır 20:

0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 0
9 0
10 1
11 2
12 2
13 1
14 3
15 3
16 0
17 0
18 1
19 3
20 2

Ve işte girişe kadar çıkışlar 1000.

Yanıtlar:


6

CJam, 29 26 24 bayt

3 bayt tasarruf için Sp3000'e teşekkürler.

q~2b{_1&}{W\({%}*0+}w],(

Test odası. (Bu, 0'dan STDIN'de verilen tam sayıya kadar tüm sonuçları yazdırır.)

açıklama

Bu, kafasındaki spesifikasyonu biraz döndürür: kabuğu ikili dizeden taşımak yerine, ikili dizeyi, kabuk her zaman ön tarafta olacak ve sağa işaret edecek şekilde değiştirir ve tersine çeviririz:

q~      e# Read and evaluate the input.
2b      e# Convert to base-2 to get the "level".
{_1&}{  e# While there is a 1 in the level...
  W\    e#   Put a -1 below the level.
  (     e#   Pull off the first digit, i.e. the cell the shell is pointing at.
  {     e#   If it's a 1 (i.e. a brick)...
    %   e#     Reverse the level, consuming the -1. This isequivalent to reversing the 
        e#     shell in place.
  }*
  0+    e#   Append a zero. If the cell was a brick, this just replaces it with an empty
        e#   cell. Otherwise, this rotates the level by one cell. This is equivalent 
        e#   to moving the shell one cell through the periodic level.
        e#   Note that if the leading cell was 0, the -1 remains on the stack.
}w
],(     e# Wrap the stack in an array, get its length and decrement.

5

Pyth, 24 bayt

&.WsH_XZeaYxZ1 0jQ2ssPBY

Çevrimiçi deneyin: Gösteri veya Test Paketi

Aşağıdaki 22 bayt kodu da işe yarayacaktır. Pyth derleyicisindeki bir hata nedeniyle şu anda çalışmıyor.

&u_XGeaYxG1ZjQ2)ssPBPY

edit: Hata düzeltildi, ancak tabii ki çözüm sayılmaz.

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

Önden ve arkadan alternatif olarak aşağıdakileri yaparım:

  • Bir tane ararım 1
  • Bu dizini bir listeye koyarak hatırlayın
  • Bu 1'i 0 olarak güncelleyin

1 saniye kalmadığında, mesafeyi hesaplarım. Önemli: Kabuk, son mesafe hariç listedeki her mesafeyi iki kez (ileri ve geri) hareket ettirir.

&.WsH_XZeaYxZ1 0jQ2ssPBY   implicit: Y = empty list
                jQ2        convert input number to binary
 .WsH                      start with Z=^; 
                           while the sum(Z) > 0, apply the the following to Z:
           xZ1                index of 1 in Z
         aY                   append this to Y
        e                     take the last element of Y (=this index)
      XZ       0              set this 1 (at index ^) in Z to 0
     _                        and revert the order of Z
                           this returns a list of zeros
&                          don't print ^, print the next thing
                     PBY   creates the list [Y, Y[:-1]]
                    s      combine these lists
                   s       sum up the distances
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.