Einführung
"Yarr !! Wir hatten einen Burschen, der sich" Programmierer "nannte, der eine Karte zu unserem verborgenen Schatz machte! Aber es ist mit seltsamen Zahlen und Buchstaben geschrieben!" E5, N2, E3 "... was macht das überhaupt? Wahnsinn! Ich kann nicht mal eine richtige Schatzkarte schreiben, das ist ein nutzloser Schwachsinn. Repariere es für uns! Wir schenken dir einen Teil des Schatzes! "
Herausforderungsbeschreibung
Eine Gruppe von Piraten hat Probleme, eine Schatzkarte zu lesen. Können Sie ein Programm schreiben, um es in eine ... piratey Form umzuwandeln?
Als Eingabe erhalten Sie die Original-Schatzkarte. Es ist eine Liste von durch Kommas getrennten Zeichenfolgen, wobei jede Zeichenfolge aus einem Buchstabenabschnitt (der den Piraten mitteilt, in welche Richtung sie gehen müssen) und einem Zahlenabschnitt (der den Piraten mitteilt, wie viele Schritte sie in diese Richtung ausführen müssen) besteht. Zum Beispiel die folgende Schatzkarte:
E2,N4,E5,S2,W1,S3
würde bedeuten: "Gehe zwei Schritte nach Osten, gehe vier Schritte nach Norden, gehe fünf Schritte nach Osten, gehe zwei Schritte nach Süden, gehe einen Schritt nach Westen und dann drei Schritte nach Süden."
Als Ausgabe, werden Sie die Karte in graphischer Form ausgegeben, mit den Zeichen >
, ^
, v
, und <
als Zeiger. Hier ist die Ausgabe für die obige Eingabe:
>>>>>v
^ v
^ v<
^ v
>>^ X
Beachten Sie, dass wir X
stattdessen den letzten Schritt nach Süden durch einen ersetzt haben . Dies liegt daran, dass der letzte Schritt darin besteht, den Schatz zu finden, und Piraten müssen, wie wir alle wissen, ein X auf ihren Schatzkarten haben, sonst wissen sie nicht, wie sie ihn lesen sollen.
Übrigens, die Karte wird sich nie selbst kreuzen, sodass Sie sich nicht um Überlappungen kümmern müssen. Außerdem darf am Ende der Ausgabe eine nachgestellte neue Zeile stehen.
Beispieleingänge und -ausgänge
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
sollte den Schritt nach dem letzten Zug markieren , so wie alle anderen Züge gezählt werden. Stellen Sie sich vor, der letzte Schritt ist N3: Sie gehen drei Schritte nach Norden und graben, aber hier gibt es nichts, Sie mussten stattdessen zwei Schritte gehen. Es macht mir nichts aus, wenn Sie die bestehende Regel beibehalten, da sie einen kleinen Eckfall hinzufügt, der behandelt werden muss. Aber denk dran, was mit dem Jungen passiert ist.Antworten:
Rubin,
213 209 198 186178Eingabe über stdin weiterleiten.
Dies verwendet ein
y -> x -> char
Wörterbuch, um die Karte zu konstruieren, wobei beidex
undy
negativ sein können. Sobald die Eingabe analysiert wurde, wird das globale Minimum der x-Koordinate extrahiert. Für jede Zeile durchläuft es dann einen Bereich, der vom globalen Minimal- zum Maximalindex für die aktuelle Zeile reicht, und gibt das richtige Zeichen für diesen Index aus.Um beim Thema zu bleiben, wurden die Ausdrücke, die sich
NESW
in die richtigen Indizes verwandeln , schamlos aus der Antwort von Sp3000 raubkopiert .Ursprüngliche Version, die ein
[x,y] -> char
Wörterbuch verwendet hat:quelle
Python 2,
249248244239237 BytesEingabe wie
"E2,N4,E5,S2,W1,S3"
.NSEW
wird abgebildet[1, 3, 2, 0]
vond=ord(c)%10%7
. Ob geänderty
oderx
dann entschieden wirdd%2
, und ob inkrementiert oder dekrementiert wird, wird von entschiedend-2|1
. Der erste und dritte Ausdruck wurden mit roher Gewalt gefunden.Ansonsten ist es eine einfache Verwendung eines verschachtelten Wörterbuchs des Formulars
{y: {x: char}}
.(Danke an @joriki für die Hilfe beim Mapping)
quelle
(d + 1 & 2) - 1
1|d%-3
(das ist die Verneinung, aber ich habe gerade gemerkt, dass das auch in Ordnung ist)!Javascript (ES6), 260
Dies war ein interessanter ...
Vielen Dank an @ETHproductions, @ edc65 und @vihan für die Hilfe!
Dies definiert eine anonyme Funktion. Wenn Sie sie also aufrufen, fügen Sie
f=
am Anfang einen Namen hinzu.Zu testen:
console.log(f("E2,N4,E5,S2,W1,S3"))
Erläuterung:
quelle
i++
von derfor
Schleife an die letzte Stelle verschieben, an der es verwendet wirdc=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
von anstelle vonArray(v.slice(1)- -1).join(v[0])
und" ".repeat(j-p-1)
anstelle vonArray(j-p).join(" ")
insgesamt 11 Byte empfehlen . Ich denke, Sie könnten auchF='forEach'
zu Beginn der Funktion setzen und dann.forEach
von dort zu wechseln[F]
, um weitere 4 zu sparen.if
s verwenden. Es kann hilfreich sein, wenn Sie gleichzeitig Variablen dekrementierenq=x=y=2e3
bedeuten, dass die Ausgabe falsch wäre, wenn ich das getan hätte, sagen wir malW9999
?PHP,
431417 BytesLegen Sie es in eine Datei (
treasure.php
), entfernen Sie den Einzug, verbinden Sie die Zeilen (es wird hier aus Gründen der Lesbarkeit umbrochen), setzen Sie den<?php
Marker an den Anfang der Datei (hier nicht angezeigt, da es technisch nicht Teil des Programms ist).Beispiel für die Ausführung:
Die Option
-d error_reporting=0
wird benötigt, um Benachrichtigungen über Werte zu unterdrücken, die bei angegebenen Indizes in nicht gefunden wurden$z
.Aktualisieren:
Während ich die unbenutzte Version des Codes für die Veröffentlichung vorbereitete, stellte ich fest, dass sie zwei nicht benötigte Zuweisungen (12 Byte) und ein Leerzeichen enthielt, das entfernt werden kann (
as$i
). Außerdem habe ich ein weiteres Byte gespeichert, indem ich awhile
durch einefor
Schleife ersetzte und eine Zuweisung in die Schleife drückte (dies ist mit derwhile
Schleife nicht möglich ).quelle
$count --;
.$argn
speichere 3 Byteschop
speichere 1 Byte"X"
->X
verwende Konstanten speichere mehr Bytes$argn
Hinweis nicht. Ich bin mir des"X"->X
Tricks bewusst , habe ihn aber wahrscheinlich vergessen, als ich diese Lösung schrieb. Ich schreibe seit 2002 PHP-Code, aber bis heute habe ich nicht bemerkt, dass PHP diechop()
Funktion bietet . Vielen Dank für diesen Hinweis.Perl,
702613546474439338260 BytesVielen Dank an Dom Hastings für seine Hilfe und seine Supergolf-Version.
Der Code verwendet ein 2D-Array.
Version von Dom Hastings:
Meine weniger Golf-Version von 338 Bytes (als Referenz):
Prüfung
quelle
use strict;
, benötigen Sie nicht allemy
s, wodurch Sie mindestens ein paar Bytes sparen. Auch==
ist kürzer alseq
da letztere Leerzeichen benötigt.$m
einmal auf. Statt das Befehlszeilenargument als Variable zu speichern, können Sie es direkt in aufrufensplit
, d@m=split(',',$ARGV[0])
. H.$d
und$s
Variablen können mit Regex erfasst werden, um Ihnen einige Bytes zu sparen($d,$s)=/^(.)(.+)$/
, und alleforeach
könnenfor
(wie sie sind) gleich sein. Sie können möglicherweise auch einige Zeichen speichern, indem Sie einige durchmap{
... ersetzen,}@x
da Sie die Parens ignorieren können um das iterierte Element (dies funktioniert gut, wenn Sie andere Schleifen enthalten müssen.) Wenn Sie verwenden$ARGV[0]
, können Sie das durch pop ersetzen, aber wenn Sie das Skript wie in verwendenperl script.pl <<< "text"
, können Sie<>
stattdessen verwenden!pop
mit ein paar speichern. Anstelle vonuse Swtich
und derswitch
/case
-Anweisung können Sie auch einzelne Überprüfungen durchführen, um Byte zu sparen. Sowas$y-="N"eq$d
wird auch funktionieren (da wahr1
und falsch ist''
). Oft kann man Wörter als Barwörter haben, also$y-=N eq$d
wird es funktionieren! Es gibt einige magische Variablen, die Sie verwenden können, um Bytes zu speichern,$/
ist'\n'
und$"
ist' '
, aber manchmal hilft auch ein Literal Newline, ein Zeichen zu speichern. Ein weiterer (schmutziger!) Trick sind mehrere Zuweisungen, um ein paar mehr zu retten, als es sein$a=0;$b=0;
kann$a=$b=0
.substr($_,0,1)
kann seinsubstr$_,0,1
. Postfix für Schleifen und wenn Überprüfungen auch nützlich sein können wie infor(@c){...}
vs.,...for@c
aber Sie können sie nicht;
im Code verwenden, müssen Sie stattdessen ein Komma trennen (was beim Aufrufen von Funktionen nicht immer funktioniert). Es gibt so viele tolle Tipps auch unter codegolf.stackexchange.com/questions/5105/… . Viel Glück!Python 2, 394 Bytes
Führen Sie das Programm aus und fügen Sie es in die Standardeingabe ein, z
"E2,N4,E5,S2,W1,S3"
Dies ist nicht sehr optimiert. Zuerst durchläuft es die Eingabe, um den Pfad aufzuzeichnen. Dann werden einige Berechnungen durchgeführt, um die richtige Startposition und Größe von zu bestimmen
o
. Dann läuft es nochmal durch und setzt die entsprechenden Einträgeo
als einen von>v<^X
. Der Hauptgrund liegt in der Wiederverwendung der gleichen Funktion für beide Traversen.quelle
XQuery 3.0, 498
XQuery ist oft nicht einmal leicht umkämpft, also hat es Spaß gemacht.
Ungolfed
quelle
PHP, 496
514528Ich habe mein Glück in PHP versucht, das Ergebnis ist ziemlich lang, ich möchte es trotzdem posten, nur zum Spaß.
Ungolfed
quelle
for(;$i++<$f;)
, versuchen, unnötige Klammern zu entfernen, undefinierte Konstanten (N
) anstelle von Strings ('N'
) zu verwenden, ...if
Verwenden Sie anstelle von s Trenary Operators oder Logical Ands. Es ist auch hilfreich, wenn Sie PHP4.1 verwenden und ein GET-Array mit den Punkten verwenden.JavaScript (ES6), 244
249 274Führende Leerzeichen und Zeilenumbrüche wurden der Übersichtlichkeit halber hinzugefügt und nicht gezählt, mit Ausnahme der Zeilenumbrüche am Ende des Join-Aufrufs, die signifikant und gezählt sind.
Testlauf des Snippets (nur ECMAScript 6, Firefox und Safari 9)
quelle
C 557
Ungolfed-Version:
Die dynamische Speicherzuweisung ist nicht viel schwieriger, aber malloc ist eine viel zu lange Kennung, um im Codegolf verwendet zu werden. Ich denke, es sollte eine Art PCG.h-Header geben, der legal automatisch für das Golfen in c enthalten ist, nur um einige Bezeichner zu verkürzen.
quelle
Groovy, 359
quelle
Common Lisp - 603
Array-freie Implementierung: Druckt von oben nach unten, von links nach rechts.
Analysiert und erweitert Richtungen in eine Spur von
(x y char)
Elementen:Der einfache "N3" -Eingang erzeugt
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
undy
y
zuerst nach und dann nachx
Durchlaufen Sie die sortierte Liste, während Sie den Cursor bewegen
x - minx
,y - miny
drucken, um das gewünschte ZeichenBeispiele
Ergebnis:
quelle
CoffeeScript,
303285 BytesCode-Snippet anzeigen
quelle