Lasse eine Schlange jedes Labyrinth füllen (bis es stecken bleibt).
Die Schlange
Die Schlange startet an einem bestimmten Startpunkt und zeigt nach Osten . Er bewegt sich durch immer eine Wand oder einen Teil seines Körpers unmittelbar an die mit LEFT seines Kopfes ( „ linke Regel Wand Folger “), bis er stecken bleibt , da alle vier Richtungen um den Kopf besetzt sind. (Hinweis: Eine feststeckende Schlange kann möglicherweise nicht den gesamten erreichbaren Raum ausfüllen, aber das ist nicht das Ziel!)
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die ein Labyrinth als Eingabe in Form eines 2D-Textes akzeptiert:
- Die Eingabe kann in jedem vernünftigen Format erfolgen: z. B. eine Liste von Zeichenfolgen, eine einzelne Zeichenfolge mit Zeilenumbrüchen, eine Datei.
- Das Labyrinth hat Wände ("
#
"), leere Räume ("") und genau einen Startpunkt ("
o
"). Sie können wählen, um
- entweder nehmen Sie an, dass die erste und letzte Reihe und Spalte vollständig Wände sind;
- oder nehmen Sie an, dass jede Eingabe eine implizite äußere Wandschicht aufweist
Sie können davon ausgehen, dass sich direkt über dem Startpunkt eine Wand (oder eine implizite Wand) befindet (NORTH) und dass die Schlange eine gültige Startbewegung in Richtung OST oder SÜD ausführen kann.
- Sie können davon ausgehen, dass der Text keine anderen Zeichen enthält (außer Zeilenumbrüche, wenn Ihre Eingabe diese benötigt).
- Sie können davon ausgehen, dass alle Zeilen gleich lang sind.
und druckt / gibt ein "gefülltes Labyrinth" als Ausgabe zurück, mit einem Schnappschuss der Schlange in dem Moment, in dem sie stecken blieb :
- Der Körper der Schlange wird durch die Zeichen dargestellt,
>v<^
die auf das nächste Segment zeigen - Der Startpunkt der Schlange ist entweder ihre Richtung am Start ("
>
", es sei denn, sie musste sich sofort umdrehen) oder eino
Charakter (keine Notwendigkeit, konsistent zu sein). - Der Endpunkt der Schlange ist ein
o
Charakter
Wertung
Üblicher Code Golf: Der kürzeste Code gewinnt
Beispiel
in:
#################################
# o #
# #
# ## ### ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ### ## #
# ## ##### ## #
# ## ##### ## #
# ## ### ## #
# ## ## #
# #
# #
#################################
out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^ ##>>>>>>v###o>>>>>v## vv#
#^^ ##>^ ##>>>>^## >v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##>^ ## ## >v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^ ##### v## vv#
#^^ ##^ ##### v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^<<<<<<<<<<<<<<<<## vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animiert (zur Veranschaulichung):
Bearbeiten: Beachten Sie, dass die Schlange im Zweifelsfall "die linke Hand" an der Wand halten sollte, an der sie sich bereits befindet. Folgen Sie dabei den Ecken und springen Sie nicht zu einer 1 Block entfernten Wand.
Vielen Dank an Jonathan Allan, der das Thema angesprochen hat, und an Draco18s für den erklärenden Schnappschuss oben.
Andere Beispiele
in:
####################
# o# #
# ###
# #
# ## #
# ###
####################
out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^ v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
# o #####
# #####
# #
# ##
####################
out:
####################
# >>>>v#####
# v#####
# >>>>o#
# ##
####################
in:
################
#o #
# ########## #
# # # #
# # # #
# # # #
# # # # #
# # # #
# # # #
# # # #
# ############ #
# #
################
out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^# vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################
Antworten:
Kohle ,
9468 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Schlürfen Sie die Eingabe in eine Zeichenfolge. Dies könnte durch die Verwendung eines weniger bequemen Eingabeformats vermieden werden.
Drucken Sie die Eingabe, ohne den Cursor zu bewegen, und drucken Sie dann
o
erneut nach oben, sodass der Cursor darunter endet.Initialisieren Sie die aktuelle Richtung.
Wiederholen Sie diesen Vorgang, solange in eine Richtung noch Platz frei ist.
Berechnen Sie, ob sich die Schlange nach links drehen kann oder ob sie gezwungen ist, nach rechts zu drehen. Der Code
≦⊖θW¬⁼§KVθ ≦⊕θ
funktioniert auch hier für die gleiche Byteanzahl, obwohl er als aktiv und nicht0
als richtig betrachtet wird, sodass der Rest des Codes angepasst werden muss.Geben Sie den entsprechenden Körpercharakter in die entsprechende Richtung aus.
Stelle den Kopf wieder her. Dies kann auch so geschrieben werden,
Po
dass der Kopf gedruckt wird, ohne dass der Cursor bei jedem Durchlauf durch die Schleife bewegt wird (dies ermöglicht jedoch das implizite Schließen der Schleife bei gleicher Bytezahl).quelle
Python 2 ,
273253242 Bytes-11 Bytes dank ArBo
Probieren Sie es online!
Dies funktioniert, indem der String durchsucht
'o '
und durch ersetzt wird'[>v<^]o'
, wenn er sich im Labyrinth befindet.Dieselbe Überprüfung wird auch für das gedrehte Labyrinth durchgeführt, wobei das gefüllte Labyrinth gedruckt wird, wenn die Zeichenfolge nicht mehr vorhanden ist.
Die Funktion
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
dient zum Drehen des Rastersquelle
Jelly ,
7256 BytesProbieren Sie es online!
Ein vollständiges Programm, das die Eingabe als Liste von Zeichenfolgen aufnimmt und eine Liste von Zeichenfolgen mit der letzten Schlange zurückgibt. Beachten Sie, dass die Fußzeile in TIO eine einzelne durch Zeilenumbrüche getrennte Zeichenfolge in die gewünschte Eingabe konvertiert und die Zeilenumbrüche am Ende wiederherstellt. Dies dient lediglich der Bequemlichkeit.
Die Lösung ist etwas inspiriert von der von @ Rods Python 2-Antwort verwendeten Methode , obwohl die Implementierung sehr unterschiedlich ist.
quelle
Ruby ,
126118 Bytes-8 Bytes werden durch Missbrauch gespart,
+=
anstatto
nach einer Neupositionierung erneut manuell zu suchen .Probieren Sie es online!
quelle
T-SQL 2008-Abfrage,
373371366 ByteIch hatte eine Prioritätenliste, immer links, gerade, rechts. Ich habe diese Priorität geändert, um immer zurück, links, gerade, rechts zu rutschen. Das Zurückrutschen wird immer blockiert, daher bleibt die Priorität mit Ausnahme des ersten Rutschens gleich. Wenn Sie die Schlange anfangs nach unten drehen (C = 4), versucht sie, beim Zurückrutschen nach oben zu rutschen. Dieser kleine Stunt hat mir 2 Bytes gespart. Weil ich nicht 1 zu ~ - ~ -c% 4 addieren musste.
Ich habe 2 Zeilenumbrüche eingefügt, um es lesbar zu machen
Ich musste einige kleinere Anpassungen vornehmen, um dies online auszuführen, die gepostete Version läuft im MS-SQL Server Management Studio.
Drücken Sie vor der Ausführung in MS-SQL Server Management Studio die Tastenkombination Strg-T. Das Ergebnis wird als Text angezeigt.
Probieren Sie es online aus
quelle
Python 3 , 343 Bytes
Probieren Sie es online!
-11 Bytes dank ArBo
-4 Bytes dank Jonathan Frech
quelle
X
,Y
undF
zu ,X=0,1,0,-1;F,*Y=*X,0
wenn ich mich nicht irre. Außerdemimport*
kostet Sie das mehr Bytes als es spart.*g,=map(...)
. Und funktioniert dassys.stdin.readlines()
vielleicht?input()
.if C=="o"
~>if"o"==C
,if g[r+X[L]][c+Y[L]]==" "
,elif g[r+X[F]][c+Y[F]]>" "
,if g[r-X[L]][c-Y[L]]>" "
Entsprechend.05AB1E ,
5452 BytesI / O beide als einzelne mehrzeilige Zeichenfolge.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Pyth , 161 Bytes
Probieren Sie es online!
Port der Python 3-Lösung von HyperNeutrino . Jetzt, wo ich damit fertig bin, denke ich, dass ich stattdessen Rods Python 2-Lösung hätte portieren sollen, aber ich habe bereits viel zu viel Zeit damit verbracht.
quelle