A bord 2D va contenir les objets suivants:
^
,>
,v
, Ou<
: A laser émetteur vers le haut, à droite, vers le bas, ou vers la gauche respectivement. Il peut y avoir plus d'un. Les lasers se déplaceront en ligne droite dans un espace vide (l'espace vide est représenté par un point.
). Les lasers ne traversent pas les émetteurs.*
: Une cible. Les lasers traversent les cibles. Il peut y avoir plus d'un.
Le tableau peut également contenir les objets suivants:
@
: Un mur solide. Le laser ne passera pas ici.\
: Un réflecteur incliné vers la gauche . Modifie la direction des lasers selon le tableau suivant:Direction laser is travelling Direction of laser after hitting reflector Up Left Right Down Down Right Left Up
Il devrait être assez intuitif quant au fonctionnement des réflecteurs. Imaginez-les simplement comme un véritable miroir bilatéral et les directions devraient être claires.
/
: Un réflecteur incliné à droite . Modifie la direction des lasers selon le tableau suivant:Direction laser is travelling Direction of laser after hitting reflector Up Right Right Up Down Left Left Down
1
,2
,3
...9
: Un portail . Le nombre indique le canal du portail - il y aura exactement deux portails du même canal (par exemple, il n'y en aura pas trois1
). Le portail modifie la position des lasers à la position de l'autre portail du même canal. Par exemple:> 1 @ 1 *
Le laser frappera la cible car lorsqu'il touche le premier
1
, il est téléporté vers le second1
de l'autre côté. Les lasers conservent la même direction qu'avant.Un portail ne téléportera pas le laser vers un portail d'un canal différent (c'est-à-dire qu'un
1
ne téléportera pas le laser vers un9
.
Votre programme recevra une représentation 2D de la carte en entrée. La planche sera toujours de forme rectangulaire. La sortie devrait être True
si toutes les cibles sont traversées par des lasers, ou False
autrement.
Voici quelques cas de test:
Contribution
>....\ ..*... >./../ ..*...
Sortie
True
Contribution
>..........\ 1........../ 2..........1 3..........2 4..........3 5..........4 6..........5 7..........6 8..........7 9..........8 *..........9
Sortie
True
Contribution
>.@............* >..@...........* >...@..........* >....@.........* >.....@........* >...*..@........ >.......@......*
Sortie
False
Contribution
../\. >./**
Sortie
False
Contribution
/.......*.......\/3..... @..............//\.\.... *.............2\.1\/\... \..............///.....< .........*...//\\/.....\ >.............\.1.///.4. 4.......*/...\2\/3/\/..^
Sortie
True
Contribution
vvvvvvvvvvvvvvvvv \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// *****************
Sortie (notez la cible à l'extrême droite)
False
Réponses:
Python,
310302287278277260Pas radicalement différent de la publication Python existante, mais a un ou deux trucs remarquables, je pense.
Il gère également les entrées "sans terminaison", telles queEDIT : Oups! les émetteurs bloquent les lasers.1>1
.t
prend une liste de chaînes (les lignes d'entrée) et retourne un résultat booléen.Voici un joli gif du code en cours de golf:
EDIT : Awsome gif avec l'aimable autorisation de Will. Merci Will!
la source
1>1
prendra fin. Je n'ai pas pu trouver quelque chose qui ne se termine pas, même si je n'y ai pas mis beaucoup d'efforts et j'ai supposé que cela ne se produisait pas pour mon implémentation. Je vais bien sûr reconsidérer si quelqu'un peut en présenter un..find(d)
renvoie -1 s'il n'est pas trouvé. Si vous supprimez l'if-1<d:
instruction et que vous le faitesj+=[-1,1,w,-w,-i][d]
à la place en haut de la boucle while, un -1 non trouvé se transformera en ajout du dernier élément de ce tableau àj
, ce qui feraj
0, que nous savons être@
...?Perl, 647
C'est ma première tentative de code-golf, et je suis un peu gêné de ne pas avoir battu le score C #, mais j'ai pensé qu'il serait intéressant (ou amusant, ou simplement masochiste) de faire le tout en tant que série de substitutions d'expression régulière. (J'ai aussi pensé que ce serait amusant de rafraîchir mon Perl, mais à la fin, je regrettais profondément de ne pas l'avoir implémenté en Ruby ou Python.)
Je n'ai pas fait beaucoup de tests, mais je pense qu'il devrait gérer tous les cas.
La grille est entrée via STDIN. Il doit y avoir au moins une nouvelle ligne dans l'entrée (c'est-à-dire qu'une seule ligne sans nouvelle ligne ne fonctionnera pas).
Explication: le code met à jour de manière itérative la chaîne de grille lorsque les lasers la traversent.
-
représente un laser horizontal,|
un laser vertical, des+
lasers croisés,K
un\
miroir avec un laser rebondissant sur le dessus,k
un/
miroir avec un laser rebondissant sur le fond,Z
un\
miroir avec un laser rebondissant sur le bas etW
un/
miroir avec un laser rebondissant sur le dessus haut.%
est un/
miroir avec des lasers des deux côtés, tandisX
qu'un\
miroir avec des lasers des deux côtés. (Ils sont sensibles à la casse. J'ai essayé de choisir des lettres qui semblent quelque peu appropriées - par exemple,k
etK
sont des choix quelque peu évidents - mais malheureusement l'effet n'est vraiment pas très utile. Je devrais vraiment mettre ces informations dans un tableau, mais je suis épuisé en ce moment.)La gestion des portails de la même manière (c.-à-d. En affectant à chaque chiffre un ensemble de caractères supplémentaires en fonction des positions laser d'entrée / sortie possibles) nécessiterait 144 caractères (y compris le 9 d'origine), donc à la place, lorsqu'un laser frappe un portail "d'entrée", J'ajoute le caractère de portail "de sortie" à l'ensemble de caractères qui émettent un laser dans la bonne direction. (Cela nécessite une distinction entre les portails d'entrée et de sortie; j'ai utilisé les lettres
qwertyuio
pour cela.)Un peu sans golf, avec des déclarations imprimées pour que vous puissiez voir les substitutions se produire (chaque substitution représente un "round" de progression laser), et avec le
g
drapeau ajouté à la principales///
afin qu'il ne prenne pas autant d'itérations:la source
Python 338
351Ma version non minimisée trace en fait les trajectoires laser sur la carte, ce qui est plutôt joli:
la source
C # -
515414400 octetsProgramme C # complet, aucune sortie sympa comme celle de Will. Fonctionne en suivant le chemin laser pour chacune des émissions individuelles et en conservant un tableau des cellules que nous avons visitées, afin que nous puissions vérifier que nous avons visité toutes les étoiles à la fin.Edit: agrégé un grand nombre d'octets en faisant tout 1D et en utilisant un char au lieu d'un int pour stocker le char actuel
w0lf m'a rappelé que j'avais une boucle for sous-utilisée en plein milieu de mon code, alors j'ai pensé que je ferais mieux de faire un dernier effort et de le mettre au travail, et maintenant je suis au nombre minimum absolu de bouclés bretelles. Je ne prétendrai pas aimer l'effondrement de la seconde boucle for, le code est horriblement désordonné maintenant, mais il a économisé quelques octets. Dans le processus, j'ai réécrit la gestion du portail. J'ai également trouvé une méthode plus courte pour effectuer le «déplacement» avec une opération conditionnelle imbriquée plutôt qu'agrégée.
Code golf:
Code moins golfé:
Le nouveau code de gestion du portail utilise le fait que la fonction String.IndexOf renvoie heureusement -1 (c'est-à-dire un caractère introuvable) si vous lui demandez de commencer à regarder 1 caractère au-delà de la chaîne (lève une exception si vous lui demandez de commencer plus loin). C'était une nouvelle pour moi, mais c'était terriblement pratique dans ce cas.
la source
m+=(d>0?d-2:0)+(d<3?d-1:0)*W;
et le fourrer dans lafor
, comme ceci:for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)
. De cette façon, vous économiserez un caractère, car vous perdrez un point-virgule.