Problembeschreibung
Stellen Sie sich vor, Sie sind eine Schildkröte auf einem Gitter. Du erhältst zwei Zahlen f und b und siehst nach Osten. Sie marschieren über das Raster und zählen dabei jede Zelle, auf die Sie stoßen, gemäß den folgenden Regeln:
- Standardmäßig schreiben Sie die Zählung in die Zelle, in der Sie sich befinden, und gehen dann vorwärts.
- Wenn die Zählung durch f teilbar ist , schreiben Sie
F
in die Zelle , in der Sie sich befinden, biegen nach rechts ab und gehen vorwärts. - Wenn die Zählung durch b teilbar ist , schreiben Sie
B
in die Zelle , in der Sie sich befinden, biegen links ab und gehen vorwärts. - Wenn die Zählung sowohl durch f als auch durch b teilbar ist , schreiben Sie
FB
in die Zelle , in der Sie sich befinden, und gehen vorwärts. - Wenn du einen Platz erreichst, auf dem du schon warst, hörst du auf.
Wenn Sie beispielsweise diese Regeln mit f = 3 und b = 5 befolgen, wird ein Muster wie das folgende generiert:
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die zwei Zahlen als Eingabe akzeptiert, die f und b entsprechen , und als Ausgabe das Muster für diese Zahlen erzeugt, das durch die obigen Regeln gegeben ist.
Formatierungsanforderungen:
- Jede Zelle ist zwei Zeichen breit
- Der Zelleninhalt wird innerhalb dieser beiden Zeichen rechtsbündig ausgerichtet
- Zellen in derselben Zeile werden durch ein Leerzeichen begrenzt
- Die erste Spalte der Zellen muss eine nicht leere Zelle enthalten
- Alle Zeilen müssen nicht leere Zellen enthalten
- Ein nachgestelltes Leerzeichen ist nicht erforderlich, aber zulässig
- Die Gesamtbreite jeder Zeile darf jedoch das Dreifache der Anzahl nicht leerer Spalten nicht überschreiten
Ihr Code muss für bereitgestellte Testfälle funktionieren.
Standardlücken sind nicht zulässig.
Das ist Code Golf; kürzeste Antwort in Bytes gewinnt.
Testfälle
(f = 3, b = 5 Fall hier aus Höflichkeitsgründen wiederholt).
f=3, b=5 ->
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
f=4, b=10 ->
F 25 26 27 F
23 29
22 1 2 3 F
21 5
FB 6
19 7
18 B 9 F
17 11
F 15 14 13 F
f=3, b=11 ->
F 16 17 F
14 19
13 1 2 F
F B 4
10 5
F 8 7 F
f=5, b=9 ->
F 41 42 43 44 1 2 3 4 F
39 6
38 7
37 8
F B B F
34 11
33 12
32 13
31 14
F 29 28 B B 17 16 F
26 19
F 24 23 22 21 F
f=5, b=13 ->
F 31 32 33 34 F
29 36
28 1 2 3 4 F
27 6
F B 7
24 8
23 9
22 B 12 11 F
21 14
F 19 18 17 16 F
Antworten:
JavaScript (ES6), 230
240Weniger golfen
Prüfung
quelle
Python 2,
379338326 BytesNimmt die Eingabe als zwei durch Komma getrennte Zahlen an. Z.B.
4,5
oder(4,5)
Version, die funktioniert, wenn der Pfad länger als 99,
384,343,330 Bytes istZeigt 2 signifikante Ziffern an.
Beispiele:
input=(4,16)
input=(6,7)
(abgeschnittene Version)@Edit: Vielen Dank an Jonathan Allan, Copper und shooqie, die mir ein paar Bytes gespart haben.
quelle
while((x,y)not in p.keys()):
zuwhile(x,y)not in p:
undfor x,y in p.keys():
zu wechselnfor x,y in p
. Sie könnenl,r=i%b==0,i%f==0
zul,r=i%b<1,i%f<1
undd=(d+[0,1][r]-[0,1][l])%4
zu wechselnd=(d+r-l)%4
. Sie können ändern ,s=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=s
zup[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2)
. Es kann mehr gebenh*[' ']for x in range
anstelle von speichern[' ']*h for x in range
. Auchx+=[-1,1][d==1]
kann ersetzt werden mitx+=(d==1)*2-1
, undy+=[1,-1][d==2]
mit ausgewechselt werden kanny+=(d!=2)*2-1
. Auch istf,b=inputtt
ein Tippfehler?p[(x,y)]
=>p[x,y]
(nicht sicher, ob es in Python 2 funktioniert)Excel VBA,
347421 BytesNeue Version, um den Whitespace-Anforderungen gerecht zu werden. Das in meiner ersten Version nicht zu haben, war ein Versehen in meinem Teil, aber das fordert seinen Tribut im bytecount ... Es schneidet jetzt den verwendeten Bereich ab und fügt ihn in die Zelle ein
A1
.Hier ist die alte Version, in die das Endergebnis nicht verschoben wurde
A1
Beginnt bei 70, 70 (oder BR70 in Excel) und geht darum herum. Die Funktion wird mit den Parametern
f
und aufgerufenb
:Call t(4, 16)
@Neil hat mir gerade ein paar Bytes gerettet, danke!
quelle
q=q-1
mitq=q+3
undSelect Case q
mit ersetzenSelect Case q Mod 4
, können Sie die beiden vorhergehenden Anweisungen entfernen.However, the total width of each row must not exceed 3 times the number of non-empty columns
Ich denke, dies wurde hinzugefügt, um zu vermeiden, dass nur ein großes Gitter aufgebaut wird und etwas abseits der Grenze begonnen wirdExcel VBA,
284278277261259255254253251 BytesSub
Routine , die, als Eingabewerte nimmtF
,B
und gibt sie an Zellen , die auf demSheets(1)
Objekt (das auf die beschränktSheets(1)
Objekt 2 Bytes zu speichern)Verwendung:
quelle
C 349 Bytes
Kompiliert mit gcc (mit vielen Warnungen)
Eine etwas stärker eingerückte Version:
Hier ist eine 364-Byte-Version, die Zahlen größer als 100 verarbeitet
quelle
Perl, 275 Bytes
Einrückungen dienen der Lesbarkeit und sind nicht Teil des Codes.
Erläuterung:
Der Code verfolgt einen Hash aller Orte, an denen sich die Schildkröte befunden hat, und den entsprechenden Wert, der dort gespeichert ist
%m
. Zum Beispiel: in3 5
,$m{0,2}
enthält2
und$m{1,-3}
=26
. Es geht so weiter, bis es einen bereits definierten Ort erreicht. Darüber hinaus werden die aktuellen Grenzen des Schildkrötenpfades verfolgt$a,$b,$c,$d
und als Maximum und Minimum verwendet.Sobald es an einer Stelle angekommen ist, an der es bereits war, druckt es den Pfad unter Verwendung der Begrenzungen aus, wobei alles mit Leerzeichen aufgefüllt ist.
Es gibt keine Begrenzung für die Größe des Pfads oder der Zahlen.
quelle
PHP , 292 Bytes
Probieren Sie es online!
Einzüge werden der Übersichtlichkeit halber nicht mitgezählt.
Folgt ungefähr dem gleichen Algorithmus wie die Perl-Antwort. Verfolgen Sie, wo sich die Schildkröte in einem 2D-Array
$a
befunden hat,$u, $d, $l, $r
verfolgen Sie , wohin die Schildkröte zeigt, und verfolgen Sie die Grenzen für den Druck.str_pad
Damit können wir sicherstellen, dass jeder Eintrag für die Druckformatierung genau 3 Stellen breit ist.Aus irgendeinem Grund kann ich nicht verstehen, dass PHP nichts dagegen hat, wenn ich die Hälfte der Variablen nicht auf 0 initialisiere, aber die Formatierung vermasselt, wenn ich andere nicht initialisiere, obwohl nicht initialisierte Variablen normalerweise als 0 behandelt werden, wenn sie zum ersten Mal vorhanden sind gebraucht. Daher das
$x=$y=$u=$l=0
bisschen.quelle
Python 2 ,
267262258249245243 BytesProbieren Sie es online!
quelle