Ihr Ziel ist es, ASCII-Kunst einer Formation beim Bowling mit zehn Stiften anzuzeigen, bei der nur einige der Stifte übrig bleiben. Wenigste Bytes gewinnt.
Die Zehnerpins haben eine dreieckige Formation:
O O O O
O O O
O O
O
Die Pins sind von 1 bis 10 wie folgt beschriftet:
7 8 9 10
4 5 6
2 3
1
Ziehstifte als O
und fehlende Stifte als .
, die Formation 1 3 5 6 9 10
ist:
. . O O
. O O
. O
O
Eingang:
Eine durch Leerzeichen getrennte Zeichenfolge, die eine nicht leere Teilmenge der Nummern 1 bis 10 in der angegebenen Reihenfolge auflistet.
Ausgabe:
Drucken Sie die entsprechende Formation aus oder geben Sie sie als Zeichenfolge mit Zeilenumbrüchen aus.
Die Formation sollte mit der linken Seite des Bildschirms bündig sein. Alle Leerzeichen sind in Ordnung, solange das sichtbare Bild korrekt ist. Leerzeilen davor und danach sind ebenfalls in Ordnung.
Testfälle:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Antworten:
Brainfuck -
617616604 BytesDas hat mich fast zwei Tage gekostet. Ich denke, es hat sich gelohnt. Es gibt wahrscheinlich Teile, die man besser spielen kann, wenn man ändert, in welcher Zelle etwas gespeichert ist oder was auch immer, aber im Moment bin ich einfach froh, dass es funktioniert.
Dieses Programm müsste völlig anders sein, wenn die Frage nicht angibt, dass die Eingabe sortiert werden soll. Die Art und Weise, wie dies funktioniert, besteht darin, eine Liste von 10 Stiften um die eingegebenen Stifte herum zu erstellen. Das ist etwas verwirrend, aber vielleicht wird es dadurch besser erklärt:
Dabei merkt es sich, welche Pins der Benutzer dort abgelegt hat und welche dort abgelegt wurden. Diese Strategie wäre sehr schwierig anzuwenden, wenn die Eingabe nicht sortiert wäre.
Eine andere Sache, die das Sortieren erleichtert, ist das Erkennen der Nummer 10. Da es sich bei Brainfuck um einzelne Bytes und nicht um "Zahlen" an sich handelt, hätte es ein Ärgernis sein können, aber die sortierte Eingabe hat es mir viel leichter gemacht, damit umzugehen mit. Der Grund dafür hat damit zu tun, wie ich Daten im Programm gespeichert habe. Ich nehme die Eingabe jeweils um ein Zeichen und subtrahiere 32 vom Ergebnis. Wenn die Zelle danach nicht Null ist, gehe ich 4 Zellen vorwärts. vor dem Wiederholen. Dies bedeutet, dass ich alle 4 Zellen ein Nicht-Leerzeichen-Byte an Eingaben erhalte und Pins effektiv als Nummer + 16 speichere. Für die Eingabe von 10 werden jedoch zwei Bytes benötigt, weshalb ich es in Sonderfällen tun musste. Wenn der Eingang nicht sortiert wäre, müsste ich die Stifte durchsehen, aber da er sortiert ist, ist er immer der letzte Stift, wenn er angezeigt wird. Ich überprüfe, ob das (letzte Byte der Eingabe + 1) == (das vorletzte Byte der Eingabe) ist und wenn ja, muss es 10 sein. Ich werde das letzte Byte los und setze das vorletzte auf das, was mein System versteht "10". Die Charaktere
'1'
und'0'
passen nicht in ein einziges Byte, aber die Nummer 26 tut es auf jeden Fall!Tricks auszudenken, um etwas überhaupt zum Laufen zu bringen, ist mein Lieblingsteil bei der Verwendung dieser Sprache. :)
Wenn Sie daran interessiert sind, wie dieses Programm im Detail funktioniert, können Sie das Programm mit den Kommentaren anzeigen, die ich beim Schreiben verwendet habe, um sicherzustellen, dass ich mich an alles erinnere, was es getan hat. Selbst das Schreiben von Kommentaren in Brainfuck ist schwierig, da es keine Kommentarsyntax gibt. Stattdessen sind alle Charaktere außer denen in
<[+.,-]>
No-Ops. Es ist einfach, Fehler einzufügen, indem Sie versehentlich.
oder,
in Ihre Kommentare aufnehmen! Deshalb ist die Grammatik so wackelig und Semikolons sind überall.EDIT: Als Beispiel dafür, wie einfach es ist, Fehler zu machen: Ich habe in einem der Kommentare "Nicht-Leerzeichen" verwendet! Als ich alle Nicht-BF-Zeichen aus dem Quellcode entfernt habe, wurde das Programm, mit dem ich das gemacht habe, im beibehalten
-
. Zum Glück hat es nichts kaputt gemacht, aber jetzt habe ich es entfernt, um ein Byte zu speichern. :)EDIT II: Es ist schon eine Weile her, seit ich dieses berührt habe, haha. In einer anderen Antwort auf dieser Website habe ich bemerkt, dass ich in der kommentierten Version versehentlich ein Komma verwendet habe. Da die Eingabe bereits erschöpft war, wurde die aktuelle Zelle auf 0 gesetzt (dies ist implementierungsabhängig, aber meiner Erfahrung nach das häufigste Verhalten). Ich habe den Fehler behoben, aber ich habe nachgedacht. Der idiomatische Weg, eine Zelle auf 0 zu setzen, ist
[-]
(ungefährwhile (*p) { *p--; }
), was zwei Bytes länger ist. Jedes Mal, wenn alle Eingaben gelesen wurden, kann ich sie,
stattdessen verwenden. Dies ersparte mir 2 Bytes in dieser Antwort und 12 in dieser!quelle
Python 2, 108 Bytes
Mit anrufen
f("3 5 7 9 10")
.i
ist die Zeilennummer, wobei 4 die erste und 1 die letzte Zeile ist.z
ist der n-te Stift in dieser Reihe, wobei 0 bedeutet, dass es der erste Stift in der Reihe ist undi-1
dass es der letzte Stift in der Reihe ist.Der wichtigste Hack ist
i*~-i/2-~z
, was konvertiert(i, z) -> pin number
. Zum Beispiel ist(4, 0) -> 7
Pin 7 der erste Pin in Zeile 4 (die erste Zeile). Die Herleitung geht so:Wir wollen eine Funktion, die
i
zum ersten Pin in der Reihe führti
, dh4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Dies wird durch erfüllt(i**2-i)/2 + 1
und(i**2-i)/2 + 1 + z
gibt somit die richtige Pin-Nummer für die Eingabe(i, z)
Dann vereinfachen Sie:
Pyth , 33 Bytes
Probieren Sie es online aus.
Das Programm übersetzt grob in:
(Danke an isaacg für die Tipps)
quelle
V4
entsprichtFNU4
undrz7
entsprichtmvkcz\
.Pyth , 31
Probieren Sie es hier aus .
V4
richtet eine for-Schleife mit N als Variable über [0,1,2,3] ein.*dN
liefert die Anfangsräume, weild
Raum ist.Um die Pin-Positionen zu finden, wird
+7+dZ
- 7 + d + Z verwendet.d
ist:while
Z
ist in der ersten Zeile 0, in der zweiten -4, in der dritten -7 und in der vierten -9. Dies liegt daran, dassZ
mit 0 begonnen und um 4, dann 3 und dann 2~Z-N4
verringertZ
wird.Anschließend wird mit überprüft, ob sich die Pin-Position in der Eingabe befindet
}+7+dZrz7
.rz7
sind die gewünschten Pins in List-of-Int-Form.Dann wird ein
O
Wenn erstellt, wenn es vorhanden war, und.
ansonsten. Dies ist durch Leerzeichen getrennt, mitjd
und implizit gedruckt.quelle
Perl 5: 51 (50 + 1 für
-p
)Using
r
Flag, fürs///
das eine der letzten 5 Perl-Ergänzungen ist.quelle
CJam,
4841 BytesWow, das wurde schrecklich lang
Teste es hier.
Erläuterung
Zuerst generieren wir das Layout:
Dies ergibt
Und jetzt ersetzen wir die Ziffern entsprechend der Eingabe:
quelle
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
ist etwas kürzer.er
ich damals auf Array autocasted habe."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
funktioniert gut in 0.6.2.Python 2,
9794Hierbei wird die Übersetzungsfunktion verwendet, mit der Zeichen für Zeichen in einer Zeichenfolge ersetzt werden können. Wie tr in Perl, nur dass die Eingabe viel länger dauert. Ich erhalte eine Liste von Dezimalstellen, indem ich eine Zeichenfolge von 9 bis zur 99sten Potenz mache.
quelle
Javascript, 155
Erster Golf, kann wohl kürzer sein.
mit anrufen
BEARBEITEN
ES6-Version, 130
BEARBEITEN
ES6-Version 79schlägt fehlES6-Version,
7277, keine Warnung, kehrt nur zurückquelle
.match
). Dies ist die eleganteste von allen.Rubin, 91
Ersetzen Sie einfach die Befehlszeilenargumente durch
.
s und0
s und drucken Sie sie in einer Schleife von 4 Zyklen aus.Lesbare Version
quelle
GNU sed, 75
Die Punktzahl enthält 1 Extra für die
-r
Option:Eingabe über STDIN:
Probieren Sie es online aus .
quelle
l
s fallen lassen .0
in10
die Zeile 2,1/
in die1 /
Zeile 5 und[0-9]
in die[0-9]+
Zeilen 7 und 9 wechseln , können Sie auch die erste Zeile für 4 Byte löschen.CJam,
4039 BytesIch weiß, dass es einen kürzeren Weg gibt, ich habe gerade keine Zeit, es herauszufinden.
Wie es funktioniert:
Probieren Sie es hier online aus
quelle
APL (35)
Prüfung:
Erläuterung:
17110357⊤⍨28/2
: die 28-Bit-Darstellung von17110357
:\⍨
:0
Geben Sie für jeden ein Leerzeichen ein und nehmen Sie für jeden1
einen Eintrag aus der Zeichenfolge links.⎕∊⍨⍳10
: Lesen Sie eine Zeile von der Tastatur und werten Sie sie aus (⎕
). Prüfen Sie dann für jede Zahl von 1 bis 10 (⍳10
), ob sie in der Eingabe enthalten ist (∊⍨
).'.O'[1+
...]
: Addiere 1 zu jedem Wert (gebe 1s und 2s anstelle von 0s und 1s) und ersetze dann jede 1 nach.
und jede 2 nachO
.4 7⍴
: verwandle den generierten String in eine 4-mal-7-Matrix⊖
: drehen Sie es horizontalquelle
Powershell: 109
Die Eingabe erfolgt in $ i
Das hat Spaß gemacht. Ich habe auch einiges über die Funktionsweise der Pipeline gelernt.
quelle
Haskell:
163-160BytesDies akzeptiert eine Reihe von durch Leerzeichen getrennten Zahlen von
stdin
.Ungolfed:
Und ein Bonus:
C: 250 Bytes
Diese Version erwartet, dass die Befehlszeilenargumente die Liste der Zahlen sind.
quelle
Perl, 73
Und ein alberner Bonusansatz, der nicht aufgeht, 90 Zeichen:
quelle
Mathematica, 109 Bytes
Funktion:
Angerufen von:
Wenn anonyme Funktionen erlaubt sind, kann dies auf 105 Bytes gekürzt werden :
Wenn die Eingabe keine durch Leerzeichen getrennte Zeichenfolge sein musste, sondern ein Array von Zahlen im Formular sein konnte
{3,5,7,9,10}
, kann dies weiter auf 79 Byte verkürzt werden :quelle
Pure Bash (keine Coreutils), 85
Einfaches Ersetzen von Mustern:
Die Liste wird über die Befehlszeilenargumente eingegeben.
quelle
Rebol - 117
Ungolfed:
quelle
Brainfuck, 179 Bytes
Formatiert:
Erwartet Eingaben ohne abschließende Zeilenumbrüche.
Probieren Sie es online aus.
Das Band wird mit zehn Knoten initialisiert, von denen jeder eine Eins gefolgt von einer Null enthält. Die Eins ist der Anfangswert der Stecknadel, und die Null erleichtert die Navigation und fungiert als Platzhalter für das Leerzeichen. Für jede Zahl in der Eingabe wird dieser Pin um 3 erhöht. Beachten Sie, dass
ord('O') - ord('.') = 33
während der Druckphase der Wert des Stifts mit 11 multipliziert wird. (Diese Multiplikation wird auch zum Generieren des Leerzeichens verwendet.) Die Reihenfolge der Stifte von links nach rechts auf dem Band ist einfach1
beliebig10
. Wenn die Eingabe mit a endet10
, wird eine Korrektur vorgenommen, da das10
zunächst als a behandelt wird1
.Nachdem die Eingabe verarbeitet wurde, wird nach jeder Zeile eine negative eingefügt. Dann werden die Zeilen in einer Schleife gedruckt, wobei die Anzahl der führenden Leerzeichen durch die Anzahl der zuvor verarbeiteten Zeilen bestimmt wird.
quelle
Clojure, 216 Zeichen (ugh)
Ich bin mir sicher, dass dies weiter golfen werden kann.
Verwenden Sie wie folgt:
quelle
AWK: 96 Bytes
Hinweis:
quelle
192 Bytes
Weil C #!
Ich habe zunächst versucht, die Ausgabe mit Mathe zu erstellen, aber die einfache Methode zum Ersetzen von Tokens in Strings scheint für höhere Sprachen am besten zu sein. Die Abhängigkeit von Linq ist langwierig, aber immer noch kürzer als ein Zähler und die Durchführung von Reichweitenprüfungen.
EDIT: Unix-Zeilenumbruch (-3 Bytes)
quelle
Scala
150,148Akzeptiert durch Leerzeichen getrennte Zeichenfolgen
quelle
JavaScript ES6, 78 Byte
Verwenden Sie zum Testen das folgende Snippet. Es verwendet Eingabeaufforderungen und Warnungen sowie die regelmäßige Funktionsnotation, um das Testen zu vereinfachen.
quelle
VB / Basic-229
Mein Ziel war es, Java zu schlagen ^^
bearbeite vbCr anstelle von chr (13)
r = r + Leerzeichen (3 - (e - b))
Kurzschrift wenn
Verwendung der Funktion anstelle von sub
sub MAIN () -> sub m ()
quelle
Java - 223 Zeichen
Ich mochte diese Art und Weise, dann wurde mir klar, dass ich einen kleinen Hack brauchte, der immer noch meiner Lösung gleicht.
quelle
K, 57 Bytes
Noch nicht sehr wettbewerbsfähig, aber es ist ein Anfang:
Anwendungsbeispiel:
Ich beginne mit der Auswertung der Eingabezeichenfolge mit
.
- glücklicherweise sind durch Leerzeichen getrennte Zahlen ein gültiges Listenliteral in K. Indem ich dem Ergebnis von eval eine leere Liste voranstelle, kann ich sicherstellen, dass es sich auch bei einem einzelnen Pin um eine Liste handelt. Dann erstelle ich einen booleschen Vektor, der die Positionen der Stifte darstellt:Dann indexiere ich eine Liste von Strings, um mit Leerzeichen aufgefüllte Zeichen für jede Pin-Position zu erhalten.
Ich schneide diese Sequenz in Reihen (
_
), kehre sie um (|
) und füge jedes Fragment zusammen (,/'
):Jetzt fängt es an, wie das Muster auszusehen, das wir wollen. Alles, was übrig bleibt, ist, einige führende Leerzeichen für jede Zeile anzuheften (
((!4)#\:" "),'
) und die Zeilen auf stdout (0:
) zu drucken .quelle
Pascal (FPC) , 165 Bytes
Probieren Sie es online!
Nimmt Zahlen von der Standardeingabe und druckt die Formation auf die Standardausgabe.
Pascal (FPC) , 175 Byte
Probieren Sie es online!
Eine Funktion, die dasselbe tut, indem sie eine Reihe von Stiftpositionen einnimmt und eine formatierte Zeichenfolge zurückgibt.
quelle
Powershell, 84 Bytes
Testskript:
Ausgabe:
quelle
Java -
371316294 ZeichenWenn ich das zum ersten Mal mache, bin ich mir ziemlich sicher, dass es beschissen ist, aber ich bin ein Anfänger. Es funktioniert auch, wenn die Nummern nicht bestellt sind. Die Nummerierung ist falsch, aber ich habe keine Zeit herauszufinden, wie ich das Problem beheben kann ...
Die Eingabe erfolgt
java B 1 2 3 5 10
beispielsweise durch. Die Ausgabe wird dann sein:quelle
Japt
-Rx
,29191817 BytesVersuch es
Erläuterung
quelle