Die Herausforderung
Der kürzeste Code nach Zeichenanzahl, um eine 2D-Darstellung einer Karte einzugeben und je nach Eingabe 'true' oder 'false' auszugeben .
Das Brett besteht aus 4 Arten von Fliesen:
# - 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)
Es gibt nur einen Laser und nur ein Ziel . Wände müssen ein festes Rechteck beliebiger Größe bilden, in dem sich Laser und Ziel befinden. Wände im 'Raum' sind möglich.
Laserstrahl schießt und wandert von seinem Ursprung in die Richtung, in die er zeigt. Wenn ein Laserstrahl auf die Wand trifft, stoppt er. Wenn ein Laserstrahl auf einen Spiegel trifft, springt er um 90 Grad in die Richtung, in die der Spiegel zeigt. Spiegel sind zweiseitig, was bedeutet, dass beide Seiten "reflektierend" sind und einen Strahl auf zwei Arten reflektieren können. Wenn ein Laserstrahl auf den Laser ( ^v><
) selbst trifft , wird er als Wand behandelt (Laserstrahl zerstört den Beamer und trifft daher niemals das Ziel).
Testfälle
Eingang: ########## # / \ # # # # \ x # #> / # ########## Ausgabe: wahr Eingang: ########## # vx # # / # # / # # \ # ########## Ausgabe: falsch Eingang: ############## # # # #> # # # # # # # x # # # # ############## Ausgabe: falsch Eingang: ########## # / \ / \ / \ # # \\ // \\\ # # // \ / \ / \\ # # \ / \ / \ / x ^ # ########## Ausgabe: wahr
Die Codeanzahl umfasst die Eingabe / Ausgabe (dh das vollständige Programm).
quelle
Antworten:
Perl,
166160 ZeichenPerl,
251248246222214208203201193190180176173170166 -> 160 Zeichen.Die Lösung hatte 166 Schläge, als dieser Wettbewerb endete, aber A. Rex hat ein paar Möglichkeiten gefunden, um 6 weitere Charaktere zu rasieren:
Die erste Zeile lädt die Eingabe in
%t
eine Tabelle der Karte, in$t{99*i+j}
der das Zeichen in Zeile i , Spalte j enthalten ist . Dann,Es durchsucht die Elemente von
%t
nach einem Zeichen, das mit> ^ <
oder übereinstimmtv
, und setzt gleichzeitig$d
einen Wert zwischen 0 und 3, der die Anfangsrichtung des Laserstrahls angibt.Zu Beginn jeder Iteration in der Hauptschleife aktualisieren wir,
$d
ob sich der Strahl derzeit auf einem Spiegel befindet. XOR'ing um 3 ergibt das richtige Verhalten für einen\
Spiegel und XOR'ing um 1 ergibt das richtige Verhalten für einen/
Spiegel.Als nächstes wird die aktuelle Position
$r
entsprechend der aktuellen Richtung aktualisiert.Wir weisen das Zeichen an der aktuellen Position zu
$_
, um die Match-Operatoren bequem zu nutzen.Fahren Sie fort, wenn sich eine Leerstelle oder ein Spiegelzeichen befindet. Andernfalls beenden wir,
true
wenn wir uns auf dem Ziel befinden ($_ =~ /x/
) undfalse
ansonsten.Einschränkung: Funktioniert möglicherweise nicht bei Problemen mit mehr als 99 Spalten. Diese Einschränkung könnte auf Kosten von 3 weiteren Zeichen aufgehoben werden.
quelle
s!.!$t{$s++}=$&!ge,$s=$r+=99for<>;
und ändern Sie%d=split//,.." to
% d = .. = ~ /./ g, and change
grep {..}% t` ingrep..,%t
Perl, 177 Zeichen
Der erste Zeilenumbruch kann entfernt werden. Die anderen beiden sind obligatorisch.
Erläuterung:
Wenn ein sich nach rechts bewegender Strahl in einen {leeren Raum, einen nach oben abgewinkelten Spiegel, einen nach unten abgewinkelten Spiegel} läuft, wird er zu einem {nach rechts bewegten Strahl, einem sich nach oben bewegenden Strahl, einem sich nach unten bewegenden Strahl}.
$/
Auf dem Weg initialisieren - zum Glück ist "6" kein gültiges Eingabezeichen.Lesen Sie die Tafel in
$_
.$s
ist das Symbol für alles, worauf der Strahl jetzt sitzt. Da der Laseremitter wie eine Wand behandelt werden soll, stellen Sie dies zunächst als Wand ein.Wenn der Laserstrahl nur nach rechts zeigt, drehen Sie das Symbol und dann die gesamte Platine an Ort und Stelle (drehen Sie auch die Symbole für die Spiegel). Es handelt sich um eine 90-Grad-Drehung nach links, die effektiv durch Umkehren der Zeilen beim Transponieren von Zeilen und Spalten in einer leicht teuflischen
s///e
Nebenwirkung erreicht wird. Im Golfcode ist das tr in der Form geschrieben,y'''
die es mir ermöglicht, einen Backslashing einen Backslash zu überspringen.Beenden Sie mit der richtigen Nachricht, wenn wir das Ziel oder eine Wand treffen.
Wenn sich vor dem Laser ein leerer Raum befindet, gehen Sie vorwärts. Wenn sich vor dem Laser ein Spiegel befindet, bewegen Sie sich vorwärts und drehen Sie den Strahl. In beiden Fällen setzen Sie das "gespeicherte Symbol" wieder an die alte Position des Strahls und setzen Sie das, was wir gerade überschrieben haben, in das gespeicherte Symbol.
Wiederholen Sie bis zur Beendigung.
{...;redo}
ist zwei Zeichen kleiner alsfor(;;){...}
und drei Zeichen kleiner alswhile(1){...}
.quelle
C89 (209 Zeichen)
Erläuterung
Diese Monstrosität wird wahrscheinlich schwer zu verfolgen sein, wenn Sie C nicht verstehen. Nur eine Warnung.
Dieses kleine Makro prüft, ob das aktuelle Zeichen (
*p
) dem entspricht, wasa
in Zeichenform (*#a
) vorliegt . Wenn sie gleich sind, setzen Sie den Bewegungsvektor aufb
(m=b
), markieren Sie dieses Zeichen als Wand (*p=1
) und setzen Sie den Startpunkt auf die aktuelle Position (q=p
). Dieses Makro enthält den Teil "else".Deklarieren Sie einige Variablen. *
q
ist der aktuelle Standort des Lichts. *G
ist das Spielbrett als 1D-Array. *p
ist der aktuelle Leseort beim AuffüllenG
. *w
ist die Breite des Boards.Offensichtlich
main
.m
ist eine Variable, die den Bewegungsvektor speichert. (Es ist ein Parametermain
als Optimierung.)Durchlaufen Sie alle Zeichen und füllen Sie sie
G
mitp
.G[0]
Als Optimierung überspringen (p
im dritten Teil von muss kein Zeichen erneut geschrieben werdenfor
).Verwenden Sie nach Möglichkeit das oben genannte Makro, um den Lazer zu definieren.
-1
und1
entsprechen links bzw. rechts und-w
undw
auf und ab.Wenn das aktuelle Zeichen eine Zeilenende-Markierung (ASCII 10) ist, legen Sie die Breite fest, falls diese noch nicht festgelegt wurde. Das übersprungene
G[0]
erlaubt uns zu schreibenw=p-G
stattw=p-G+1
. Auch dies beendet die?:
Kette von denM
's.Bewegen Sie das Licht um den Bewegungsvektor.
Reflektieren Sie den Bewegungsvektor.
Wenn dies eine Wand ist oder
x
beenden Sie mit der entsprechenden Nachricht (m=0
beendet die Schleife). Ansonsten nichts tun (noop;m=m
)quelle
g.c:3: declaration expected
:(puts
der Erklärung hat geholfen, aber nicht genug, um sie unter 170 zu bringen. 209 ist jedoch ziemlich gut, also denke ich, dass ich es dabei belassen werde. Danke für deine Hilfe, Leute. Ich weiß das wirklich zu schätzen. =] (Alles, um diese Perl-Hexen zu entthronen!)Ich würde wetten, dass die Leute eine LOOOOONG-Zeit auf diesen gewartet haben. (Was meinst du damit, die Herausforderung ist vorbei und niemand kümmert sich mehr darum?)
Siehe ... ich präsentiere hier eine Lösung in
Befunge-93!
Es wiegt satte 973 Zeichen (oder 688, wenn Sie gemeinnützig genug sind, um Leerzeichen zu ignorieren, die nur zum Formatieren verwendet werden und im eigentlichen Code nichts bewirken ).
Vorsichtsmaßnahme : Ich habe vor kurzem meinen eigenen Befunge-93-Interpreter in Perl geschrieben, und leider ist dies alles, womit ich wirklich Zeit hatte, ihn zu testen. Ich bin ziemlich zuversichtlich, dass es im Allgemeinen
<>
korrekt ist , aber es kann eine merkwürdige Einschränkung in Bezug auf EOF geben: Da Perls Operator am Ende der Datei undef zurückgibt, wird dies im numerischen Kontext als 0 verarbeitet. Bei C-basierten Implementierungen, bei denen EOF einen anderen Wert hat (z. B. -1), funktioniert dieser Code möglicherweise nicht.Erläuterung
Wenn Sie mit der Befunge-Syntax und -Operation nicht vertraut sind, klicken Sie hier .
Befunge ist eine stapelbasierte Sprache, aber es gibt Befehle, mit denen man Zeichen in den Befunge-Code schreiben kann. Ich nutze das an zwei Stellen. Zuerst kopiere ich die gesamte Eingabe auf das Befunge-Board, aber ein paar Zeilen unter dem tatsächlich geschriebenen Code. (Dies ist natürlich nie sichtbar, wenn der Code ausgeführt wird.)
Der andere Ort befindet sich oben links:
In diesem Fall speichere ich in dem oben hervorgehobenen Bereich einige Koordinaten. In der ersten Spalte in der mittleren Zeile speichere ich die x-Koordinate für die aktuelle "Cursorposition". In der zweiten Spalte speichere ich die y-Koordinate. Die nächsten beiden Spalten dienen zum Speichern der x- und y-Koordinate der Laserstrahlquelle, wenn diese gefunden wird. und die letzte Spalte (mit dem 'a'-Zeichen) wird schließlich überschrieben, um die aktuelle Strahlrichtung zu enthalten, die sich offensichtlich ändert, wenn der Strahlengang verfolgt wird.
Das Programm beginnt mit der Platzierung von (0,27) als anfängliche Cursorposition. Anschließend wird die Eingabe zeichenweise gelesen und an der Cursorposition platziert. Zeilenumbrüche bewirken lediglich, dass die y-Koordinate zunimmt und die x-Koordinate auf 0 zurückkehrt, genau wie bei einem echten Wagenrücklauf. Schließlich wird undef vom Interpreter gelesen und dieser 0-Zeichen-Wert wird verwendet, um das Ende der Eingabe zu signalisieren und mit den Laseriterationsschritten fortzufahren. Wenn das Laserzeichen [<> ^ v] gelesen wird, wird es auch in das Speicher-Repository kopiert (über das 'a'-Zeichen) und seine Koordinaten werden in die Spalten links kopiert.
Das Endergebnis all dessen ist, dass die gesamte Datei im Grunde genommen in den Befunge-Code kopiert wird, ein wenig unterhalb des tatsächlich durchquerten Codes.
Anschließend wird die Strahlposition zurück in die Cursorpositionen kopiert und die folgende Iteration durchgeführt:
Wenn es genügend Nachfrage gibt, werde ich versuchen, genau darauf hinzuweisen, wo im Code all dies erreicht wird.
quelle
F #, 36 Zeilen, sehr gut lesbar
Ok, nur um eine Antwort zu bekommen:
Proben:
quelle
Golfscript - 83 Zeichen (Mashup von mir und Strager)
Die Newline ist nur zum Einwickeln da
Golfscript - 107 Zeichen
Die Newline dient nur der Übersichtlichkeit
Wie es funktioniert.
In der ersten Zeile wird die ursprüngliche Position und Richtung ermittelt.
Die zweite Linie dreht sich immer dann, wenn der Laser auf einen Spiegel trifft.
quelle
353 Zeichen in Ruby:314277 Zeichen jetzt!OK, 256 Zeichen in Ruby und jetzt bin ich fertig. Schöne runde Nummer zum Anhalten. :) :)247 Zeichen. Ich kann nicht aufhören223203201 Zeichen in RubyMit Leerzeichen:
Leicht überarbeitet:
quelle
ch
inC
oder einen anderen Buchstaben mit 1 Zeichen umbenennen , um 2 Zeichen zu speichern!i++
(statti+=1
)?Python
294277253240232 Zeichen einschließlich Zeilenumbrüche:(Das erste Zeichen in den Zeilen 4 und 5 ist eine Registerkarte, keine Leerzeichen.)
Ich hatte vergessen, dass Python sogar optionale Semikolons hatte.
Wie es funktioniert
Die Schlüsselidee hinter diesem Code ist die Verwendung komplexer Zahlen zur Darstellung von Positionen und Richtungen. Die Reihen sind die imaginäre Achse und nehmen nach unten zu. Die Spalten sind die reale Achse und werden nach rechts vergrößert.
l='>v<^';
eine Liste der Lasersymbole. Die Reihenfolge wird so gewählt, dass der Index eines Laserrichtungszeichens einer Potenz von sqrt (-1) entspricht.x={'/':'^<v>','\\':'v>^<',' ':l};
eine Transformationstabelle, die bestimmt, wie sich die Richtung ändert, wenn der Strahl verschiedene Kacheln verlässt. Die Kachel ist der Schlüssel und neue Richtungen sind die Werte.b=[1];
hält das Brett. Das erste Element ist 1 (wird als wahr ausgewertet), sodass die while-Schleife mindestens einmal ausgeführt wird.r=p=0
r
ist die aktuelle Zeilennummer des Eingangs,p
ist die aktuelle Position des Laserstrahls.while b[-1]:
Beenden Sie das Laden von Board-Daten, wenn raw_input eine leere Zeichenfolge zurückgibtb+=[raw_input()];r+=1
Hängen Sie die nächste Eingabezeile an die Karte an und erhöhen Sie den Zeilenzählerfor g in l:
Errate nacheinander jede Laserrichtungc=b[r].find(g)
Stellen Sie die Spalte auf die Position des Lasers oder -1 ein, wenn sie nicht in der Linie liegt (oder in eine andere Richtung zeigt).if-1<c:p=c+1j*r;d=g
Wenn wir einen Laser gefunden haben, stellen Sie die aktuelle Positionp
und Richtung eind
.d
ist einer der Zeichen inl
Nach dem Laden der Platine
b
wurden die aktuelle Positionp
und Richtungd
auf die der Laserquelle eingestellt.while' '<d:
Leerzeichen hat einen niedrigeren ASCII-Wert als jedes der Richtungssymbole, daher verwenden wir ihn als Stopp-Flag.z=l.find(d);
Index der aktuellen Richtung char in derl
Zeichenfolge.z
wird später verwendet, um sowohl die neue Strahlrichtung anhand derx
Tabelle zu bestimmen als auch die Position zu erhöhen.p+=1j**z;
Erhöhen Sie die Position mit einer Potenz von i. Zum Beispiell.find('<')==2
-> i ^ 2 = -1, wodurch eine Spalte nach links verschoben wird.c=b[int(p.imag)][int(p.real)];
Lesen Sie das Zeichen an der aktuellen Positiond=x.get(c,' '*4)[z]
Suchen Sie in der Transformationstabelle nach der neuen Richtung für den Strahl. Wenn das aktuelle Zeichen nicht in der Tabelle vorhanden ist, setzen Sie esd
auf Leerzeichen.print'#'<c
print false, wenn wir auf etwas anderem als dem Ziel angehalten haben.quelle
p+=1j**z
: Das ist süß.Dies
heißtwar ein direkter Anschluss von Brians Lösung C # 3, abzüglich der Konsole Interaktionen. Dies ist kein Eintrag in der Herausforderung, da es sich nicht um ein vollständiges Programm handelt. Ich habe mich nur gefragt, wie einige der von ihm verwendeten F # -Konstrukte in C # dargestellt werden könnten.Bearbeiten: Nach einigen Experimenten der folgende ziemlich ausführliche Suchcode:
wurde durch einen viel kompakteren LINQ to Objects-Code ersetzt:
quelle
F #, 255 Zeichen (und immer noch ziemlich lesbar!):
Ok, nach einer Nachtruhe habe ich das sehr verbessert:
Lassen Sie uns Zeile für Zeile darüber sprechen.
Schlürfen Sie zunächst alle Eingaben in ein großes eindimensionales Array (2D-Arrays können für Code-Golf schlecht sein; verwenden Sie einfach ein 1D-Array und addieren / subtrahieren Sie die Breite einer Linie zum Index, um eine Linie nach oben / unten zu verschieben).
Als nächstes berechnen wir 'w', die Breite einer Eingabezeile, und 'c', die Startposition, indem wir in unser Array indizieren.
Definieren wir nun die 'nächste' Funktion 'n', die eine aktuelle Position 'c' und eine Richtung 'd' einnimmt, die 0,1,2,3 für oben, links, rechts, unten ist.
Das Index-Epsilon 'e' und das Was-neue-Richtung-wenn-wir-einen-Schrägstrich treffen 'werden von einer Tabelle berechnet. Wenn zum Beispiel die aktuelle Richtung 'd' 0 (aufwärts) ist, sagt das erste Element der Tabelle "-w, 2", was bedeutet, dass wir den Index um w dekrementieren, und wenn wir einen Schrägstrich treffen, ist die neue Richtung 2 (richtig).
Jetzt kehren wir mit (1) dem nächsten Index ("c + e" - aktuell plus epsilon) und (2) der neuen Richtung, die wir berechnen, indem wir nach vorne schauen, um zu sehen, in was sich das Array befindet, in die nächste Funktion 'n' zurück diese nächste Zelle. Wenn der Lookahead-Zeichen ein Schrägstrich ist, lautet die neue Richtung 's'. Wenn es sich um einen Backslash handelt, beträgt die neue Richtung 3 Sekunden (unsere Wahl der Codierung 0123 macht dies möglich). Wenn es ein Leerzeichen ist, gehen wir einfach weiter in die gleiche Richtung 'd'. Und wenn es sich um ein anderes Zeichen 'c' handelt, endet das Spiel und gibt 'true' aus, wenn das Zeichen 'x' war, andernfalls false.
Zum Auftakt rufen wir die rekursive Funktion 'n' mit der Anfangsposition 'c' und der Startrichtung auf (die die anfängliche Kodierung der Richtung in 0123 vornimmt).
Ich denke, ich kann wahrscheinlich noch ein paar Charaktere davon rasieren, aber ich bin ziemlich zufrieden damit (und 255 ist eine nette Zahl).
quelle
Das Wiegen von 18203 Zeichen ist eine Python-Lösung, die:
Es muss noch etwas aufgeräumt werden und ich weiß nicht, ob die 2D-Physik vorschreibt, dass der Strahl sich nicht selbst kreuzen kann ...
Ein Bash-Skript zur Darstellung der Farbfehlerberichterstattung:
Die in der Entwicklung verwendeten Unittests:
quelle
Ruby, 176 Zeichen
Ich habe eine einfache Zustandsmaschine verwendet (wie die meisten Poster), nichts Besonderes. Ich habe es einfach mit jedem Trick, den ich mir vorstellen konnte, runtergeschnitten. Das bitweise XOR, das zum Ändern der Richtung verwendet wurde (als Ganzzahl in der Variablen gespeichert
c
), war eine große Verbesserung gegenüber den Bedingungen, die ich in früheren Versionen hatte.Ich habe den Verdacht, dass der Code, der inkrementiert
x
undy
verkürzt werden könnte. Hier ist der Abschnitt des Codes, der das Inkrementieren ausführt:Edit : Ich konnte das obige etwas kürzen:
Die aktuelle Richtung des Lasers
c
wird wie folgt gespeichert:Der Code stützt sich auf diese Tatsache zu erhöhen
x
undy
durch die richtige Menge (0, 1 oder -1). Ich habe versucht, die Zahlen für jede Richtung neu anzuordnen, und nach einer Anordnung gesucht, mit der ich die Werte bitweise manipulieren kann, da ich das Gefühl habe, dass sie kürzer als die arithmetische Version ist.quelle
C # 3.0
259 Zeichen
Etwas besser lesbar:
Die Hauptverschwendung von Zeichen scheint darin zu liegen, die Breite der Karte und die Position der Laserquelle zu ermitteln. Irgendwelche Ideen, wie man das verkürzt?
quelle
while(1)
C + ASCII, 197 Zeichen:
Diese C-Lösung setzt einen ASCII-Zeichensatz voraus, sodass wir den XOR-Spiegeltrick verwenden können. Es ist auch unglaublich zerbrechlich - zum Beispiel müssen alle Eingabezeilen gleich lang sein.
Es unterschreitet die 200-Zeichen-Marke - aber verdammt noch mal, ich habe diese Perl-Lösungen immer noch nicht geschlagen!
quelle
Golfscript (83 Zeichen)
Hallo Gnibbler!
quelle
Python - 152
Liest Eingaben aus einer Datei namens "L"
Um von stdin zu lesen, ersetzen Sie die erste Zeile durch diese
Wenn Sie wahr / falsch in Kleinbuchstaben benötigen, ändern Sie die letzte Zeile in
quelle
True
zutrue
undFalse
zu zu wechselnfalse
? ;-)D<5
" in "print D <5" ändern ? Oder fehlt mir etwas?JavaScript - 265 Zeichen
Update IV - Es besteht die Möglichkeit, dass dies die letzte Runde von Updates ist, bei denen ein paar weitere Zeichen eingespart werden können, indem zu einer Do-While-Schleife gewechselt und die Bewegungsgleichung neu geschrieben wird.
Update III - Dank des Vorschlags von strager, Math.abs () zu entfernen und die Variablen in den globalen Namensraum zu stellen, wurde der Code in Verbindung mit einer Neuanordnung der Variablenzuweisungen auf 282 Zeichen reduziert.
Update II - Einige weitere Aktualisierungen des Codes, um die Verwendung von! = -1 zu entfernen, sowie einige bessere Verwendung von Variablen für längere Operationen.
Update - Wenn Sie fertig sind und einige Änderungen vorgenommen haben, indem Sie einen Verweis auf die Funktion indexOf erstellen (danke LiraNuna!) Und nicht benötigte Klammern entfernen.
Dies ist mein erstes Mal, dass ich Code Golf spiele, daher bin ich mir nicht sicher, wie viel besser dies sein könnte. Feedback wird geschätzt.
Vollständig minimierte Version:
Originalversion mit Kommentaren:
Webseite zum Testen mit:
quelle
index != -1
mitindex > 0
bitte! (Hoffentlich setzt niemand den Lazer in die obere linke Ecke, damit er0
nicht zurückgegeben wird. =]) Sie können dievar
Anweisungen verketten oder ganz entfernen (indem Sie die Variablen in den globalen Namespace einfügen). Ich denkeMath.abs(m)==1
kann durch ersetzt werdenm==-1|m==1
. Kannmovement = ...; location += movement
optimiert werdenlocation += movement =
?function(a){return g.indexOf(a)}
kann durchfunction(a)g.indexOf(a)
in neueren JavaScript-Versionen ersetzt werden.Haus der Spiegel
Kein wirklicher Einstieg in die Herausforderung, aber ich habe ein Spiel geschrieben, das auf diesem Konzept basiert (nicht zu lange zurück).
Es ist in Scala geschrieben, Open Source und hier verfügbar :
Es macht ein bisschen mehr; befasst sich mit Farben und verschiedenen Arten von Spiegeln und Geräten, aber Version 0.00001 hat genau das getan, was diese Herausforderung verlangt. Ich habe diese Version jedoch verloren und sie wurde sowieso nie für die Anzahl der Zeichen optimiert.
quelle
c (K & R) 339 notwendige Zeichen nach weiteren Vorschlägen von strager.
Der Physiker in mir bemerkte, dass die Ausbreitungs- und Reflexionsoperationen zeitumkehrinvariant sind, daher wirft diese Version Strahlen vom Ziel und prüft, ob sie am Laseremitter ankommen.
Der Rest der Implementierung ist sehr einfach und basiert mehr oder weniger genau auf meinen früheren Bemühungen.
Komprimiert:
Unkomprimiert (ish):
Es gibt keine Eingabevalidierung, und eine schlechte Eingabe kann sie in eine Endlosschleife senden. Funktioniert ordnungsgemäß mit Eingaben, die nicht größer als 99 x 99 sind. Erfordert einen Compiler, der die Standardbibliothek ohne Einfügen eines der Header verknüpft. Und ich denke, ich bin fertig, Strager hat mich trotz seiner Hilfe um einiges geschlagen .
Ich hoffe eher, dass jemand einen subtileren Weg zeigt, um die Aufgabe zu erfüllen. Daran ist nichts auszusetzen, aber es ist keine tiefe Magie.
quelle
=0
die Globals, da sie standardmäßig auf 0 initialisiert sind. Ersetzen Sie Zeichenkonstanten durch ihre Dezimalstellen. Verwenden Sie>0
anstelle von!=EOF
, um mit EOF (und\0
) zu vergleichen. Sie können wahrscheinlich einen#define
Teil des Codes so entfernen,case
wie ich es mitif
s getan habe . Keine Notwendigkeit für die zusätzlichen\n
imputs
soputs
muss sowieso eine neue Zeile drucken.for(;;)
ist kürzer alswhile(1)
. Hoffe das hilft. =]"There is no input validation"
- Es sollte keine geben. Um es den Golfern zu erleichtern, wird davon ausgegangen, dass die Eingabe immer "sauber" ist, sofern nicht anders angegeben.Rubin - 146 Zeichen
quelle
PostScript , 359 Bytes
Erster Versuch, viel Raum für Verbesserungen ...
quelle
Haskell,
395391383361339 Zeichen (optimiert)Verwendet immer noch eine generische Zustandsmaschine und nichts Kluges:
Eine lesbare Version:
quelle
Ich glaube an die Wiederverwendung von Code, ich würde einen Ihrer Codes als API verwenden :).
32 Zeichen \ o / ... wohoooo
quelle
C ++: 388 Zeichen
( 318 ohne Überschriften)
Wie es funktioniert:
Zuerst werden alle Zeilen eingelesen, dann wird der Laser gefunden. Im Folgenden wird ausgewertet,
0
solange noch kein Laserpfeil gefunden wurde, und gleichzeitigx
der horizontalen Position zugewiesen .Dann schauen wir uns die Richtung an, in der wir sie gefunden haben, und speichern sie
i
. Gerade Werte voni
sind oben / links ("abnehmend") und ungerade Werte sind unten / rechts ("ansteigend"). Nach diesem Begriff werdend
("Richtung") undr
("Orientierung") eingestellt. Wir indizieren das Zeigerarrayz
mit Ausrichtung und fügen die Richtung der Ganzzahl hinzu, die wir erhalten. Die Richtung ändert sich nur, wenn wir einen Schrägstrich treffen, während sie gleich bleibt, wenn wir einen Schrägstrich treffen. Wenn wir auf einen Spiegel treffen, ändern wir natürlich immer die Ausrichtung (r = !r
).quelle
Groovy @ 279 Zeichen
quelle
C #
1020 Zeichen.1088 Zeichen (Eingabe von der Konsole hinzugefügt).925 Zeichen (überarbeitete Variablen).875 Zeichen (redundanter Dictionary-Initialisierer entfernt; geändert in Binär & Operatoren)
Es wurde darauf hingewiesen, dass Sie sich vor dem Posten keine anderen ansehen sollten. Ich bin mir sicher, dass es ein bisschen LINQ sein könnte. Und die ganze FindLaser-Methode in der lesbaren Version scheint mir furchtbar faul zu sein. Aber es funktioniert und es ist spät :)
Beachten Sie, dass die lesbare Klasse eine zusätzliche Methode enthält, mit der die aktuelle Arena ausgedruckt wird, wenn sich der Laser bewegt.
Lesbare Version (nicht ganz die endgültige Golfversion, aber dieselbe Voraussetzung):
quelle
Perl 219
Meine Perl-Version ist
392342 Zeichen lang (ich musste den Fall behandeln, dass der Strahl auf den Laser trifft):Update , danke Hobbs, dass er mich daran erinnert hat
tr//
, es sind jetzt 250 Zeichen:Aktualisieren , Entfernen des
m
Inm//
, Ändern der beidenwhile
mitgebrachten Schleifen ein paar Einsparungen; Es ist nur noch ein Platz erforderlich.(
L:it;goto L
ist gleich lang wiedo{it;redo}
):Ich habe einige rasiert, aber es konkurriert
kaummit einigen davon, wenn auch spät.Es sieht ein bisschen besser aus als:
Nun ... Ehrlich gesagt sollte dies selbsterklärend sein, wenn Sie verstehen, dass
@b
es sich um ein Array von Zeichen in jeder Zeile handelt und Sie den einfachen regulären Ausdruck und dietr
Anweisungen lesen können .quelle
$_=$s;tr/^v<>/<>^v/
und$_=$s;tr/v^<>/<>^v/
jeweils. Außerdem brauchen Sie dasm
in nichtm//
.$_=$s;tr/v^></<>^v/;
if m/.../
, dieif/.../
zwei Zeichen pro Pop speichern könnten .y///
statttr///
zwei Zeichen speichern.F # - 454 (oder ungefähr)
Etwas spät zum Spiel, kann aber nicht widerstehen, meinen zweiten Versuch zu veröffentlichen.
Update leicht modifiziert. Stoppt jetzt korrekt, wenn der Sender getroffen wird. Gekniffen Brians Idee für IndexOfAny (schade, dass diese Zeile so ausführlich ist). Ich habe es nicht wirklich geschafft, herauszufinden, wie ReadToEnd von der Konsole zurückkehren kann, also vertraue ich darauf ...
Ich bin mit dieser Antwort zufrieden, als wäre sie ziemlich kurz, aber immer noch ziemlich lesbar.
quelle