Le défi
Le code le plus court par nombre de caractères pour entrer une représentation 2D d'une carte et afficher «vrai» ou «faux» selon l'entrée .
Le plateau est composé de 4 types de tuiles:
# - A solid wall
x - The target the laser has to hit
/ or \ - Mirrors pointing to a direction (depends on laser direction)
v, ^, > or < - The laser pointing to a direction (down, up, right and left respectively)
Il n'y a qu'un seul laser et une seule cible . Les murs doivent former un rectangle plein de toute taille, où le laser et la cible sont placés à l'intérieur. Des murs à l'intérieur de la «pièce» sont possibles.
Les rayons laser tirent et se déplacent de son origine à la direction dans laquelle il pointe. Si un rayon laser frappe le mur, il s'arrête. Si un rayon laser frappe un miroir, il rebondit à 90 degrés dans la direction vers laquelle pointe le miroir. Les miroirs ont deux faces, ce qui signifie que les deux côtés sont «réfléchissants» et peuvent faire rebondir un rayon de deux manières. Si un rayon laser frappe le laser ( ^v><
) lui-même, il est traité comme un mur (le faisceau laser détruit le projecteur et ne touchera donc jamais la cible).
Cas de test
Contribution: ########## # / \ # # # # \ X# #> / # ########## Production: vrai Contribution: ########## # vx # # / # # / # # \ # ########## Production: faux Contribution: ############# # # # #> # # # # # # # X # # # # ############# Production: faux Contribution: ########## # / \ / \ / \ # # \\ // \\\ # # // \ / \ / \\ # # \ / \ / \ / x ^ # ########## Production: vrai
Le décompte des codes comprend l'entrée / la sortie (c'est-à-dire le programme complet).
la source
Réponses:
Perl,
166160 caractèresPerl,
251248246222214208203201193190180176173170166 -> 160 caractères.La solution avait 166 coups à la fin de ce concours, mais A. Rex a trouvé quelques moyens de raser 6 autres personnages:
La première ligne charge l'entrée dans
%t
, une table du tableau où$t{99*i+j}
contient le caractère à la ligne i , colonne j . Ensuite,il recherche dans les éléments de
%t
un caractère correspondant à> ^ <
ouv
, et définit simultanément$d
une valeur comprise entre 0 et 3 indiquant la direction initiale du faisceau laser.Au début de chaque itération dans la boucle principale, nous mettons à jour
$d
si le faisceau est actuellement sur un miroir. XOR'ing par 3 donne le comportement correct pour un\
miroir et XOR'ing par 1 donne le comportement correct pour un/
miroir.Ensuite, la position actuelle
$r
est mise à jour selon la direction actuelle.Nous attribuons le caractère à la position actuelle à
$_
pour utiliser facilement les opérateurs de correspondance.Continuez si nous sommes sur un espace vide ou un caractère miroir. Sinon, nous terminons
true
si nous sommes sur la cible ($_ =~ /x/
) etfalse
autrement.Limitation: peut ne pas fonctionner sur des problèmes avec plus de 99 colonnes. Cette limitation pourrait être supprimée au détriment de 3 caractères supplémentaires,
la source
s!.!$t{$s++}=$&!ge,$s=$r+=99for<>;
, changez%d=split//,.." to
% d = .. = ~ /./ g, and change
grep {..}% t` engrep..,%t
Perl, 177 caractères
Le premier saut de ligne peut être supprimé; les deux autres sont obligatoires.
Explication:
Si un faisceau se déplaçant vers la droite se heurte à un {espace vide, miroir incliné vers le haut, miroir incliné vers le bas}, il devient un {faisceau se déplaçant vers la droite, faisceau ascendant, faisceau descendant}. Initialisez en
$/
cours de route - heureusement "6" n'est pas un caractère d'entrée valide.Lisez le tableau en
$_
.$s
est le symbole de tout ce que le faisceau est assis sur le dessus de maintenant. Puisque l'émetteur laser doit être traité comme un mur, définissez-le comme un mur pour commencer.Si le faisceau laser pointe d'une manière quelconque sauf à droite, faites pivoter son symbole, puis faites pivoter l'ensemble du tableau en place (en faisant également pivoter les symboles des miroirs). C'est une rotation à gauche de 90 degrés, accomplie efficacement en inversant les lignes tout en transposant les lignes et les colonnes, dans un cadre légèrement diabolique
s///e
avec des effets secondaires. Dans le code golfé, le tr est écrit sous la formey'''
qui me permet de sauter une barre oblique inverse.Terminez avec le bon message si nous touchons la cible ou un mur.
S'il y a un espace vide devant le laser, avancez. S'il y a un miroir devant le laser, avancez et faites pivoter le faisceau. Dans les deux cas, remettez le "symbole enregistré" dans l'ancien emplacement du faisceau, et placez l'élément que nous venons d'écraser dans le symbole enregistré.
Répétez jusqu'à la résiliation.
{...;redo}
est inférieur de deux caractères àfor(;;){...}
et trois de moins quewhile(1){...}
.la source
C89 (209 caractères)
Explication
Cette monstruosité sera probablement difficile à suivre si vous ne comprenez pas C. Juste un avertissement.
Cette petite macro vérifie si le caractère courant (
*p
) est égal à ce quia
est sous forme de caractère (*#a
). S'ils sont égaux, définissez le vecteur de mouvement surb
(m=b
), marquez ce caractère comme un mur (*p=1
) et définissez le point de départ sur l'emplacement actuel (q=p
). Cette macro inclut la partie «else».Déclarez certaines variables. *
q
est l'emplacement actuel de la lumière. *G
est le plateau de jeu sous forme de tableau 1D. *p
est l'emplacement de lecture actuel lors du remplissageG
. *w
est la largeur de la planche.Évident
main
.m
est une variable stockant le vecteur de mouvement. (C'est un paramètre enmain
tant qu'optimisation.)Parcourez tous les caractères en boucle en
G
utilisantp
. PasserG[0]
comme une optimisation (pas besoin de perdre un personnage à écrire àp
nouveau dans la troisième partie de lafor
).Utilisez la macro susmentionnée pour définir le lazer, si possible.
-1
et1
correspondent respectivement à gauche et à droite,-w
etw
haut et bas.Si le caractère courant est un marqueur de fin de ligne (ASCII 10), définissez la largeur si elle n'a pas déjà été définie. Le skipped
G[0]
nous permet d'écrirew=p-G
au lieu dew=p-G+1
. En outre, cela termine la?:
chaîne desM
's.Déplacez la lumière par le vecteur de mouvement.
Reflétez le vecteur de mouvement.
S'il s'agit d'un mur ou
x
, quittez avec le message approprié (m=0
met fin à la boucle). Sinon, ne faites rien (noop;m=m
)la source
g.c:3: declaration expected
:(puts
la déclaration a aidé, mais pas assez pour la ramener sous 170. 209, c'est plutôt bien, donc je pense que je vais en rester là. Merci pour votre aide les gars. J'apprécie vraiment cela. =] (N'importe quoi pour détrôner ces sorcières Perl!)Je parie que les gens attendent celui-ci depuis LOOOOONG. (Que voulez-vous dire, le défi est terminé et personne ne s'en soucie plus?)
Voici ... je présente ici une solution en
Befunge-93!
Il pèse 973 caractères (ou 688 si vous êtes suffisamment charitable pour ignorer les espaces, qui ne sont utilisés que pour le formatage et ne font rien dans le code réel).
Attention : j'ai écrit mon propre interpréteur Befunge-93 en Perl il y a peu de temps, et malheureusement c'est tout ce que j'ai vraiment eu le temps de tester. Je suis raisonnablement confiant dans son exactitude en général, mais il pourrait avoir une limitation étrange en ce qui concerne EOF: puisque l'
<>
opérateur de Perl retourne undef à la fin du fichier, cela est traité comme un 0 dans le contexte numérique. Pour les implémentations basées sur C où EOF a une valeur différente (par exemple -1), ce code peut ne pas fonctionner.Explication
Si vous n'êtes pas familier avec la syntaxe et le fonctionnement de Befunge, vérifiez ici .
Befunge est un langage basé sur la pile, mais il existe des commandes qui permettent d'écrire des caractères dans le code Befunge. J'en profite à deux endroits. Tout d'abord, je copie l'intégralité de l'entrée sur le tableau Befunge, mais je trouve quelques lignes en dessous du code écrit réel. (Bien sûr, cela n'est jamais réellement visible lorsque le code s'exécute.)
L'autre endroit est près du coin supérieur gauche:
Dans ce cas, la zone que j'ai mise en évidence ci-dessus est celle où je stocke quelques coordonnées. La première colonne de la ligne du milieu est l'endroit où je stocke la coordonnée x pour la "position du curseur" actuelle; la deuxième colonne est l'endroit où je stocke la coordonnée y; les deux colonnes suivantes sont destinées à stocker les coordonnées x et y de la source de faisceau laser lorsque celle-ci est trouvée; et le dernier poteau (avec le caractère «a») est finalement écrasé pour contenir la direction actuelle de la poutre, qui change évidemment à mesure que la trajectoire de la poutre est tracée.
Le programme commence par placer (0,27) comme position initiale du curseur. Ensuite, l'entrée est lue un caractère à la fois et placée à la position du curseur; les sauts de ligne provoquent simplement l'augmentation de la coordonnée y et le retour de la coordonnée x à 0, tout comme un vrai retour chariot. Finalement, undef est lu par l'interpréteur et cette valeur de caractère 0 est utilisée pour signaler la fin de l'entrée et passer aux étapes d'itération laser. Lorsque le caractère laser [<> ^ v] est lu, il est également copié dans le référentiel de la mémoire (sur le caractère «a») et ses coordonnées sont copiées dans les colonnes juste à gauche.
Le résultat final de tout cela est que le fichier entier est essentiellement copié dans le code Befunge, un peu en dessous du code réel traversé.
Ensuite, l'emplacement de la poutre est recopié dans les emplacements du curseur et l'itération suivante est effectuée:
S'il y a suffisamment de demande pour cela, je vais essayer d'indiquer exactement où dans le code tout cela est accompli.
la source
F #, 36 lignes, très lisible
Ok, juste pour obtenir une réponse:
Échantillons:
la source
Golfscript - 83 caractères (mashup du mien et de strager)
La nouvelle ligne est juste là pour l'emballage
Golfscript - 107 caractères
La nouvelle ligne est juste là pour plus de clarté
Comment ça fonctionne.
La première ligne détermine l'emplacement et la direction initiaux.
La deuxième ligne passe par le virage chaque fois que le laser frappe un miroir.
la source
353 caractères en rubis:314277 caractères maintenant!OK, 256 caractères en Ruby et maintenant j'ai terminé. Beau numéro rond pour s'arrêter. :)247 caractères. Je ne peux pas m'arrêter.223203201 caractères à RubyAvec un espace blanc:
Légèrement refactorisé:
la source
ch
àC
ou tout autre lettre 1 char pour sauver 2 personnages!i++
(au lieu dei+=1
)?Python
294277253240232 caractères , y compris les nouvelles lignes:(le premier caractère des lignes 4 et 5 est une tabulation, pas des espaces)
J'avais oublié que Python avait même des points-virgules optionnels.
Comment ça fonctionne
L'idée clé derrière ce code utilise des nombres complexes pour représenter des positions et des directions. Les lignes sont l'axe imaginaire, augmentant vers le bas. Les colonnes sont l'axe réel, croissant vers la droite.
l='>v<^';
une liste des symboles laser. L'ordre est choisi pour que l'indice d'un caractère de direction laser corresponde à une puissance de sqrt (-1)x={'/':'^<v>','\\':'v>^<',' ':l};
une table de transformation déterminant comment la direction change lorsque la poutre quitte des tuiles différentes. La tuile est la clé et les nouvelles directions sont les valeurs.b=[1];
tient la planche. Le premier élément est 1 (évalué comme vrai) de sorte que la boucle while s'exécutera au moins une fois.r=p=0
r
est le numéro de ligne actuel de l'entrée,p
est la position actuelle du faisceau laser.while b[-1]:
arrêter le chargement des données de la carte lorsque raw_input renvoie une chaîne videb+=[raw_input()];r+=1
ajouter la ligne d'entrée suivante au tableau et incrémenter le compteur de lignesfor g in l:
devinez chaque direction laser à son tourc=b[r].find(g)
définir la colonne à l'emplacement du laser ou -1 s'il n'est pas dans la ligne (ou pointe dans une direction différente)if-1<c:p=c+1j*r;d=g
si nous trouvons un laser, définissez la positionp
et la direction actuellesd
.d
est l'un des caractères del
Après avoir chargé la carte
b
, la positionp
et la direction actuellesd
ont été réglées sur celles de la source laser.while' '<d:
space a une valeur ASCII inférieure à celle de n'importe quel symbole de direction, nous l'utilisons donc comme indicateur d'arrêt.z=l.find(d);
index du caractère de direction actuel dans lal
chaîne.z
s'utilise plus tard à la fois pour déterminer la nouvelle direction du faisceau à l'aide dux
tableau et pour incrémenter la position.p+=1j**z;
incrémenter la position en utilisant une puissance de i. Par exemple,l.find('<')==2
-> i ^ 2 = -1, qui se déplacerait vers la gauche d'une colonne.c=b[int(p.imag)][int(p.real)];
lire le caractère à la position actuelled=x.get(c,' '*4)[z]
recherchez la nouvelle direction de la poutre dans la table de transformation. Si le caractère actuel n'existe pas dans la table, définissez-led
sur espace.print'#'<c
print false si nous nous sommes arrêtés sur autre chose que la cible.la source
p+=1j**z
: C'est mignon.C'est -était un port direct de la solution de Brian à C # 3, moins les interactions de la console. Ce n'est pas une entrée dans le défi car ce n'est pas un programme complet, je me demandais simplement comment certaines des constructions F # qu'il utilisait pourraient être représentées en C #.Edit: Après quelques expérimentations, le code de recherche plutôt verbeux suivant:
a été remplacé par du code LINQ to Objects beaucoup plus compact:
la source
F #, 255 caractères (et toujours assez lisible!):
Ok, après une nuit de repos, j'ai beaucoup amélioré ceci:
Parlons-en ligne par ligne.
Tout d'abord, insérez toutes les entrées dans un grand tableau unidimensionnel (les tableaux 2D peuvent être mauvais pour le golf de code; utilisez simplement un tableau 1D et ajoutez / soustrayez la largeur d'une ligne à l'index pour monter / descendre d'une ligne).
Ensuite, nous calculons «w», la largeur d'une ligne d'entrée, et «c», la position de départ, en indexant dans notre tableau.
Définissons maintenant la fonction 'next' 'n', qui prend une position courante 'c' et une direction 'd' qui vaut 0,1,2,3 pour haut, gauche, droite, bas.
L'index-epsilon 'e' et les 's' quelle-nouvelle-direction-si-nous-frappons-une-barre oblique 'sont calculés par une table. Par exemple, si la direction actuelle 'd' est 0 (vers le haut), alors le premier élément du tableau dit "-w, 2", ce qui signifie que nous décrémentons l'index de w, et si nous frappons une barre oblique, la nouvelle direction est 2 (droite).
Maintenant, nous rentrons dans la fonction suivante 'n' avec (1) l'index suivant ("c + e" - courant plus epsilon), et (2) la nouvelle direction, que nous calculons en regardant vers l'avant pour voir ce qu'il y a dans le tableau dans cette cellule suivante. Si le caractère d'anticipation est une barre oblique, la nouvelle direction est «s». S'il s'agit d'une barre oblique inverse, la nouvelle direction est 3-s (notre choix de codage 0123 fait que cela fonctionne). Si c'est un espace, on continue juste dans la même direction «d». Et s'il s'agit d'un autre caractère «c», alors le jeu se termine, en imprimant «true» si le caractère était «x» et false dans le cas contraire.
Pour commencer, nous appelons la fonction récursive 'n' avec la position initiale 'c' et la direction de départ (qui effectue le codage initial de la direction en 0123).
Je pense que je peux probablement encore raser quelques caractères supplémentaires, mais j'en suis assez satisfait comme ça (et 255 est un bon nombre).
la source
Peser 18203 caractères est une solution Python qui peut:
Il faut encore un peu de rangement et je ne sais pas si la physique 2D veut que le faisceau ne puisse pas se croiser ...
Un script bash pour afficher le rapport d'erreur de couleur:
Les unittests utilisés dans le développement:
la source
Rubis, 176 caractères
J'ai utilisé une simple machine à états (comme la plupart des affiches), rien d'extraordinaire. J'ai juste continué à le réduire en utilisant tous les trucs auxquels je pouvais penser. Le XOR bit à bit utilisé pour changer de direction (stocké sous forme d'entier dans la variable
c
) était une grande amélioration par rapport aux conditions que j'avais dans les versions précédentes.Je soupçonne que le code incrémente
x
ety
pourrait être raccourci. Voici la section du code qui fait l'incrémentation:Edit : J'ai pu raccourcir légèrement ce qui précède:
La direction actuelle du laser
c
est stockée comme suit:Le code s'appuie sur ce fait pour incrémenter
x
ety
du montant correct (0, 1 ou -1). J'ai essayé de réorganiser les nombres mappés dans chaque direction, à la recherche d'un arrangement qui me permettrait de faire une manipulation au niveau du bit pour incrémenter les valeurs, car j'ai le sentiment tenace qu'il serait plus court que la version arithmétique.la source
C # 3.0
259 caractères
Légèrement plus lisible:
Le principal gaspillage de caractères semble être de trouver la largeur de la carte et la position de la source laser. Des idées comment raccourcir cela?
la source
while(1)
C + ASCII, 197 caractères:
Cette solution C suppose un jeu de caractères ASCII, ce qui nous permet d'utiliser l'astuce du miroir XOR. C'est aussi incroyablement fragile - toutes les lignes d'entrée doivent être de la même longueur, par exemple.
Il se brise sous la barre des 200 caractères - mais bon, je n'ai toujours pas battu ces solutions Perl!
la source
Golfscript (83 caractères)
Bonjour gnibbler!
la source
Python - 152
Lit l'entrée d'un fichier appelé «L»
Pour lire depuis stdin, remplacez la première ligne par ceci
Si vous avez besoin de true / false minuscules, remplacez la dernière ligne par
la source
True
entrue
etFalse
enfalse
? ;-)D<5
» par «imprimer D <5»? Ou y a-t-il quelque chose qui me manque?JavaScript - 265 caractères
Mise à jour IV - Il y a de fortes chances que ce soit la dernière série de mises à jour, réussi à sauver quelques caractères de plus en passant à une boucle do-while et en réécrivant l'équation de mouvement.
Mise à jour III - Grâce à la suggestion de strager concernant la suppression de Math.abs () et la mise des variables dans l'espace de nom global, cela, associé à une certaine réorganisation des affectations de variables, a réduit le code à 282 caractères.
Mise à jour II - Quelques mises à jour supplémentaires du code pour supprimer l'utilisation de! = -1 ainsi qu'une meilleure utilisation des variables pour des opérations plus longues.
Mise à jour - Lorsque vous avez terminé et apporté des modifications en créant une référence à la fonction indexOf (merci LiraNuna!) Et en supprimant les parenthèses inutiles.
C'est la première fois que je fais un code golf, donc je ne suis pas sûr de savoir à quel point cela pourrait être meilleur, tout retour d'information est apprécié.
Version entièrement minimisée:
Version originale avec commentaires:
Page Web à tester avec:
la source
index != -1
parindex > 0
svp! (Espérons que personne ne place le lazer dans le coin supérieur gauche pour0
qu'il ne soit pas retourné. =]) Vous pouvez enchaîner lesvar
instructions ou vous en débarrasser complètement (en mettant les variables dans l'espace de noms global). Je pense queMath.abs(m)==1
peut être remplacé parm==-1|m==1
. Peutmovement = ...; location += movement
être optimisé pourlocation += movement =
?function(a){return g.indexOf(a)}
peut être remplacé parfunction(a)g.indexOf(a)
des versions récentes de JavaScript.Maison des miroirs
Ce n'est pas une véritable entrée au défi, mais j'ai écrit un jeu basé sur ce concept (pas trop longtemps en arrière).
Il est écrit en Scala, open-source et disponible ici :
Il fait un peu plus; traite des couleurs et de divers types de miroirs et d'appareils, mais la version 0.00001 a fait exactement ce que ce défi demandait. J'ai perdu cette version et elle n'a de toute façon jamais été optimisée pour le nombre de caractères.
la source
c (K&R) 339 caractères nécessaires après plus de suggestions de strager.
Le physicien en moi a noté que les opérations de propagation et de réflexion sont invariantes par inversion du temps, donc cette version projette des rayons depuis la cible et vérifie si elles arrivent à l'émetteur laser.
Le reste de la mise en œuvre est très simple et est tiré plus ou moins exactement de mes efforts précédents.
Comprimé:
Non compressé (ish):
Il n'y a pas de validation d'entrée et une mauvaise entrée peut l'envoyer dans une boucle infinie. Fonctionne correctement avec une entrée ne dépassant pas 99 par 99. Nécessite un compilateur qui liera la bibliothèque standard sans inclure aucun des en-têtes. Et je pense que j'ai fini, strager m'a battu d'un bout à l'autre, même avec son aide.
J'espère plutôt que quelqu'un démontrera une manière plus subtile d'accomplir la tâche. Il n'y a rien de mal à cela, mais ce n'est pas de la magie profonde.
la source
=0
sur les globaux car ils sont initialisés à 0 par défaut. Remplacez les constantes de caractère par leur équivalent en décimal. Utilisez>0
au lieu de!=EOF
pour vérifier EOF (et\0
). Vous pouvez probablement#define
supprimer une partie du codecase
comme je l'ai fait avecif
les. Pas besoin du supplément\n
dans leputs
car ilputs
faut de toute façon imprimer une nouvelle ligne.for(;;)
est plus court quewhile(1)
. J'espère que cela t'aides. =]"There is no input validation"
- Il ne devrait pas y en avoir. Pour faciliter la tâche des golfeurs, les entrées sont supposées toujours être «propres», sauf indication contraire.Rubis - 146 caractères
la source
PostScript , 359 octets
Première tentative, beaucoup de progrès à faire ...
la source
Haskell,
395391383361339 caractères (optimisé)Utilise toujours une machine à états générique, plutôt que quelque chose d'intelligent:
Une version lisible:
la source
Je crois en la réutilisation du code, j'utiliserais l'un de vos codes comme API :).
32 caractères \ o / ... wohoooo
la source
C ++: 388 caractères
( 318 sans en-têtes)
Comment ça fonctionne:
Tout d'abord, toutes les lignes sont lues, puis le laser est trouvé. Ce qui suit sera évalué à
0
tant qu'aucune flèche laser n'a encore été trouvée, et le même temps est attribué àx
la position horizontale.Ensuite, nous regardons dans quelle direction nous avons trouvé et stockons cela
i
. Les valeursi
paires de sont en haut / à gauche ("décroissant") et les valeurs impaires en bas / à droite ("en augmentation"). Selon cette notion,d
("direction") etr
("orientation") sont définis. Nous indexons le tableau de pointeursz
avec l'orientation et ajoutons la direction à l'entier que nous obtenons. La direction ne change que si nous frappons une barre oblique, alors qu'elle reste la même lorsque nous frappons une barre oblique inverse. Bien sûr, lorsque nous frappons un miroir, nous changeons toujours d'orientation (r = !r
).la source
Groovy @ 279 personnages
la source
C #
1020 caractères.1088 caractères (entrée ajoutée de la console).925 caractères (variables refactorisées).875 caractères (initialiseur de dictionnaire redondant supprimé; changé en opérateurs & binaires)
Fait un point de ne pas regarder quelqu'un d'autre avant de poster. Je suis sûr que cela pourrait être un peu LINQ. Et toute la méthode FindLaser dans la version lisible me semble terriblement louche. Mais ça marche et il est tard :)
Notez que la classe lisible inclut une méthode supplémentaire qui imprime l'arène actuelle lorsque le laser se déplace.
Version lisible (pas tout à fait la version finale du golf, mais même prémisse):
la source
Perl 219
Ma version perl est de
392342 caractères (je devais traiter le cas du faisceau frappant le laser):mise à jour , merci Hobbs pour me rappeler
tr//
, il est maintenant 250 caractères:Mise à jour , suppression de l'
m
enm//
, en changeant les deuxwhile
boucles apportées quelques économies; il n'y a plus qu'un seul espace requis.(a
L:it;goto L
la même longueur quedo{it;redo}
):J'en ai rasé quelques-uns, mais cela
ne faitque rivaliser avec certains d'entre eux, bien que tardifs.Cela a l'air un peu mieux comme:
Eh bien ... Honnêtement, cela devrait être explicite si vous comprenez que le
@b
est un tableau des tableaux de caractères dans chaque ligne, et que vous pouvez lire les expressions rationnelles simples et lestr
déclarations.la source
$_=$s;tr/^v<>/<>^v/
et$_=$s;tr/v^<>/<>^v/
respectivement. De plus, vous n'avez pas besoin dum
inm//
.$_=$s;tr/v^></<>^v/;
if m/.../
qui pourraientif/.../
sauver deux personnages par pop.y///
au lieu detr///
pour enregistrer deux caractères.F # - 454 (ou à peu près)
Un peu tard dans le jeu, mais je ne peux pas résister à la publication de ma deuxième tentative.
Mise à jour légèrement modifiée. S'arrête maintenant correctement si l'émetteur est touché. Pincé l'idée de Brian pour IndexOfAny (dommage que la ligne soit si verbeuse). Je n'ai pas vraiment réussi à trouver comment faire revenir ReadToEnd de la console, donc je prends cela en confiance ...
Je suis content de cette réponse, car si elle est assez courte, elle est encore assez lisible.
la source