Das ist Pascals Braid:
1 4 15 56 209 780 2911 10864 40545 151316 564719
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719
Ich habe das total erfunden. Blaise Pascal hatte, soweit ich das beurteilen kann, kein Zopf, und wenn er es tat, bestand es wahrscheinlich aus Haaren anstelle von Zahlen.
Es ist wie folgt definiert:
- Die erste Spalte hat eine Single
1
in der Mitte. - Die zweite Spalte hat
1
oben und unten ein. - Jetzt wechseln wir zwischen einer Zahl in der Mitte oder zwei Kopien einer Zahl oben und unten.
- Wenn die Zahl oben oder unten steht, handelt es sich um die Summe der beiden benachbarten Zahlen (z
56 = 15 + 41
. B. ). Wenn Sie Ihren Kopf ein wenig neigen, ist dies wie ein Schritt in Pascals Dreieck. - Wenn die Zahl in die Mitte geht, ist es die Summe aller drei benachbarten Zahlen (zB
41 = 15 + 11 + 15
).
Ihre Aufgabe wird es sein, dieses Geflecht (teilweise) zu drucken.
Eingang
Sie sollten ein Programm oder eine Funktion schreiben, die eine einzelne Ganzzahl erhält n
und den Index der letzten auszugebenden Spalte angibt.
Sie können wählen, ob die erste Spalte (nur eine einzige 1
in der mittleren Zeile) n = 0
oder entspricht n = 1
. Dies muss eine konsistente Wahl für alle möglichen Eingaben sein.
Ausgabe
Gib Pascals Braid in die n
dritte Spalte aus. Das Leerzeichen muss genau dem obigen Beispiellayout entsprechen, außer dass Sie die kürzeren Zeilen mit Leerzeichen auf die Länge der längeren Zeilen auffüllen und optional einen einzelnen Zeilenvorschub ausgeben können.
Mit anderen Worten, jede Spalte sollte genau so breit sein wie die Zahl (oder das Paar gleicher Zahlen) in dieser Spalte, die Zahlen in aufeinanderfolgenden Spalten sollten sich nicht überlappen und es sollten keine Leerzeichen zwischen den Spalten vorhanden sein.
Sie können das Ergebnis entweder an STDOUT (oder an die nächstgelegene Alternative) ausgeben oder beim Schreiben einer Funktion entweder eine Zeichenfolge mit demselben Inhalt oder eine Liste mit drei Zeichenfolgen (eine für jede Zeile) zurückgeben.
Weitere Details
Sie können davon ausgehen, dass dies n
nicht weniger als der Index der ersten Spalte ist (also nicht weniger als 0
oder 1
abhängig von Ihrer Indizierung). Sie können auch davon ausgehen, dass die letzte Zahl im Geflecht kleiner als 256 ist oder die größte Zahl, die durch den systemeigenen Ganzzahltyp Ihrer Sprache dargestellt werden kann, je nachdem, welcher Wert größer ist . Also , wenn Ihre Mutter Integer - Typ nur Bytes speichern kann, können Sie davon ausgehen , dass der größte n
ist 9
oder 10
(je nachdem , ob Sie verwenden 0- oder 1-basiert n
) , und wenn es 32-Bit - Integer unterzeichnet speichern kann, n
wird in den meisten 33
oder 34
.
Es gelten die Standardregeln für Code-Golf . Der kürzeste Code gewinnt.
OEIS
Hier einige relevante OEIS-Links. Natürlich enthalten diese Spoiler für verschiedene Arten, die Zahlen im Geflecht zu generieren:
- Oben / Unten: A001353 oder A010905 oder A106707 oder A195503
- Mitte: A001835 oder A079935
- Beide: A002530
Testfälle
Diese Testfälle verwenden eine Indexierung auf 1 Basis. Jeder Testfall besteht aus vier Zeilen, von denen die erste die Eingabe und die restlichen drei die Ausgabe sind.
1
1
---
2
1
1
1
---
3
1
1 3
1
---
5
1 4
1 3 11
1 4
---
10
1 4 15 56 209
1 3 11 41 153
1 4 15 56 209
---
15
1 4 15 56 209 780 2911
1 3 11 41 153 571 2131 7953
1 4 15 56 209 780 2911
---
24
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
Antworten:
Jelly ,
313029 BytesDies ist eine monadische Verbindung; Es akzeptiert einen 0-basierten Spaltenindex als Argument und gibt eine Liste von Zeichenfolgen zurück.
Probieren Sie es online!
Wie es funktioniert
quelle
Pyth , 44 Bytes
Die Nummerngenerierung dauerte 20 Bytes und die Formatierung 24 Bytes.
Probieren Sie es online!
quelle
Python 2, 120 Bytes
Probieren Sie es auf Ideone.
quelle
MATL , 38 Bytes
Probieren Sie es online!
Die Berechnung eines Arrays mit den (eindeutigen) Zahlen benötigt die ersten 17 Bytes. Für die Formatierung werden die restlichen 21 Bytes benötigt.
Erläuterung
Teil 1: Generiere die Zahlen
Dies erzeugt einen Array mit den Zahlen von der ersten und zweiten Reihe , um zunehmend:
[1; 1; 3; 4; 11; 15; ...]
. Es beginnt mit1
,1
. Jede neue Nummer wird iterativ aus den beiden vorhergehenden erhalten. Davon wird die Sekunde mit1
oder multipliziert2
dem Iterationsindex Abhängigkeit davon und dann zur ersten aufsummiert, um die neue Zahl zu erhalten.Die Anzahl der Iterationen entspricht der Eingabe
n
. Dies bedeutet, dassn+2
Zahlen generiert werden. Nach der Generierung muss das Array gekürzt werden, damit nur die erstenn
Einträge erhalten bleiben.Teil 2: Formatieren Sie die Ausgabe
Für jede Zahl in dem erhaltenen Array werden zwei Zeichenfolgen generiert: Zeichenfolgendarstellung der Zahl und eine Zeichenfolge mit derselben Länge, die aus dem wiederholten Zeichen 0 besteht (das Zeichen 0 wird in MATL als Leerzeichen angezeigt). Für gleichmäßige Iterationen werden diese beiden Zeichenfolgen vertauscht.
Die beiden Zeichenfolgen werden dann vertikal verkettet. So werden
n
2D-·
Zeichen- Arrays wie folgt erzeugt ( zur Darstellung von Zeichen 0):Diese Arrays werden dann horizontal verkettet, um sie zu erzeugen
Schließlich wird dieses 2D-Zeichen-Array in zwei Zeilen aufgeteilt, und die erste Zeile wird oben auf dem Stapel dupliziert. Die drei Zeichenfolgen werden der Reihe nach in einer anderen Zeile angezeigt, um die gewünschte Ausgabe zu erzielen
quelle
Haskell, 101 Bytes
Definiert eine Funktion
f :: Int → [String]
.Michael Klein erinnerte mich daran, dass ich
unlines
das Ergebnis nicht aufrufen musste , um 7 Bytes zu sparen. Vielen Dank!Ich sparte ein Byte durch den Ersatz
" 9"!!mod i 2
mitcycle" 9"!!i
.Drei weitere Bytes durch Schreiben von zwei kerncursiven Listen anstelle von
drop
.Meine Freundin wies darauf hin, dass ich zwei weitere Bytes einsparen kann, indem ich meine Antworten bei
0
anstatt bei beginne1
.quelle
C
183177176 BytesErläuterung
C wird niemals einen Preis für Kürze gegen eine höhere Sprache gewinnen, aber die Übung ist interessant und eine gute Übung.
Das Makro F spart sechs Bytes auf Kosten der Lesbarkeit. Variablen werden global deklariert, um Mehrfachdeklarationen zu vermeiden. Ich brauchte einen Zeichenpuffer für sprintf, aber da K & R die Typprüfung nicht beherrscht, können sprintf und printf t [9] als Zeiger auf einen 36-Byte-Puffer interpretieren. Dadurch wird eine separate Erklärung gespeichert.
Hübsche Druckfunktion, wobei r die Zeilennummer ist. Sprintf formatiert die Zahl und berechnet die Spaltenbreite. Um Platz zu sparen, rufen wir dies einfach dreimal auf, einmal für jede Ausgabezeile. Der Ausdruck ri & 1 filtert, was gedruckt wird.
Einstiegspunktfunktion, Argument ist Anzahl der Spalten. Berechnet das Array a der Spaltenwerte a [] und ruft dann die Druckfunktion p einmal für jede Ausgabezeile auf.
Beispielaufruf (nicht in Antwort und Byteanzahl enthalten):
Aktualisiert
Integrierte den Inline-Sprintf-Vorschlag von Tomsmeding. Dadurch wurde die Anzahl von 183 auf 177 Zeichen reduziert. Auf diese Weise können Sie auch die geschweiften Klammern um den printf (sprintf ()) - Block entfernen, da es sich nur um eine Anweisung handelt, die jedoch nur ein Zeichen gespeichert hat, da sie weiterhin ein Leerzeichen als Trennzeichen benötigt. Also runter auf 176.
quelle
w
Verwendungsorts nicht inline angeben ? Sie scheinen es nur einmal zu benutzen.itoa
anstelle von Sprintf verwenden?PowerShell v2 +, 133 Byte
44 Bytes zur Berechnung der Werte, 70 Bytes zur Formulierung des ASCII
Übernimmt die Eingabe
$n
als nullindizierte Spalte. Legt den Beginn unseres Sequenzarrays fest$a=1,1
. Wir machen dann eine Schleife$n
mit1..$n|%{...}
, um das Array zu konstruieren. Bei jeder Iteration verketten wir die Summe von (vor zwei Elementen) + (voriges Element) * (ungerader oder gerader Index). Dies erzeugt$a=1,1,3,4,11...
bis zu$n+2
.Wir müssen also schneiden,
$a
um nur die ersten0..$n
Elemente zu nehmen und diese durch eine andere Schleife zu leiten|%{...}
. Bei jeder Iteration setzen wir den Helfer$z
gleich einer Anzahl von Leerzeichen plus dem aktuellen Element als Zeichenfolge. Dann teilen wir uns auf, ob das durch ein einfaches ungerades / auf$x
(die obere und untere Reihe) oder$y
(die mittlere Reihe) verkettet wird . Dann berechnen wir die Anzahl der Leerzeichen, indem wir die aktuelle Zahl nehmen, sie stringifizieren und ihre nehmen .if
else
$l
.Length
Schließlich setzen wir
$x
,$y
und$x
wieder an der Pipeline und die Ausgabe ist implizit. Da das Standardtrennzeichen.ToString()
für ein Array beim Drucken auf STDOUT ein Zeilenumbruch ist, erhalten Sie diesen kostenlos.Beispiel
quelle
PHP 265 Bytes
Nicht golfen:
Python 278 Bytes
quelle
Ruby, 120 Bytes
Gibt eine mehrzeilige Zeichenfolge zurück.
Probieren Sie es online!
quelle
Matlab, 223 Zeichen, 226 Bytes
Ungolfed und kommentiert:
quelle
PHP,
135124123120 Bytesunter ausnutzung impliziter typecasts und variabler variablen geht
ein drittel des codes (37 bytes) in die räume, insgesamt werden 64 bytes für die ausgabe verwendet
Nervenzusammenbruch
quelle
Batch, 250 Bytes
Da die erste und dritte Zeile gleich sind, müssen wir nur zwei Zeichenfolgen erstellen. Hier wird
d
die Zeichenfolge dargestellt, die mit dem letzten Eintrag endet, unds
die Zeichenfolge, die mit Leerzeichen endet. Die letzten vier Zeilen stellen sicher, dass sie in der richtigen Reihenfolge gedruckt werden.i
ist nur der Schleifenzähler (es ist etwas billiger als abwärts zu zählen%1
).j
ist das Umschalten zwischen dem Verdoppeln der vorherigen Nummer vor dem Hinzufügen zur aktuellen Nummer, um die nächste Nummer zu erhalten.m
undn
enthalten diese Zahlen.l
Er wird nicht nur temporär zur Berechnung der nächsten Zahl verwendet,s
sondern erhält auch Ziffern, die durch Leerzeichen zum Ausfüllen ersetzt werden .s
undd
werden jeweils über die Zwischenvariable ausgetauschtt
.quelle