死蛙走


17

介绍

乔尼想扮演Frogger。但是,他不是很好。实际上,只有在平台移动之后,他才会尝试前进。

找出Jonny的青蛙是否设法到达路径的尽头或它是否在途中死亡。

挑战

该程序将接收由0s和1s 组成的Frogger网格作为输入,格式如下:

  • 网格将具有随机的宽度和长度,并且至少为3x3
  • 1 代表平台
  • 0 代表水
  • F 代表青蛙的起始位置
  • 网格的第一行和最后一行仅由1s 组成,并且不会移动,并且青蛙F将随机放置在最后一行
  • 每个中间层将始终在移动,并且每行的末尾都有一个<>,指示它是向左还是向右移动

允许将这些符号替换为您自己的符号,只要它们完全不同并且您在答案中指定替换即可。

输入可以采用任何兼容格式(带换行符的字符串,字符串数组,字符数组等)。

挑战规则

  • 每转,所有平台都会根据<>符号指示的方向移动一个正方形
  • 如果平台被推离“屏幕”,它们会重新出现在网格的另一侧
  • 如果青蛙在移动的平台上,它将随之移动
  • 在那之后,青蛙将跳到顶部一格。青蛙每转都会移动。
  • 如果青蛙跳入水中(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

@dylnan我在挑战文本中对此进行了澄清。中间层将始终在移动,并且始终以<>结尾。
BgrWorker

青蛙会向前转动吗,即使0前面有青蛙,还是会等待下一个1?如果它可以等待,它将继续前进1,还是可以聪明地等待?即与测试用例一起使用11111 00001< 00011< 11F11,会否是假的,因为它会跳入水中(步骤的粘贴框);因为它移出了框架(步骤的粘贴框),是否为假?还是因为它巧妙地等待第二个平台然后向前跳跃(步骤的粘贴框)而成立?
凯文·克鲁伊森

@KevinCruijssen它每转都会移动,并且会很高兴地自杀(正如我所说,乔尼不是一个很好的球员)
BgrWorker

@BgrWorker好的,这确实使挑战更加可行。:)也许在挑战说明中对其进行编辑,即使青蛙跳入,它也会在每转弯中向前移动0
凯文·克鲁伊森

Answers:


4

Python 2中168个 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是蛙人在该回合开始时的位置。

frogger将要踩到的行是字符串l(请注意,通过切片,它们以从下到上的顺序排列)。d=('<'in l)%-2|1产生-11取决于行的移动方向。

由于这是i转弯,因此该行将已从其原始位置偏移了i字节;所以frogger要跳到的字符是行的宽度在l[(x-d*i)%L]哪里L,因此我们希望该字符等于'1'; 即>'0'

另外,我们要检查蛙跳在下一回合开始时是否不会移出边缘。那是表达的功能-1<x+d<L

这些条件是链接在一起的(因为'0'>-1始终是True);并且在任何时候如果结果表达式为假,k将变为(然后保持)0

无论如何,我们都会更新frogger的位置x+=d并增加行号;然后起泡,冲洗,重复。


1

Python 2246个 245 244 242字节

-3字节,感谢Xcoder先生
字节感谢Jonathan Frech -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:] 会删除最后一个字符(方向),然后删除第一个字符并追加它,或者删除倒数第二个字符并加上它(根据 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.