Ölü Kurbağa Yürüyüş


17

Giriş

Jonny, Frogger oynamak istiyor. Ancak, çok iyi değil. Aslında, sadece ilerlemeye çalışacak ve sadece platformlar hareket ettikten sonra.

Jonny'nin kurbağasının yolun sonuna ulaşmayı başarabildiğini veya yolda ölüp ölmediğini öğrenin.

Meydan okuma

Program , aşağıdaki formatta 0s ve 1s'den oluşan bir Frogger ızgarasını girdi olarak alacaktır :

  • Izgara rastgele bir genişlik ve uzunlukta ve en az 3x3 olacaktır.
  • 1 platformları temsil eder
  • 0 suyu temsil eder
  • F kurbağanın başlangıç ​​pozisyonunu temsil eder
  • Izgaranın her ilk ve son satırı sadece 1s tarafından oluşturulacak ve hareket etmeyecek ve kurbağa Fson hatta rastgele yerleştirilecek
  • Her ara katman her zaman hareket edecek ve her satırın sola veya sağa hareket edip etmediğini gösteren bir <veya >sonunda olacaktır.

Hepsi birbirinden farklı olduğu ve cevabınızda değiştirmeleri belirlediğiniz sürece, bu sembolleri kendinizle değiştirmeye izin verilir.

Giriş herhangi bir uyumlu biçimde olabilir (satır sonları, dize dizisi, karakter dizisi, ...).

Zorluk Kuralları

  • Her turda, tüm platformlar <veya >işaretiyle gösterilen yöne göre bir kare hareket edecektir.
  • Platformlar, "ekrandan" itilirlerse ızgaranın diğer tarafında yeniden görünür
  • Kurbağa hareketli bir platformda ise, onunla birlikte hareket edecektir
  • Bundan sonra kurbağa bir kareyi üst sıraya atlar. Kurbağa her turda hareket edecektir.
  • Kurbağa suya atlarsa ölür ( 0) veya hareketli bir platformla birlikte ızgaranın yan tarafına dokunursa

Eğer kurbağa hayatta kalırsa, programınızın doğruluk değeri, aksi halde yanlış bir değer çıkışı gerekir.

Bu , bu yüzden bayt en kısa cevap kazanmak. Standart boşluklar geçerlidir.

Örnekler

örnek 1

Giriş

11111
00111>
00101<
1F111

Çıktı

1

infaz

Dönüş 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Dönüş 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

3. Tur:

11111
1F100
01001
11111

1F111
11100
01001
11111

ÖRNEK 2

Giriş

11111
00100<
00100<
1F111

Çıktı

0

infaz

Dönüş 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Dönüş 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

3. Tur:

11111
00001
00001
11111

Ara çizgiler her zaman hareket edecek mi? Girdi olarak bir satır listesi alabilir miyiz? Eğer bir çizgi hareket etmiyorsa, <ya da dışında bir karakterle biteceğini varsayabilir >miyiz, yani dikdörtgen dizileri girdi olarak alabilir miyiz? Bu arada, güzel bir meydan okuma!
dylnan

@dylnan Meydan okuma metninde açıklığa kavuştum. Ara katmanlar her zaman hareket edecek ve her zaman bir <veya >sonunda olacaktır.
BgrWorker

Kurbağa 0, önünde bir tane olsa bile her turda ileri doğru hareket ediyor mu yoksa bir sonraki için bekleyecek 1mi? Bekleyebiliyorsa, her seferinde ileri gidecek 1mi, yoksa akıllıca bekleyebilir mi? Yani test 11111 00001< 00011< 11F11senaryosunda, su içinde atladığı için falsey olacak mı (adımların macunu ); çerçeve içinde hareket edeceğinden (adımların macunu ) falsey olacak mı ; ya da doğru olacak mı, çünkü ileri atlamadan önce ikinci platform için akıllıca bekler (adımların macunu )?
Kevin Cruijssen

@KevinCruijssen her turda hareket ediyor ve mutlu bir şekilde intihar edecek (dediğim gibi Jonny çok iyi bir oyuncu değil)
BgrWorker

@BgrWorker Tamam, bu meydan okumayı gerçekten daha yapılabilir hale getiriyor. :) Belki meydan okuma açıklamasında düzenleyin, kurbağa bir atlasa bile her dönüşte ilerleyecektir 0.
Kevin Cruijssen

Yanıtlar:


4

Python 2 , 168 165 152 145 137 129 bayt

s=input();x=s[-1].find('F');L=len(s[0]);i=k=1
for l in s[-2:0:-1]:d=('<'in l)%-2|1;k*=l[(x-d*i)%L]>'0'>-1<x+d<L;x+=d;i+=1
print k

Çevrimiçi deneyin!

Girdi biçimi dizelerin bir listesidir; sorun ifadesinde verilen anlamlara sahip karakterler.

Açıklama:

idönüş numarasıdır (Dönüş 1 ile başlayan); xbu dönüşün başlangıcında kurbağanın konumudur.

Kurucunun adım atmak üzere olduğu satır dizedir l(dilimleme yoluyla bunların aşağıdan yukarıya doğru sıralandığını unutmayın). d=('<'in l)%-2|1verim -1veya 1sıranın hareket ettiği yöne bağlı olarak.

Bu idönüş olduğu için , bu satır orijinal konumundan ibayt olarak değişmiş olacaktır ; ve böylece kurbağanın atlamak üzere olduğu karakter, satır genişliğinin l[(x-d*i)%L]nerede Lolduğu için, bu karakterin eşit olmasını istiyoruz '1'; yani >'0'.

Ek olarak, bir sonraki dönüşün başlangıcında, kurbağanın kenardan kaymayacağını kontrol etmek istiyoruz ; ifadenin işlevi budur -1<x+d<L.

Bu koşullar zincirlidir ( '0'>-1her zaman olduğu gibi True); ve herhangi bir zamanda ortaya çıkan ifade yanlışsa, kolur (ve sonra kalır) 0.

Her halükarda, kurucunun konumunu güncelliyoruz x+=dve satır numarasını çarpıyoruz ; sonra köpürtün, durulayın, tekrarlayın.


1

Piton 2 , 246 245 244 242 bayt

Jonathan Frech sayesinde Bay Xcoder -1 bayt sayesinde -3 bayt

m=input()
exec"""for i,r in enumerate(m):
 d=-int(min('1',r[-1]));q=r[d*2]
 if m[i+1:]:r=sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]
 if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j])
 m[i]=r
"""*~-len(m)
print'F'in m[0]

Çevrimiçi deneyin!

açıklama

  • d her katmanın hareket edeceği yön
  • q etrafına sarılacak karakter
    • [q,' '][q<'L'] kurbağayı ekrandan düşürecek
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]son karakteri (yön) kaldırır, sonra ilk karakteri kaldırır ve ekler veya sonuncuyu kaldırır (ve buna göre d) ekler ve yönü arkaya ekler ve tüm satırı etkili bir şekilde sola / sağa taşır.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) kurbağayı ileri atlayacak
  • min('F',m[i-1][j]) kurbağa suya düşecek
  • Karakter karşılaştırması ( minve <) sırayı takip eder' ' < '0' < '1' < 'F' < 'L'

: Girdi karakterlerinin listenin bir liste olacak
' 'su -
'F'- kurbağa
'L'- plataform
'0'- sola katmanı taşımak
'1'- sağa tabakayı hareket


if i<len(m)-1olabilir if~-len(m)>i.
Jonathan Frech

0

Java 8, 293 277 bayt

a->{for(int l=a.length-1,x=a[l].indexOf('F'),y=l,i,t=a[0].length()-1,b;y>0;y--){for(i=l;i-->1;a[i]=a[i].endsWith("<")?a[i].substring(1,t+1)+a[i].charAt(0*(x-=b))+"<":a[i].charAt(t)+a[i].substring(0*(x+=b),t)+">")b=i==y?1:0;if(x<0|x>t||a[y].charAt(x)<49)return 0>1;}return 1>0;}

Meydan okuma açıklamasında ( 01F<>) belirtilen varsayılan karakterleri kullanır .

Çevrimiçi deneyin.

Açıklama:

a->{                         // Method with String-array parameter & boolean return-type
  for(int l=a.length-1,      //  Amount of rows minus 1
       x=a[l].indexOf('F'),  //  Start x-position of the frog
       y=l,                  //  Start y-position of the frog
       i,                    //  Index-integer
       t=a[0].length()-1,    //  Length of the rows minus 1
       b;                    //  Temp integer
       y>0;                  //  Loop as long as the frog hasn't reached the other side
       y--){                 //    Jump forward once after every turn
    for(i=l;l-->1;           //   Inner loop over all the moving rows
        ;a[i]=               //     After every iteration: Change the moving row to:
         a[i].endsWith("<")? //      If the current platform moves to the left:
          a[i].substring(1,t+1)
                             //       Last part of the platform
                             //        i.e. "00101<" → "0101"
          +a[i].charAt(0     //       Appended with the first character
                             //        i.e. "00101<" → '0'
            *(x-=b))         //       We are moving left, so subtract `b` from `x`      
          +"<"               //       And append the direction "<" again
                             //        so "00101<" becomes "01010<"
         :                   //      Else (the platform moves to the right):
          a[i].charAt(t)     //       Take the last character
                             //        i.e. "00111>" → '1'
          +a[i].substring(0  //       And append the first part of the platform
                             //        i.e. "00111>" → "0011"
            *(x+=b),t)       //       We are moving right, so add `b` to `x`
          +">")              //       And append the direction "<" again
                             //        so "00111>" becomes "10011>"
      b=i==y?                //    If the frog is on the current row:
         1                   //     Set `b` to 1
        :                    //    Else:
         0;                  //     Set `b` to 0
    if(x<0|x>t               //   If the Frog is out of bounds
       ||a[y].charAt(x)<49)  //   Or jumped into the water
      return 0>1;}           //    Return false
  return 1>0;}               //  If the loop ended the frog made it to the other side,
                             //  so return true
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.