Romb Pascala (który w rzeczywistości jest trójkątem) uzyskuje się poprzez dodanie wzoru:
*
***
x
zamiast
* *
x
Oznacza to, że każda komórka jest sumą trzech komórek w rzędzie bezpośrednio nad nią i jednej komórki w rzędzie 2 powyżej. Podobnie jak trójkąt Pascala, wiersz zerowy zawiera jeden 1
, który generuje trójkąt.
Oto kilka pierwszych rzędów rombu Pascala
1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1
Zadanie
Podany numer wiersza (zaczynając od góry) i numer kolumny (zaczynając od pierwszego niezerowego elementu w tym wierszu) wyprowadza wartość w tej konkretnej komórce. Oba wejścia mogą być indeksowane 1 lub 0 (możesz miksować i dopasowywać, jeśli chcesz).
To jest golf golfowy, więc powinieneś dążyć do jak najmniejszego rozmiaru pliku kodu źródłowego.
Odpowiedzi:
Haskell ,
5955 bajtówRomb Pascala? Bardziej jak Hombell's Rhombus! czy mam rację?
4 bajty zapisane dzięki Ørjan Johansen
Myślałem, że spróbuję rozwiązać mój problem i poćwiczyć mój Haskell. Mamy nadzieję, że zainspiruje to więcej osób do odpowiedzi na to pytanie.
Wypróbuj online!
Wyjaśnienie
To jest trochę nieaktualne w najnowszym golfie
Zamiast obliczać
Obliczamy
To skłania cały nasz trójkąt
To wyrównuje wszystkie nasze wiersze, ułatwiając indeksowanie n-tego elementu dowolnej kolumny. Następnie definiujemy nasze przypadki podstawowe.
Wiersz zerowy składa się z zer
Jest jeden
1
na pozycji,1,1
więc go zdefiniujemyI resztę pierwszego wiersza definiujemy również jako zera
Następnie definiujemy ogólny przypadek rekurencyjnie za pomocą wzoru opisanego powyżej:
źródło
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]
.Pascal , 122 bajty
Cóż, to romb Pascala .
37 bajtów zapisanych dzięki @manatwork
Wypróbuj online!
źródło
if
stanu są bezcelowe. (Na 1.if
zapisujesz 2 znaki, na 2.if
1 znak, nie zostawiając spacji międzythen
słowem kluczowym a poprzednią cyfrą.) Och, i zmienna r jest całkowicie niepotrzebna.;
przedfunction
„send
.>=
<=
? Nadal muszę zachowaćif 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 bajtów
sposób rekurencyjny tylko wiersz funkcji i kolumna 0-indeksowane
Wypróbuj online!
PHP , 114 bajtów
sposób rekurencyjny pełny wiersz programu i kolumna 0-indeksowane
Wypróbuj online!
PHP , 129 bajtów
wiersz i kolumna 0-indeksowane
Wypróbuj online!
źródło
Galaretka ,
222019 bajtówPobiera 0-indeksową parę indeksu jako argument wiersza polecenia.
Wypróbuj online!
źródło
MATL ,
222019 bajtówOba wejścia są oparte na 0.
Wypróbuj online!
Wyjaśnienie
Niech
r
ic
oznacz dwa dane wejściowe, określając odpowiednio wiersz i kolumnę oparte na 0.Każdy nowy rząd w rombu Pascala może być zbudowany z matrycy zawierającej dwa poprzednie wiersze przez splatanie z jądrem
[1 1 1; 0 1 0]
i utrzymanie dwóch ostatnich rzędów wyniku zamienione. Robi się tor
razy, zaczynając od matrycy1
.Okazuje się, że użycie jądra
[0 1 0; 1 1 1; 0 1 0]
, które jest predefiniowanym dosłownie, jest krótsze . Daje to dodatkowy rząd, który zostanie odrzucony.Rozważmy na przykład
r = 3
, więc są3
iteracje.Zaczynając od
splot
[0 1 0; 1 1 1; 0 1 0]
dajeZachowanie dwóch ostatnich wierszy (w tym przypadku całej macierzy) i ich zamiana daje
Splot powyższego z
[0 1 0; 1 1 1; 0 1 0]
dajeMacierz utworzona przez zamienione dwa ostatnie rzędy to
Zawiera on nowy wiersz u dołu, a poprzedni przedłużony zerami.
Ponowne rozmycie daje
Biorąc dwa ostatnie zamienione wiersze daje
Po zakończeniu
r
iteracji dane wyjściowe są zawarte w ostatnim wierszu ostatniej macierzy. Na przykład dlac = 2
(na podstawie 0) wynik byłby8
. Zamiast indeksować ostatni wiersz i żądaną kolumnę, można zastosować lewę, która wykorzystuje symetrię każdego rzędu: ostatnia macierz jest transponowanai jego
-c
-ty element jest brany. Wykorzystuje to indeksowanie liniowe, to znaczy macierz jest indeksowana jednym indeksem w porządku głównym kolumny . Ponieważ indeksowanie jest modułowe ,0
-wejście jest prawym dolnym rogiem (wartość1
), a-2
-ty wpis to dwa kroki powyżej (wartość8
).źródło
Pari / GP , 60 bajtów
Wypróbuj online!
źródło
Haskell , 74 bajty
Wypróbuj online!
Zadzwoń za pomocą
n # m
, gdzien
jest wiersz im
kolumna.źródło
m<=2*n&&m>=0
może być sprawiedliwyn>0
.Mathematica, 56 bajtów
Czysta funkcja pobierająca dwa argumenty całkowite (pierwszy wiersz, druga kolumna) i zwracająca liczbę całkowitą. Działa również w przypadku ujemnych argumentów liczb całkowitych, zwracając
0
. Dość prosta struktura rekurencyjna:If[#<1,Boole[##==0],...]
definiuje zachowanie przypadku podstawowego dla 0-go wiersza (i powyżej), a jednocześnieSum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]
implementuje definicję rekurencyjną.źródło
Python 2 ,
706665 bajtówWypróbuj online!
źródło
JavaScript (ES6), 68 bajtów
źródło
Mathematica, 53 bajty
Korzystanie z funkcji generowania.
źródło
Python 3 ,
8284 bajtówJest to rekurencyjna implementacja z 1-indeksowanymi wierszami i kolumnami. (Technicznie potrzebuje
f=
przodu, ktoś dał mi znać, czy powinienem zmienić go na 84 bajty. Nadal nowe i nie w 100% pewne zasad).Wykorzystuje to rekurencyjną formułę znalezioną na stronie OEIS , ale z
k
przesuniętą w lewo, aby poprawnie ustawić. Przypadkowosum(f(n-1,k-i)for i in(0,1,2))
ma taki sam rozmiar jakf(n-1,k)+f(n-1,k-1)+f(n-1,k-2)
. Cała funkcja toand or
sztuczka Pythona , w której pierwszy warunek sprawdza, czy k znajduje się w trójkącie, a nie na granicy, w którym to przypadku używana jest formuła rekurencyjna. Jeśli nieor
jest, zwracana jest część po , która sprawdza, czyk
jest(1, 2*n-1)
, tj. Na granicy, zwracającTrue
iFalse
.k+1in(2,2*n)
jest o jeden bajt krótszy niżk in(1,2*n-1)
. Zawijanie tego w nawiasach i umieszczanie z+
przodu konwertuje na liczbę całkowitą, co jest potrzebne.Wypróbuj online!
źródło
f=
.True
zamiast tego,1
ponieważ zachowuje się jak1
python. To pozwala usunąć+(...)
na końcu. Rozumiem, że jeśli nie chcesz tego zrobić, ponieważ spowoduje to, że wynik będzie wyglądał trochę dziwnie, jest to opcja.Java (OpenJDK 8) , 87 bajtów
Wypróbuj online!
Na początku byłem zadowolony z iteracyjnej metody 160 bajtów ... Hmmm ... zapomnijmy o tym, dobrze?
źródło
Python 3 , 75 bajtów
Jest to rekurencyjna lambda, która przyjmuje kolumnę i wiersz jako liczby całkowite 0.
Oto (nieco) bardziej czytelna wersja z funkcją drukowania:
źródło