Pascals Dreieck wird erzeugt, indem mit einer 1 in der ersten Zeile begonnen wird. In den folgenden Zeilen wird die Zahl durch die Summe der beiden Zahlen links und rechts direkt darüber bestimmt.
Zur Veranschaulichung sind hier die ersten 5 Zeilen von Pascals Dreieck:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Die Herausforderung
Bei einer Eingabe von n (vorausgesetzt, dies ist in der von Ihnen gewählten Sprache am bequemsten) generieren Sie die ersten n Zeilen des Pascalschen Dreiecks. Sie können annehmen, dass n eine ganze Zahl ist, die zwischen 1 und 25 liegt. Zwischen jeder Zeile muss ein Zeilenumbruch und zwischen jeder Zahl ein Leerzeichen stehen. Ansonsten können Sie die Zahl beliebig formatieren.
Das ist Code-Golf , also gewinnt die kürzeste Lösung.
Beispiel I / O
> 1
1
> 9
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
code-golf
math
combinatorics
Peter Olson
quelle
quelle
Antworten:
J , 12 Zeichen
quelle
i.5
gibt die ersten fünf Naturals zurück. Zeile 2 fügt{:
"Tail" hinzu (zuletzt zurück). Zeile 3 kombiniert sie mit!
"Out Of" (Anzahl der Kombinationen). Zeile 4(!{:)i.5
ist das selbe. den Haken heraus faktorisieren. So(!:)
ist eine Operation, die die ersten n Naturtöne in die n-te Zeile von Pascals Dreieck transformiert . Zeile 5 wendet es auf alle Präfixe (Backslash) von 0..4 an, aber J füllt die nicht verwendeten Stellen mit 0, sodass die Operation@
mit der Zeichenfolgenformatierungsoperation kombiniert wird ( )":
. Sehr coole J, upvoted.!
bedeutet Fakultät; dyadische!
Zählkombinationen. Das Finale@
in":@(!{:)\@i.
ist nur dazu da, dies zu einem eigenständigen Verb zu machen.Python, 56 Bytes
Beispielnutzung:
Produziert:
quelle
exec
um einefor
Schleife zu vermeiden .Python,
9491887063 Zeichenquelle
Mathematica: 36 (41?)
Mathematica hat die
Binomial
Funktion, aber das macht den Spaß daraus. Ich schlage vor:Die obige Zeile zeigt ein zerlumptes Array wie:
Da dies ein Grundformat in Mathematica ist, dachte ich, dass es akzeptabel wäre, aber wenn ich die Regeln noch einmal lese, denke ich, dass es möglicherweise nicht so ist. Durch
Grid@
das Hinzufügen wird eine eindeutig akzeptable Ausgabe mit insgesamt 41 Zeichen erstellt:n = 6
:quelle
C 522
Eine selbstdemonstrierende C-Antwort. Könnte nicht klarer sein! Bonuspunkte für das Finden des zusätzlichen Charakters.
quelle
Golfscript (21 Zeichen)
Da eine Erklärung angefordert wurde:
quelle
Haskell,
9492Ausgabe:
Eine 71-stellige Version ohne Leerzeichen zwischen den einzelnen Ziffern:
Ausgabe:
quelle
mapM
anstelle von verwendenmapM_
.Scala,
81787270 Zeichen81 Zeichen: erster Versuch, schamlos aus der Python-Version kopiert :)
Führen Sie es als Skript oder direkt in der REPL aus.
Schneiden Sie auf 70 Zeichen mit etwas überraschend Lesbarem und Idiomatischem:
Oder
72 bis70 Zeichen mit einer ganz anderen Methode:quelle
Ruby:
514946 Zeichen(45 Zeichen Code + 1 Zeichen Befehlszeilenoption)
Dank an:
Probelauf:
Probieren Sie es online!
quelle
p.map!{|i|(v=n)+n=i}
.map
. Vielen Dank.JavaScript (
90858381)Demo: http://jsfiddle.net/tcRCS/3/
ANMERKUNG : Funktioniert in der Praxis für etwa n> 30 nicht gut, da Zahlen den integrierten Integer-Datentyp überlaufen und zu Gleitkommazahlen werden.
Edit 1 : 5 entfernt Zeichen durch die Umwandlung
while
zufor
und die Kombination von Aussagen2 bearbeiten :
s=
Anweisung nach innen verschiebenfor
und 2 Zeichen speichernEdit 3 : Kombiniere den
s=1,j=1
Initialisierers=j=1
und speichere 2 Zeichenquelle
s*(i-j)/j
, nichts*((i-j)/j)
.(i-j)
vor dem Dividieren durch multiplizierenj
, es keine Notwendigkeit für Gleitkomma-Arithmetik gibt, da die Ergebnisse immer eine ganze Zahl sein sollten. Wenn Sie dies((i-j)/j)
zuerst tun , führt dies zu Dezimalwerten, die eine Fehlerquelle darstellen können und zumindest zusätzlichen Code zum Runden / Abschneiden erfordern. Sie beginnen dies erst zu sehen, wenn Sie ungefähr sindn>11
, und Sie werden Dezimalwerte in der Ausgabe sehen, dh1 11 55 165 330 461.99999999999994 461.99999999999994...
R, 39 Zeichen
R scheint das richtige Werkzeug für diese Aufgabe zu sein :-)
quelle
n
gegeben ist? Ich habe den Code korrigiert. Ist das jetzt OK?n
muss das Gerät zur Laufzeit von einer externen Quelle geliefert werden, und das Gerät zur Erfassung des Geräts ist in Ihrem Programm enthalten. In der Regel bedeutet dies über das Befehlszeilenargument oder stdin oder file. "Nach Datei" wird so gut wie nie verwendet, da es ausnahmslos länger ist als die beiden anderen Optionen.in Q (25 Zeichen / 20 mit kürzerer Version)
Kürzer
Beispielnutzung:
quelle
t:{(x-1){0+':x,0}\1}
awk - 73 Zeichen
ziemlich einfache Implementierung:
Probelauf:
quelle
Perl,
52, 49 ZeichenBearbeiten: mit
say
stattprint
quelle
Perl,
4754 ZeichenEs nimmt eine Nummer von der Kommandozeile, führt aber keine Fehlerprüfungen durch.
Nur realisiert, dass es nur bis zu n = 4 funktioniert. Es war ein alter Code, den ich auf meiner Festplatte hatte.
Dies funktioniert jedoch:
n muss allerdings in das Skript eingegeben werden, sonst wäre es ein Zeichen mehr.
quelle
Fass , 40 Bytes
Erklärt
quelle
Perl, 77 Zeichen
Beispiel Eingabe
Beispielausgabe
quelle
C,
132127 Zeichenquelle
Pascal:
216192 Zeichen(Kein echter Konkurrent, nur eine Ehrenpräsenz.)
Probelauf:
quelle
MATL , 10 Bytes
Sprache, die nach dieser Herausforderung erstellt wurde
Probieren Sie es online!
quelle
D
134128 ZeichenAusgabe für 9 ist
den vollen Nutzen von "Sie können es formatieren, wie Sie möchten"; Zwischen jeder Zahl und einem Zeilenumbruch befindet sich ein Leerzeichen
edit hat die Aufgabe umpositioniert,
l
einige Zeichen zu rasierenquelle
Scala, 131 Zeichen
Übernimmt die Eingabe von der Befehlszeile.
Ausgabe für n = 10:
quelle
0
s :-)?F♯ - 203 Zeichen
Mein erster Versuch, eine Runde Code Golf zu spielen, und mein erster Versuch, eine funktionierende Programmierung durchzuführen. Es gibt wahrscheinlich einen offensichtlichen Weg, es zu verkürzen, den ich noch nicht ganz herausgefunden habe. Es entspricht dem F♯-Compiler von VS2010 (der im Gegensatz zu früheren Versionen standardmäßig #light ausführt) und funktioniert auch im F♯-Interpreter. Akzeptiert Eingaben über stdin. Ich wünschte, es gäbe einen besseren Weg für die Eingabe / Ausgabe! Viele Charaktere!
quelle
Warum gibt es keine akzeptierte Antwort auf diese Frage?
VBA - 249 Zeichen
quelle
Postscript - 59 Zeichen (63, wenn Sie zählen
-dn=
, um die Anzahl der Zeilen zu erhalten)renn mit
bekommen
quelle
Mathematica 35 Zeichen
Hier ist die langweilige und faule Art, Pascals Dreieck zu zerschneiden:
quelle
APL,
1915 ZeichenVielleicht ein bisschen zu spät zur Party?
Der J-Eintrag wird jedoch nicht übertroffen.
Dies setzt voraus, dass der Indexursprung (
⎕IO
) auf gesetzt ist0
. Leider1
benötigen wir bei einer Indexherkunft von25 bis18 Zeichen:⍨
Der Code enthält zwei s, um meine Frustration auszudrücken.Demo:
Erklärungen
Kurzfassung:
⍳⍵
(mit einem Indexursprung von 0) erzeugt ein Array der Zahlen von 0 bis⍵-1
einschließlich, wobei⍵
das richtige Argument für die Funktion ist.⍳⍵+1
generiert alle Zahlen von 0 bis⍵
{⍵!⍨⍳⍵+1}
generiert für jedes Element in⍵
select . Der (Pendel-) Operator tauscht die Argumente gegen eine Funktion aus, sodass das rechte Argument zum linken Argument wird und umgekehrt.k
k
⍳⍵+1
⍨
{⍵!⍨⍳⍵+1}¨⍳⍵
Übergibt jedes Element⍳⍵
mit dem¨
Operator (each). Das Ergebnis ist ein eindimensionales Array, das das erste enthält⍵
Zeilen des Pascalschen Dreiecks enthält.⍪
nimmt einen eindimensionalen Vektor an und macht ihn eher zu einer Spalte als zu einer Zeile. Jede Reihe des Dreiecks wird in eine eigene Linie gesetzt.Lange Antwort:
1-⍨
vor einem steht,⍳
um einen Indexursprung von 0 zu replizieren.0,⍳⍵
mit einem Indexursprung von 1 wird⍳⍵+1
mit einem Indexursprung von 0 repliziert .quelle
Ahorn, 46
Verwendung:
quelle
VBA,
16214210280 Bytes22 Bytes gespart dank Taylor Scott.
Dies ist eine alte Frage, aber ich sah eine kürzere Lösung für VBA.
Dies soll im unmittelbaren Fenster ausgeführt werden. Die Eingabe erfolgt in der Zelle
A1
des aktiven Arbeitsblatts. Die Ausgabe erfolgt im aktiven Arbeitsblatt abB2
und unter Verwendung der Anzahl der Zellen, die für die Eingabe erforderlich sind. DasCOLUMN()>ROW()
Häkchen lässt das Dreieck oben rechts leer. DasROW()=2
Häkchen gibt den ersten Wert1
an, der das Dreieck auslöst. Ich hätte die Ausgabe nach unten verschieben und diesen Scheck fallen lassen können, aber er führt vor dem eigentlichen Dreieck eine Menge irrelevanter Ausgaben ein, und ich hatte nicht das Gefühl, dass dies im Geiste der Herausforderung lag.Ich habe ursprünglich eine viel kompliziertere Methode gepostet, die jeden Wert basierend auf seiner Zeile und Spalte berechnet. Bei dieser Methode werden jedoch nur zelleninterne Formeln verwendet. Ich beginne bei,
B2
damit ich die Zeile darüber ohne#REF!
Fehler referenzieren kann. Dann kopiert und fügt es die gleiche Formel über einen Block von n breiten und n hohen Zellen ein . Die Ein- und Ausgabe fürn=25
sieht folgendermaßen aus:quelle
Function p(r)
nach konvertieren ,Sub p(r)
da Sie keinen Funktionsausgabewert haben, wird durch Entfernen des Leerzeichensdebug.? c(n,k);
und Konvertieren der mehrzeiligenif-then-else
Anweisung in eine einzelne Zeile (If k Then c=c(n-1,k-1)*n/k Else c=1
) die Byteanzahl nach130
meiner ZählungFor n=0 To...
so zusammengefasst werden,For n=0To...
dass meine Version des Codes aufSub p(r):For n=0To r-1:For k=0To n:Debug.?c(n,k);:Next:Debug.?:Next:End Sub
Function c(n,k):If k Then c=1 Else c=c(n-1,k-1)*n/k
[char (10)]End Function
mit einer Byteanzahl von139
For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:Next
Helper Funktion:Function c(n,k)
If k Then c=c(n-1,k-1)*n/k Else c=1
End Function
)B2
stattA1
akzeptabel ist.05AB1E , 14 Bytes
Probieren Sie es online!
quelle