introduction
Une famille de phoques est échouée sur un iceberg dans le cercle arctique. Il y a un émetteur radio situé sur l'iceberg que les phoques peuvent utiliser pour appeler à l'aide. Cependant, seul le sceau de papa sait comment faire fonctionner l'émetteur radio. Et pire encore, la glace est très glissante à cette période de l'année, de sorte que les phoques glisseront de manière incontrôlable jusqu'à ce qu'ils heurtent un autre phoque ou glissent du bord de l'iceberg, ce qui rend très difficile pour le phoque papa d'atteindre l'émetteur radio. Heureusement, l'un des sceaux est un informaticien, alors elle décide d'écrire un programme pour comprendre comment manoeuvrer le sceau de papa vers l'émetteur radio. Comme il n'y a pas beaucoup d'espace sur la glace pour écrire un programme, elle décide de faire en sorte que le programme utilise le moins d'octets possible.
Description de l'entrée
Le programme du sceau accepte les entrées de STDIN, les arguments de ligne de commande ou les fonctions d'entrée utilisateur (comme raw_input()
). Il ne peut pas être initialisé dans une variable (par exemple "Ce programme attend l'entrée dans une variable x
").
La première ligne de l'entrée se compose de deux entiers séparés par des virgules sous la forme
A,B
Ce qui suit est des B
lignes composées deA
caractères chacune. Chaque ligne ne peut contenir que des caractères parmi les suivants:
.
: Le froid, le froid, l'océan. La carte aura toujours ceci comme frontière.#
: Une partie de l'iceberg.a
...z
: Un phoque qui n'est pas le phoque papa de l'iceberg.D
: Le phoque papa sur l'iceberg.*
: L'émetteur radio.
(Notez que le sceau de papa est toujours noté avec une majuscule D
. Un minusculed
est tout simplement un sceau ordinaire.)
Description de la sortie
Selon les règles suivantes concernant la façon dont les scellés peuvent se déplacer, affichez une liste d'instructions pour les scellés sur la façon dont ils doivent se déplacer pour amener le scellé papa à l'émetteur radio.
- Règle: tous les sceaux peuvent se déplacer vers le haut (
U
), le bas (D
), la gauche (L
) et la droite (R
). Ils ne peuvent pas glisser en diagonale. - Règle: En se déplaçant, un phoque continuera de se déplacer dans la même direction jusqu'à ce qu'il entre en collision avec un autre phoque ou tombe dans la mer.
- Si un joint entre en collision avec un autre joint, il cessera de bouger. Le sceau avec lequel il est entré en collision ne bougera pas .
- Si un phoque tombe dans la mer, il se noiera et disparaîtra de la carte. Autrement dit, il n'agit pas comme un collisionneur pour d'autres phoques et il ne peut plus être déplacé.
- Règle: Deux sceaux ne peuvent pas bouger en même temps, pas plus qu'un sceau ne peut être déplacé pendant qu'un autre est toujours en mouvement. Le sceau suivant ne peut être déplacé que lorsque le sceau précédent a cessé de bouger.
- Règle: Il n'y a aucune restriction concernant le déplacement d'un phoque plusieurs fois ou le nombre de phoques qui se noient.
- Règle: Une solution correcte aura l' extrémité du joint papa à l'émetteur radio. Le sceau de papa ne peut pas simplement passer l'émetteur en glissant.
La sortie sera composée de plusieurs lignes, chacune sous la forme
A,B
Où A
est le sceau de se déplacer ( D
pour le sceau papa, a
... z
pour les autres), et B
est la direction pour déplacer le joint (soit U
, D
, L
ou R
). Notez que vous n'avez pas besoin de trouver l'itinéraire le plus court. Tout itinéraire qui obtient le sceau de papa vers l'objectif est une sortie acceptable.
Exemples d'entrées et de sorties
Contribution:
25,5
.........................
.#######################.
.####D#############*k###.
.#######################.
.........................
Production:
D,R
Contribution:
9,7
.........
.a#####b.
.#####d#.
.##l*###.
.###m#p#.
.#D#.#c#.
.........
Sortie (une sortie possible sur plusieurs):
m,R
b,L
D,U
D,R
D,D
D,L
Contribution:
26,5
..........................
.###..................###.
.l*##########v#########D#.
.###..................###.
..........................
Sortie (une sortie possible sur plusieurs):
v,D
D,L
Si vous avez d'autres questions, veuillez les poser dans les commentaires.
Réponses:
Python 3, 520 octets
Je peux faire une explication plus détaillée plus tard si les gens le souhaitent, mais en gros, cela exécute une recherche en profondeur d'abord avec un approfondissement itératif sur l'espace d'état des mouvements possibles. Si un mouvement fait tomber le sceau de papa, il est immédiatement rejeté. Si le papa se retrouve à côté de l'émetteur, la séquence de mouvements est imprimée et le programme se divise par zéro pour forcer une sortie.
Je peux faire exécuter le code beaucoup plus rapidement en ajoutant
if G!=g:
au début de l'avant-dernière ligne, pour 8 octets supplémentaires - cela rejette les mouvements qui ne changent rien, tels quek,L
dans le premier cas de test.Le temps d'exécution varie sensiblement d'un cycle à l'autre, même avec la même entrée, ce qui est évidemment dû au fait que je choisis le prochain sceau à déplacer en itérant sur un
set
, qui est un type non ordonné. J'ai chronométré le deuxième cas de test à 5 minutes 30 secondes, même si cela ne semblait pas si long la première fois que je l'ai exécuté. Avec l'optimisation mentionnée ci-dessus, cela ressemble plus à 40 secondes.la source
JavaScript (ES6) 322
334 323Modifier2 Ajout d'animation dans l'extrait de
Modifier la correction de bogue, rappelez-vous la position initiale de '*', donc je le trouve même quand un sceau glisse dessus et l'efface.
Implémenté en tant que fonction avec la chaîne d'entrée en paramètre (probablement invalide mais en attente d'une clarification). Sortie via popup.
Le problème avec l'entrée de chaîne multiligne en JavaScript est que
prompt
ne la gère pas bien.Quant à l'algorithme: un BFS, devrait trouver une solution optimale. Je garde une file d'attente du statut du jeu en variable
l
, le statut étant la grille des personnagesg
et la séquence de mouvements jusqu'à présents
. En outre, il existe un ensemble de grilles obtenues jusqu'à présent en variablek
, pour éviter d'explorer la même grille encore et encore.La boucle principale est
Exécutez l'extrait de code pour tester dans FireFox
Afficher l'extrait de code
la source
C ++, 628 octets
Eh bien, cela n'a pas été très court:
J'ai choisi C ++ parce que je voulais utiliser les structures de données (
set
,string
), mais c'est intrinsèquement assez verbeux. La solution fait assez bien sur les performances, résolvant le test 2 en un peu plus de 2 secondes sur un MacBook Pro, même s'il n'est pas optimisé pour l'exécution.Code avant de commencer à éliminer les espaces blancs et une autre réduction de longueur:
L'idée centrale derrière l'algorithme est que deux ensembles sont conservés:
q
est l'ensemble des configurations en attente de traitement.p
est l'ensemble des configurations qui ont été traitées.L'algorithme démarre avec la configuration initiale dans
q
. À chaque étape, une configuration est extraite deq
, ajoutée àp
, tous les mouvements de joint possibles sont générés et les nouvelles configurations résultantes insérées dansq
.Essai:
la source
q
serait certainement mieux dans ce sens. La raison pour laquelle j'ai utilisé un ensemble était que je voulais éviter d'entrer plusieurs fois la même entrée. Mais j'ai commencé à réfléchir après avoir vu le résultat.