Dans Twitch Plays Pokémon , l'un des obstacles les plus ennuyeux que l'on puisse rencontrer est un puzzle de glace, où vous devez vous déplacer d'un endroit à un autre en glissant tout le long dans une direction jusqu'à ce que vous heurtiez un mur ou un rocher.
Votre tâche consiste à créer un programme qui générera un casse-tête de glace difficile et aléatoire.
Votre programme acceptera trois numéros, M
, N
et P
, en entrée (avec 10 <= M <= 30
, 15 <= N <= 40
et 0 <= P < 65536
):
12 18
et affichera:
- Un
M
deN
grille consistant en.
etO
représentant respectivement la glace et un rocher. - Un marqueur de position représentant d'où le puzzle est entré. Ce marqueur de position est constitué d'une lettre
L
,R
,T
, ouB
, soit à gauche, droite, haut, et en bas, suivi d'un nombre représentatif de la position (à gauche ou en haut) sur le côté devant être entré à partir. - Un marqueur de position similaire représentant la sortie du puzzle.
- La plus courte solution du puzzle, consistant en une séquence de
L
,R
,U
, et ,D
respectivement.
Exemple de sortie:
..O...O...........
............O.....
..O...............
.......O..........
..................
...........O......
O..O...........O..
..........O.......
..O..........O....
........O.........
O....O.........O..
............O.....
R 4
B 5
LDLDRULD
(Note that this output is actually invalid because it is not actually long enough.)
Pour une entrée M
et N
, la solution du puzzle doit avoir au moins des min(M, N)
étapes et déplacer au moins un 2 (M + N)
total d'espaces. (Pour référence, le puzzle ci - dessus se déplace un total de 12 étapes, le déplacement 69 des espaces.) Votre générateur de puzzle doit générer un autre M
par N
puzzle avec une voie de solution différente ( par exemple une séquence différente d'étapes pour chaque solution) pour chaque graine P
.
- Notez que l'exigence d'un chemin de solution différent est d'éviter les solutions qui tentent de générer systématiquement des chemins de roche, comme la solution de Claudiu ici . S'il y a deux ou trois paires de solutions identiques en raison des caprices de l'aléatoire, ce sera correct, tant que le programme n'essaie pas intentionnellement de générer systématiquement des puzzles avec la même séquence de mouvements.
Le code le plus court pour effectuer les gains ci-dessus.
>
et<
(ou n'importe quel caractère) pour l'entrée et la sortie? Les puzzles seront plus faciles à lire.LDLDRULD
qui ne fait que 8 étapesRéponses:
Python,
672548 caractères, des puzzles plus intéressantsBien que respectant strictement les règles, mon autre programme Python bat celui-ci, j'ai décidé d'en écrire un qui générerait de toute façon des puzzles plus intéressants. C'est ici:
Les niveaux d'indentation sont espace, tabulation, tabulation + espace.
Échantillons :
Il utilise
P
comme graine, donc chacunP
générera le même puzzle, et chaque différentP
est extrêmement susceptible d'être différent:Il fonctionne assez rapidement jusqu'à des tailles de
M=25,N=40
mais au-delà, il devient vraiment lent. Il devrait théoriquement fonctionnerM=30, N=40
si vous le laissez fonctionner suffisamment longtemps. J'ai écrit manuellement dans le sentier ici car il est difficile à suivre - le programme sort juste le puzzle.Explication :
Le programme boucle, générant une position de départ aléatoire en haut, une position de fin aléatoire en bas et une grille aléatoire avec une
12.5%
chance pour un rocher à n'importe quel endroit donné. Il résout ensuite le casse-tête avec une recherche en premier et si la solution existe et est plus grandemin(H,W)
, elle s'imprime et se ferme.la source
Java - 2632
Alors que j'admire la pureté technique de la réponse de Claudiu , j'ai décidé de m'essayer à faire des puzzles un peu plus difficiles;)
Étapes de base (assez simples):
Je marque également chaque place comme «nogo» lorsque je glisse. Si je me retrouve sur un spot de nogo (ou juste en face de celui qui signifierait qu'un rocher y allait), c'est une étape invalide.
Donc, fondamentalement, l'idée est de générer au hasard un grand nombre de cartes et de conserver la première qui est valide. Je prévois de rendre cela plus intelligent (retour en arrière, etc.), mais cela fonctionne bien en ce moment. Cela pourrait également réduire le code redondant, nous verrons.
En l'état, il génère presque instantanément de petites cartes (15 x 10), des cartes moyennes (30 x 20) en quelques secondes et de grandes (40 x 30) en un temps aléatoire compris entre 20 secondes et 20 minutes, selon la graine. Il teste entre 300k-500k maps / seconde sur ma machine, selon la taille.
Note latérale: Parfois, les cartes ne sont pas trop dures, simplement parce qu'il n'y a que autant de roches que de marches, et à moins que la marche ne vous mène à un mur, la plupart du temps, il n'y a qu'une seule option si vous voulez frapper une vraie pierre. Je corrigerai cela plus tard en plaçant des roches "aléatoires" dans des endroits sûrs une fois toutes les étapes tracées. Étant donné que les taches nogo sont déjà marquées, cela devrait être assez simple. Pour l'instant, profitez simplement de ces exemples:
Sortie montrant différentes tailles / graines:
Taille max 40x30:
Golfé:
Avec des sauts de ligne:
la source
while(o<3){...;o=...;}
êtrefor(;o<3;o=...){...;}
, sauver un octet?if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);
->return new Point(f.x+(w%2<1?0:i*d),f.y+(w%2<1?f.y:0));
.Python,
235206185 185176 caractèresUtilisation :
L'entrée se fait via stdin du formulaire
[M, N, P]
.Vous avez dit que les cartes devaient être différentes pour chaque graine
P
... et elles sont:Et un exemple avec une taille différente:
Répond à tous les critères objectifs fournis:
P
mène à un puzzle différentN + N%2
mesures, ce qui est au moinsN
2 (M + N)
l'espace totalExplication :
Chaque ligne est construite en répétant un certain
W
temps d' élément de chaîne et en limitant la longueur àW
(j'utiliseH
etW
au lieu deM
etN
).Les deux premières lignes dépendent
P
pour rendre chaque puzzle unique. Fondamentalement, notez que celaP
tient dans un entier non signé 16 bits. Je convertisP
en binaire, en utilisant.
pour 0 etO
pour 1:Le premier élément de ligne est 15 derniers bits,
t[1:]
tandis que le deuxième élément de ligne est le premier bit,t[0]
. Je ne pouvais pas tout mettre sur une seule ligne car la largeur minimale est de 15, ce qui ne conviendrait pas aux 16 bits siP
> 32767. Ainsi, les deux premières lignes représentent de manière unique chacune des valeurs possibles deP
.La troisième ligne est un mur plein afin que la valeur de
P
n'affecte pas la solution.Suivez ensuite les éléments réels du labyrinthe. Cette ligne les imprime tous, en les répétant jusqu'à la casquette. Le résultat est comme vous le voyez ci-dessus:
Le reste cherchait juste à résoudre le labyrinthe généré dynamiquement. Cela dépend uniquement de la largeur du labyrinthe. J'ai noté que les solutions, pour une largeur donnée, étaient:
etc. Par conséquent, il est simplement
URDR
répété et coupé au bon endroitW+W%2
,.la source