Grenouille morte marchant

17

introduction

Jonny veut jouer à Frogger. Cependant, il n'est pas très bon. En fait, il essaiera seulement d'avancer, et seulement après que les plateformes auront bougé.

Découvrez si la grenouille de Jonny parvient à atteindre la fin du chemin ou si elle meurt sur son chemin.

Défi

Le programme recevra en entrée une grille Frogger composée de 0s et 1s, au format suivant:

  • La grille aura une largeur et une longueur aléatoires, et au moins 3x3
  • 1 représente les plateformes
  • 0 représente l'eau
  • F représente la position de départ de la grenouille
  • Chaque première et dernière ligne de la grille sera composée uniquement de 1s, et ne bougera pas, et la grenouille Fsera placée au hasard sur la dernière ligne
  • Chaque couche intermédiaire sera toujours en mouvement et aura un <ou >à la fin de chaque ligne indiquant si elle se déplace vers la gauche ou la droite

Remplacer ces symboles par les vôtres est autorisé, tant qu'ils sont tous distincts et que vous spécifiez les remplacements dans votre réponse.

L'entrée peut être dans n'importe quel format compatible (chaîne avec sauts de ligne, tableau de chaînes, tableau de caractères, ...).

Règles du défi

  • À chaque tour, toutes les plates-formes se déplaceront d'un carré, selon la direction indiquée par le signe <ou>
  • Les plateformes réapparaissent de l'autre côté de la grille si elles sont repoussées de "l'écran"
  • Si la grenouille est sur une plate-forme mobile, elle se déplacera avec elle
  • Après cela, la grenouille sautera d'un carré vers la rangée supérieure. La grenouille se déplacera à chaque tour.
  • La grenouille meurt si elle saute dans l'eau ( 0) ou si elle touche le côté de la grille avec une plate-forme mobile

Votre programme doit produire une valeur vraie si la grenouille survit et une valeur fausse sinon.

C'est le , donc la réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.

Exemples

Exemple 1

Contribution

11111
00111>
00101<
1F111

Production

1

Exécution

Tour 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Tour 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

Tour 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

Exemple 2

Contribution

11111
00100<
00100<
1F111

Production

0

Exécution

Tour 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Tour 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

Tour 3:

11111
00001
00001
11111
BgrWorker
la source
Les lignes intermédiaires bougeront-elles toujours? Pouvons-nous prendre une liste de lignes en entrée? Si une ligne ne bouge pas, pouvons-nous supposer qu'elle se termine par un caractère autre que <ou >alors nous pouvons prendre des tableaux rectangulaires en entrée? Au fait, beau défi!
dylnan
@dylnan Je l'ai clarifié dans le texte du défi. Les couches intermédiaires seront toujours en mouvement et auront toujours un <ou >à la fin.
BgrWorker
La grenouille avance-t-elle à chaque tour même quand il y en a une 0ou attendra-t-elle la suivante 1? S'il peut attendre, ira-t-il à chaque fois 1, ou peut-il attendre intelligemment? C'est à dire avec le cas de test 11111 00001< 00011< 11F11, sera-ce falsey car il saute dans l'eau ( collerette de marches ); sera-t-il falsey parce qu'il sort du cadre ( coller des étapes ); ou sera-t-elle véridique car elle attend intelligemment la deuxième plateforme avant de sauter en avant ( coller d'étapes )?
Kevin Cruijssen
@KevinCruijssen il bouge à chaque tour et se suicidera volontiers (comme je l'ai dit, Jonny n'est pas un très bon joueur)
BgrWorker
@BgrWorker Ok, cela rend le défi plus faisable. :) Peut-être l'éditer dans la description du défi, que la grenouille avancera à chaque tour, même si elle sautait dans un 0.
Kevin Cruijssen

Réponses:

4

Python 2 , 168 165 152 152 145 137 129 octets

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

Essayez-le en ligne!

Le format d'entrée est une liste de chaînes; caractères ayant la signification donnée dans l'énoncé du problème.

Explication:

i est le numéro du tour (en commençant par le tour 1); xest la position de la grenouille au début de ce tour.

La ligne sur laquelle la grenouille est sur le point de monter est la chaîne l(notez que via le découpage, ceux-ci viennent de bas en haut). d=('<'in l)%-2|1rendements -1ou1 selon la direction dans laquelle la ligne se déplace.

Puisque c'est le ie tour, cette ligne aura décalé de sa position d'origine par ioctets; et donc le caractère sur lequel la grenouille est sur le point de sauter est l[(x-d*i)%L]Lest la largeur de la ligne, donc nous voulons que ce caractère soit égal à '1'; c'est à dire,>'0' .

De plus, nous voulons vérifier que la grenouille ne sera pas décalée du bord au début du prochain tour; c'est la fonction de l'expression-1<x+d<L .

Ces conditions sont enchaînées (puisque '0'>-1c'est toujours True); et si à tout moment l'expression résultante est fausse, kdeviendra (et restera ensuite) 0.

Dans tous les cas, nous mettons à jour la position de la grenouille x+=det augmentons le numéro de ligne; puis faites mousser, rincez, répétez.

Chas Brown
la source
1

Python 2 , 246 245 244 242 octets

-3 octets grâce à M. Xcoder
-1 octets grâce à Jonathan Frech

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]

Essayez-le en ligne!

Explication

  • d est la direction dans laquelle chaque couche se déplacera
  • q est le personnage qui sera enroulé
    • [q,' '][q<'L'] laissera tomber la grenouille hors de l'écran
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]supprimera le dernier caractère (la direction), puis supprimera le premier caractère et l'ajoutera ou supprimera l'avant-dernier et l'ajoutera (basé sur d), et ajoutera la direction en arrière, déplaçant efficacement la ligne entière vers la gauche / droite.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) fera sauter la grenouille
  • min('F',m[i-1][j]) fera tomber la grenouille dans l'eau
  • La comparaison des personnages ( minet <) suit l'ordre' ' < '0' < '1' < 'F' < 'L'

L'entrée sera une liste de liste de caractères:
' '- eau
'F'- grenouille
'L'- plate-forme
'0'- déplacez le calque vers la gauche
'1'- déplacez le calque vers la droite

Barre
la source
if i<len(m)-1pourrait éventuellement être if~-len(m)>i.
Jonathan Frech
0

Java 8, 293 277 octets

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

Utilise les caractères par défaut spécifiés dans la description du défi ( 01F<>).

Essayez-le en ligne.

Explication:

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
Kevin Cruijssen
la source