introduction
"Yarr !! Nous avons eu un garçon qui s’appelait" programmeur "pour faire une carte de notre trésor caché! Mais" c’est écrit avec des nombres étranges "n lettres!" E5, N2, E3 " Folie! Impossible même de tracer une carte au trésor appropriée, un crétin inutile. Fixez-la-nous! Nous vous offrirons une part du trésor! "
Description du défi
Un groupe de pirates a du mal à lire une carte au trésor. Pouvez-vous écrire un programme pour le convertir en une forme plus ... piratey?
En entrée, vous recevrez la carte au trésor originale. Il s'agit d'une liste de chaînes séparées par des virgules, chaque chaîne étant composée d'une partie lettre (indiquant aux pirates dans quelle direction emprunter la marche) et d'une partie numérique (indiquant aux pirates le nombre de pas à effectuer dans cette direction). Par exemple, la carte au trésor suivante:
E2,N4,E5,S2,W1,S3
signifierait, "faire deux pas vers l'est, quatre pas vers le nord, cinq pas vers l'est, deux pas vers le sud, un pas vers l'ouest, puis trois pas vers le sud".
En sortie, vous aurez sortie la carte sous une forme graphique, en utilisant les caractères >
, ^
, v
et <
comme pointeurs. Voici la sortie pour l'entrée ci-dessus:
>>>>>v
^ v
^ v<
^ v
>>^ X
Notez que nous avons remplacé la dernière étape au sud par un X
. C'est parce que la dernière étape est où se trouve le trésor et, comme nous le savons tous, les pirates doivent avoir un X sur leurs cartes au trésor, sinon ils ne sauront pas le lire.
En passant, la carte ne se croisera jamais. Vous n'avez donc pas à vous soucier de la gestion des chevauchements. De plus, vous êtes autorisé à avoir une nouvelle ligne à la fin de la sortie.
Exemples d'entrées et de sorties
S5,W2
v
v
v
v
v
X<
N1,E1,S1,E1,N1,E1,S2
>v>v
^>^X
N1
X
N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2
>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<
E21,S2
>>>>>>>>>>>>>>>>>>>>>v
X
N12,E11,S12,W2,N4
>>>>>>>>>>>v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ X v
^ ^ v
^ ^ v
^ ^<<
X
devrait marquer le pas après le dernier coup, comme tous les autres coups sont comptés. Imaginez que la dernière étape est la N3: vous marchez trois fois vers le nord et creusez, mais il n’ya rien ici, vous devez marcher 2 étapes à la place. Cela ne me dérange pas si vous conservez la règle existante, car elle ajoute un petit coin à gérer. Mais rappelez-vous ce qui est arrivé à cette fille.Réponses:
Rubis,
213 209 198 186178Passer la saisie via stdin.
Cela utilise un
y -> x -> char
dictionnaire pour construire la carte, où les deuxx
ety
peuvent être négatifs. Une fois l’entrée analysée, le minimum global de la coordonnée x est extrait. Pour chaque ligne, il effectue ensuite une itération sur une plage allant du minimum global à l'index maximum pour la ligne actuelle et imprime le caractère correct pour cet index.Pour rester avec le thème, les expressions à tourner
NESW
dans les indices appropriés ont été sans vergogne piraté SP3000 de réponse .Version originale utilisant un
[x,y] -> char
dictionnaire:la source
Python 2,
249248244239237 octetsEntrée comme
"E2,N4,E5,S2,W1,S3"
.NSEW
est mappé sur[1, 3, 2, 0]
pard=ord(c)%10%7
. Que ce soit pour changery
oux
est ensuite décidé pard%2
, et si incrémenter ou décrémenter est décidé pard-2|1
. Les première et troisième expressions ont été trouvées par force brute.Autre que cela, c'est une utilisation simple d'un dictionnaire imbriqué du formulaire
{y: {x: char}}
.(Merci à @joriki pour l'aide avec la cartographie)
la source
(d + 1 & 2) - 1
1|d%-3
(ce qui est la négation, mais je viens de me rendre compte que ça va aussi)!Javascript (ES6), 260
C'était intéressant ...
Merci @ETHproductions, @ edc65 et @vihan pour l'aide!
Ceci définit une fonction anonyme, donc pour l'appeler, ajoutez
f=
au début pour lui donner un nom.Tester:
console.log(f("E2,N4,E5,S2,W1,S3"))
Explication:
la source
i++
de lafor
boucle vers le dernier endroit où il est utilisé, dans ce casc=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
à la placeArray(v.slice(1)- -1).join(v[0])
, et" ".repeat(j-p-1)
à la placeArray(j-p).join(" ")
, et de 11 octets d' ensemble. Je pense que vous pourriez également placerF='forEach'
au début de la fonction, puis changer chacun.forEach
d'eux en en[F]
économisant 4 autres.if
s, cela pourrait être utile si vous décrémentez des variables en même tempsq=x=y=2e3
signifie- t -il que la sortie serait incorrecte si je disais, par exempleW9999
?PHP,
431417 octetsPlacez-le dans un fichier (
treasure.php
), supprimez l'indentation, joignez les lignes (il est enveloppé ici pour des raisons de lisibilité), placez le<?php
marqueur au début du fichier (non affiché ici car techniquement, il ne fait pas partie du programme).Exemple d'exécution:
L'option
-d error_reporting=0
est nécessaire pour supprimer les avis concernant les valeurs non trouvées aux index spécifiés dans$z
.Mise à jour:
Pendant que je préparais la version non golfée du code pour publication, j'ai découvert qu'elle contenait deux assignations inutiles (12 octets) et un espace pouvant être supprimé (
as$i
); aussi, en remplaçant unwhile
par unefor
boucle et en y insérant une assignation (impossible avec lawhile
boucle), j’ai sauvegardé un autre octet.la source
$count --;
.$argn
économiser 3 octetschop
enregistrer 1 octet"X"
->X
utiliser les constantes enregistrer davantage d'octets$argn
allusion. Je suis au courant du"X"->X
truc mais j’en ai probablement oublié lorsque j’ai écrit cette solution. J'écris du code PHP depuis 2002, mais jusqu'à aujourd'hui, je n'avais pas remarqué que PHP en fournissait lachop()
fonction. Merci pour cet indice.Perl,
702613546474439338260 octetsMerci à Dom Hastings pour son aide et sa version supergolfée.
Le code utilise un tableau 2D.
Version de Dom Hastings:
Ma version inférieure de golf de 338 octets (pour référence):
Tester
la source
use strict;
, vous n'avez pas besoin de tous lesmy
s, ce qui vous fera économiser au moins quelques octets. Aussi==
est plus courte queeq
puisque ce dernier nécessite des espaces.$m
fois. Par conséquent, plutôt que de stocker l'argument de ligne de commande en tant que variable, vous pouvez l'appeler directementsplit
, c'est- à -dire@m=split(',',$ARGV[0])
.$d
et$s
peuvent être récupérées en utilisant regex pour vous sauver quelques octets($d,$s)=/^(.)(.+)$/
, et tous lesforeach
s peuvent êtrefor
(car ils sont identiques). Vous pourriez aussi être capable de sauvegarder certains caractères en remplaçant certains d'entre eux parmap{
...}@x
puisque vous pouvez ignorer les parenthèses autour de l'élément itéré (cela fonctionne bien si vous devez contenir d'autres boucles). Si vous utilisez,$ARGV[0]
vous pouvez le remplacer par pop, mais si vous utilisez le script dans,perl script.pl <<< "text"
vous pouvez utiliser la<>
place!pop
pour enregistrer un couple. Au lieu deuse Swtich
et des instructionsswitch
/case
, vous pouvez effectuer des vérifications individuelles qui pourraient vous faire économiser des octets. Quelque chose comme$y-="N"eq$d
fonctionnera aussi bien (puisque vrai1
et faux est''
). Souvent, vous pouvez avoir des mots comme mots nus, alors ça$y-=N eq$d
va marcher! Il y a certaines variables magiques que vous pouvez utiliser pour économiser des octets,$/
est'\n'
et$"
est' '
, mais parfois une aide pourrait newline littérale sauver char aussi. Une autre astuce (sale!) Consiste à attribuer plusieurs tâches afin d’économiser un peu plus, comme$a=0;$b=0;
il se peut$a=$b=0
.substr($_,0,1)
peut l'êtresubstr$_,0,1
. Postfixe pour les boucles et si les vérifications peuvent être utiles aussi comme dansfor(@c){...}
vs...for@c
mais que vous ne pouvez pas utiliser;
dans le code, vous devrez plutôt séparer les virgules (ce qui ne fonctionne pas toujours lorsque vous appelez des fonctions). Il y a tellement de bons conseils également sur codegolf.stackexchange.com/questions/5105/… . Bonne chance!Python 2, 394 octets
Exécuter le programme puis coller dans l’entrée standard comme par exemple
"E2,N4,E5,S2,W1,S3"
Ce n'est pas très optimisé. Il passe d'abord par l'entrée pour enregistrer le chemin. Il fait ensuite quelques calculs pour déterminer la bonne position de départ et la bonne taille de
o
. Ensuite, il répète et définit les entrées appropriées deo
comme l'une des>v<^X
. L'intérêt principal consiste à réutiliser la même fonction pour ces deux traversées.la source
XQuery 3.0, 498
XQuery n’est pas souvent très compétitif, c’était donc amusant.
Ungolfed
la source
PHP, 496
514528J'ai tenté ma chance en PHP, le résultat est plutôt long, je veux toujours le poster, juste pour le fun.
Ungolfed
la source
for(;$i++<$f;)
, essayer de supprimer les crochets inutiles, utiliser des constantes non définies (N
) au lieu de chaînes ('N'
),…if
s, essayez d’utiliser des opérateurs trenary ou des opérateurs logiques. En outre, cela vous aidera si vous utilisez PHP 4.1 et utilisez un tableau GET avec les points.JavaScript (ES6), 244
249 274Les espaces principaux et les nouvelles lignes ont été ajoutés pour plus de clarté et ne sont pas comptés, à l' exception de la nouvelle ligne proche de la fin de l'appel de jointure, qui est significative et comptabilisée.
Tester l'exécution de l'extrait de code (ECMAScript 6, Firefox et Safari 9 uniquement)
la source
C, 557
Version non-golfée:
L'allocation dynamique de mémoire n'est pas beaucoup plus difficile, mais malloc est un identifiant beaucoup trop long pour être utilisé en code golf. Je pense qu'il devrait y avoir une sorte d'en-tête PCG.h légalement auto-inclus pour jouer au golf en c, juste pour raccourcir certains identifiants.
la source
Groovy, 359
la source
Common Lisp - 603
Implémentation sans matrice: imprime de haut en bas, de gauche à droite.
Analyser et développer les directions en une trace d'
(x y char)
éléments:La simple entrée "N3" produit
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
ety
y
premier, puis enx
Itérer sur la liste triée en déplaçant le curseur
x - minx
,y - miny
, imprimer le caractère désiréExemples
Résultat:
la source
CoffeeScript,
303285 octetsAfficher l'extrait de code
la source