死んだカエルの歩行


17

前書き

ジョニーはフロッガーをプレイしたい。しかし、彼はあまりよくありません。実際、彼はプラットフォームが移動した後にのみ、前進しようとします。

ジョニーのカエルが道の終わりに到達したのか、途中で死んだのかを調べてください。

チャレンジ

このプログラムは、0sおよび1sで構成されるフロッガーグリッドを次の形式で入力として受け取ります。

  • グリッドの幅と長さはランダムで、少なくとも3x3
  • 1 プラットフォームを表します
  • 0 水を表します
  • F カエルの開始位置を表します
  • グリッドの最初と最後の行はすべて1s のみで構成され、移動せず、カエルFは最後の行にランダムに配置されます
  • すべての中間層は常に移動し、各行の最後<または>末尾に、左または右に移動するかどうかを示します

これらの記号をすべて独自のものに置き換えて、それらがすべて明確であり、回答で置き換えを指定する限り、許可されます。

入力は、互換性のある任意の形式(改行を含む文字列、文字列の配列、文字の配列、...)にすることができます。

チャレンジルール

  • ターンごとに、すべてのプラットフォームは、<または>記号で示された方向に基づいて1マス移動
  • プラットフォームが「スクリーン」から押し出されると、グリッドの反対側に再び表示されます
  • カエルが動くプラットフォーム上にある場合、カエルも一緒に移動します
  • その後、カエルは一番上の行に向かって1つの正方形をジャンプします。カエルは毎ターン移動します。
  • カエルが水に飛び込んだ場合(0)、または移動するプラットフォームとともにグリッドの側面に触れた場合、カエルは死にます。

あなたのプログラムは、カエルが生き残る場合は真実の値を出力し、それ以外の場合は偽の値を出力する必要があります。

これはであるため、バイト単位の最短回答が勝ちます。標準の抜け穴が適用されます。

例1

入力

11111
00111>
00101<
1F111

出力

1

実行

ターン1:

11111
10011
01010
1F111

11111
10011
0F010
11111

ターン2:

11111
11001
F0100
11111

11111
F1001
10100
11111

ターン3:

11111
1F100
01001
11111

1F111
11100
01001
11111

例2

入力

11111
00100<
00100<
1F111

出力

0

実行

ターン1:

11111
01000
01000
1F111

11111
01000
0F000
11111

ターン2:

11111
10000
F0000
11111

11111
F0000
10000
11111

ターン3:

11111
00001
00001
11111

中間線は常に動いていますか?入力として行のリストを取得できますか?ラインが動いていない場合、我々はそれ以外の文字で終わると仮定することができます<>私たちは、入力として長方形配列を取ることができるように?ちなみに、素敵な挑戦!
ディルナン

@dylnanチャレンジテキストでそれを明確にしました。中間層は常に移動しており、常に末尾<または>末尾にあります。
BgrWorker

カエル0は目の前にいる場合でも毎ターン前進しますか、それとも次を待ち1ますか?待つことができる場合、毎回進む1か、賢く待つことができますか?つまり、テストケース11111 00001< 00011< 11F11では、水に飛び込むため、偽物になりますステップのペーストビン)。フレーム外に移動するため、偽物になりますステップのペーストビン)。または、それは、前にジャンプする前に2番目のプラットフォームを賢く待機するので、真実でしょうか(ステップのペーストビン)?
ケビンクルーッセン

@KevinCruijssenそれは毎ターン移動し、喜んで自殺します(私が言ったように、ジョニーはあまり良いプレイヤーではありません)
BgrWorker

@BgrWorkerわかりました、それは実際に挑戦をより実行可能にします。:)チャレンジの説明で編集して、カエルがに飛び込んだとしても、ターンごとに前進するようにし0ます。
ケビンCruijssen

回答:


4

パイソン2168の 165 152 145 137 129バイト

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

オンラインでお試しください!

入力形式は文字列のリストです。問題文で与えられた意味を持つ文字。

説明:

iターン番号(ターン1から始まる)です。xは、そのターンの開始時のフロッガーの位置です。

フロッガーが踏み込もうとしている行は文字列ですl(スライスを介して、これらは下から上に来ることに注意してください)。d=('<'in l)%-2|1降伏する-11、行の移動方向に依存します。

これはi3番目のターンであるため、その行は元の位置からiバイト単位でシフトします。文字ようフロッガーがある上にジャンプすることについてですl[(x-d*i)%L]どこL我々はその文字が等しくなりたいので、行の幅です'1'。すなわち、>'0'

さらに、次のターンの開始時にフロッガーが端からずれないことを確認します。それがexpressionの関数です-1<x+d<L

これらの条件は連鎖しています('0'>-1常にであるためTrue)。そして、結果の式がいつでもfalseの場合、kになります(そしてそのままになります)0

いずれにせよ、フロガーの位置を更新しx+=d、行番号を上げます。その後、泡立て、すすぎ、繰り返します。


1

パイソン2246の 245 244 242バイト

Xcoder氏のおかげで-3バイトジョナサンフレッチの
おかげで-1バイト

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]

オンラインでお試しください!

説明

  • d 各レイヤーが移動する方向です
  • q 巻き付けられる文字です
    • [q,' '][q<'L'] カエルを画面外に落とします
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]最後の文字(方向)を削除し、最初の文字を削除して追加するか、最後から2番目を削除して先頭に追加し(に基づいてd)、方向を後ろに追加して、行全体を事実上左右に移動します。
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) カエルが前方にジャンプします
  • min('F',m[i-1][j]) カエルを水に落とします
  • 文字比較(minおよび<)は順序に従います' ' < '0' < '1' < 'F' < 'L'

入力は、文字のリストのリストになります。-
' '
'F'-カエル
'L'-プラタフォーム
'0'-レイヤーを左に
'1'移動-レイヤーを右に移動


if i<len(m)-1可能性がありますif~-len(m)>i
ジョナサンフレッチ

0

Java 8、293 277バイト

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;}

チャレンジの説明(01F<>)で指定されているデフォルト文字を使用します。

オンラインでお試しください。

説明:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.