Pascals Rhombus (das eigentlich ein Dreieck ist) erhält man durch Hinzufügen des folgenden Musters:
*
***
x
anstatt
* *
x
Dies bedeutet, dass jede Zelle die Summe der drei Zellen in der Zeile direkt darüber und einer Zelle in der Zeile 2 darüber ist. Genau wie Pascals Dreieck enthält die nullte Zeile eine einzige 1
, die das Dreieck erzeugt.
Hier sind die ersten paar Reihen von Pascals Rhombus
1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1
Aufgabe
Wenn eine Zeilennummer (beginnend von oben) und eine Spaltennummer (beginnend von dem ersten Element ungleich Null in dieser Zeile) gegeben sind, wird der Wert in dieser bestimmten Zelle ausgegeben. Beide Eingänge können entweder 1 oder 0 indiziert sein (Sie können mischen und anpassen, wenn Sie möchten).
Dies ist Codegolf, daher sollten Sie versuchen, die Dateigröße Ihres Quellcodes so klein wie möglich zu halten.
Antworten:
Haskell ,
59-55BytesPascals Raute? Eher wie Haskells Raute! habe ich recht?
Dank Ørjan Johansen wurden 4 Bytes eingespart
Ich dachte, ich würde mein eigenes Problem angehen und mein Haskell üben. Hoffentlich wird dies mehr Menschen dazu inspirieren, darauf zu antworten.
Probieren Sie es online!
Erläuterung
Dies ist mit dem neuesten Golf etwas veraltet
Anstatt zu rechnen
Wir rechnen
Dies lässt unser gesamtes Dreieck schräg werden
Dadurch werden alle unsere Zeilen in einer Reihe angeordnet, sodass das n-te Element einer Spalte einfacher indiziert werden kann. Wir definieren dann unsere Basisfälle.
Die nullte Zeile besteht also nur aus Nullen
Es gibt eine Single
1
bei Position,1,1
also definieren wir dasUnd wir definieren den Rest der ersten Zeile ebenfalls als Nullen
Dann definieren wir den allgemeinen Fall rekursiv mit dem oben beschriebenen Muster:
quelle
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]
.Pascal , 122 Bytes
Nun, es ist Pascals Raute.
37 Bytes gespart dank @manatwork
Probieren Sie es online!
quelle
if
Zustand sind sinnlos. (Am 1.if
sparen Sie 2 Zeichen, am 2.if
1 Zeichen, indem Sie zwischen demthen
Schlüsselwort und der vorhergehenden Ziffer kein Leerzeichen lassen .) Oh, und die Variable r ist völlig unnötig.;
vor demfunction
‚send
.>=
<=
? Ich muss immer noch denif n=0
function f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;
PHP , 86 Bytes
rekursiv nur die Funktionszeile und -spalte 0-indiziert
Probieren Sie es online!
PHP , 114 Bytes
rekursiver Weg volles Programm Zeile und Spalte 0-indiziert
Probieren Sie es online!
PHP , 129 Bytes
Zeile und Spalte 0-indiziert
Probieren Sie es online!
quelle
Jelly ,
222019 BytesNimmt ein 0-basiertes Indexpaar als Befehlszeilenargument.
Probieren Sie es online!
quelle
MATL ,
222019 BytesBeide Eingänge sind 0-basiert.
Probieren Sie es online!
Erläuterung
Lassen Sie
r
undc
bezeichnen Sie die zwei Eingaben, die 0-basierte Zeile bzw. Spalte angeben.Jede neue Zeile in Pascals Rhombus kann aus der Matrix erstellt werden, die die vorherigen beiden Zeilen enthält, indem Sie mit dem Kernel zusammenarbeiten
[1 1 1; 0 1 0]
und die letzten beiden Zeilen des Ergebnisses vertauschen. Dies geschiehtr
mal ausgehend von der Matrix1
.Es stellt sich als kürzer heraus, den Kernel zu verwenden
[0 1 0; 1 1 1; 0 1 0]
, der ein vordefiniertes Literal ist. Dies erzeugt eine zusätzliche Zeile, die verworfen wird.Betrachten Sie zum Beispiel
r = 3
, so gibt es3
Iterationen.Ab
Faltung mit
[0 1 0; 1 1 1; 0 1 0]
gibtHalten Sie die letzten beiden Zeilen (in diesem Fall die gesamte Matrix) und tauschen Sie sie aus
Faltung der obigen mit
[0 1 0; 1 1 1; 0 1 0]
gibtDie Matrix aus den beiden zuletzt getauschten Zeilen lautet
Diese enthält die neue Zeile unten und die vorherige Zeile mit Nullen.
Nochmaliges Wickeln ergibt
Das Nehmen der letzten zwei getauschten Reihen gibt
Nach den
r
Iterationen ist die Ausgabe in der letzten Zeile der endgültigen Matrix enthalten. Zum Beispiel wäre fürc = 2
(0-basiert) das Ergebnis8
. Anstatt die letzte Zeile und die gewünschte Spalte zu indizieren, kann ein Trick verwendet werden, der die Symmetrie jeder Zeile ausnutzt : Die endgültige Matrix wird transponiertund sein
-c
-tes Element wird genommen. Dies verwendet die lineare Indizierung, das heißt, die Matrix wird durch einen einzelnen Index in der Reihenfolge des Spaltenhauptteils indiziert . Da die Indizierung modular ist , befindet sich der0
-Eintrag in der unteren rechten Ecke (Wert1
) und der-2
-te Eintrag in zwei Schritten oberhalb (Wert8
).quelle
Pari / GP , 60 Bytes
Probieren Sie es online!
quelle
Haskell , 74 Bytes
Probieren Sie es online!
Rufe mit auf
n # m
, won
ist die Zeile undm
ist die Spalte.quelle
m<=2*n&&m>=0
kann gerecht seinn>0
.Mathematica, 56 Bytes
Reine Funktion, die zwei Ganzzahlargumente (erste Zeile, zweite Spalte) und eine Ganzzahl zurückgibt. Funktioniert auch für negative Ganzzahlargumente und gibt zurück
0
. Eine recht einfache rekursive Struktur:If[#<1,Boole[##==0],...]
Definiert das Basisfallverhalten für die 0. Zeile (und höher) undSum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]
implementiert die rekursive Definition.quelle
Python 2 ,
706665 BytesProbieren Sie es online!
quelle
JavaScript (ES6), 68 Byte
quelle
Mathematica, 53 Bytes
Generierungsfunktion verwenden.
quelle
Python 3 ,
8284 BytesDies ist eine rekursive Implementierung mit 1-indizierten Zeilen und Spalten. (Benötigt technisch eine
f=
vorne jemanden, der mich wissen lässt, ob ich ihn auf 84 Bytes ändern soll. Noch neu und nicht 100% regelsicher.)Dabei wird die rekursive Formel verwendet, die auf der OEIS-Seite zu finden ist , wobei jedoch die
k
des nach links verschoben ist, um eine ordnungsgemäße Ausrichtung zu gewährleisten. Zufälligsum(f(n-1,k-i)for i in(0,1,2))
ist die gleiche Größe wief(n-1,k)+f(n-1,k-1)+f(n-1,k-2)
. Die ganze Funktion ist der Python-and or
Trick, bei dem die erste Bedingung prüft, ob sich k innerhalb des Dreiecks und nicht an der Grenze befindet. In diesem Fall wird die rekursive Formel verwendet. Ist dies nicht der Fall, wird der Teil nach demor
zurückgegeben, der prüft, obk
in(1, 2*n-1)
, dh an der Grenze,True
und zurückgegeben wirdFalse
.k+1in(2,2*n)
ist ein Byte kürzer alsk in(1,2*n-1)
. Wenn Sie das in Klammern setzen und ein voranstellen, wird es in eine+
Ganzzahl konvertiert, was erforderlich ist.Probieren Sie es online!
quelle
f=
.True
anstatt1
dass sie sich wie1
Python verhält . Dadurch können Sie die+(...)
am Ende entfernen . Ich verstehe, wenn Sie dies nicht tun möchten, weil es die Ausgabe ein wenig seltsam aussehen lässt, ist es eine Option.Java (OpenJDK 8) , 87 Byte
Probieren Sie es online!
Zuerst war ich mit meiner 160-Byte-Iterationsmethode zufrieden ... Hmmm ... lass es uns einfach vergessen, OK?
quelle
Python 3 , 75 Bytes
Dies ist ein rekursives Lambda, das Spalte und Zeile als 0-indizierte Ganzzahlen verwendet.
Hier ist eine (etwas) besser lesbare Version mit Druckfunktion:
quelle