Oto warkocz Pascala:
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
Całkowicie to wymyśliłem. O ile wiem, Blaise Pascal nie miał warkocza, a jeśli tak, to prawdopodobnie zrobiono go z włosów zamiast cyfr.
Jest zdefiniowane w następujący sposób:
- Pierwsza kolumna ma jeden
1
w środku. - Druga kolumna ma
1
na górze i na dole. - Teraz naprzemiennie umieszczamy liczbę w środku lub dwie kopie liczby na górze i na dole.
- Jeśli liczba będzie na górze lub na dole, będzie to suma dwóch sąsiednich liczb (np
56 = 15 + 41
.). Jeśli lekko przechylisz głowę, jest to jak krok w trójkącie Pascala. - Jeśli liczba znajdzie się na środku, będzie to suma wszystkich trzech sąsiednich liczb (np
41 = 15 + 11 + 15
.).
Twoim zadaniem będzie wydrukowanie (jakiejś części) tego warkocza.
Wkład
Powinieneś napisać program lub funkcję, która otrzyma jedną liczbę całkowitą n
, podając indeks ostatniej kolumny, która ma zostać wyprowadzona.
Możesz wybrać, czy pierwsza kolumna (drukująca tylko jeden 1
wiersz w środkowej linii) odpowiada n = 0
lub n = 1
. To musi być spójny wybór dla wszystkich możliwych danych wejściowych.
Wydajność
Wyjmij warkocz Pascala do n
kolumny. Biała spacja musi dokładnie odpowiadać powyższemu przykładowemu układowi, z tą różnicą, że można dopełnić krótsze linie do długości dłuższych linii spacjami i opcjonalnie wyprowadzić pojedyncze końcowe podawanie linii.
Innymi słowy, każda kolumna powinna być dokładnie tak szeroka jak liczba (lub para równych liczb) w tej kolumnie, liczby w kolejnych kolumnach nie powinny się pokrywać i między kolumnami nie powinno być spacji.
Możesz wydrukować wynik do STDOUT (lub najbliższej alternatywy), lub jeśli napiszesz funkcję, możesz zwrócić ciąg znaków o tej samej treści lub listę trzech ciągów (po jednym dla każdej linii).
Dalsze szczegóły
Możesz założyć, że n
nie będzie to mniej niż indeks pierwszej kolumny (czyli nie mniej niż 0
lub w 1
zależności od twojego indeksowania). Możesz także założyć, że ostatnia liczba w oplocie jest mniejsza niż 256 lub największa liczba reprezentowana przez rodzimą liczbę całkowitą twojego języka, w zależności od tego, która wartość jest większa . Więc jeśli rodzimy typ liczb całkowitych może przechowywać tylko bajty, możesz założyć, że największy n
jest 9
lub 10
(w zależności od tego, czy używasz 0 lub 1 n
) i czy może on przechowywać 32-bitowe liczby całkowite ze znakiem, n
będzie co najwyżej 33
lub 34
.
Obowiązują standardowe zasady gry w golfa . Najkrótszy kod wygrywa.
OEIS
Oto kilka odpowiednich linków OEIS. Oczywiście zawierają one spoilery na różne sposoby generowania liczb w oplocie:
Przypadki testowe
Te przypadki testowe wykorzystują indeksowanie 1-zasadowe. Każdy przypadek testowy składa się z czterech linii, z których pierwsza to dane wejściowe, a pozostałe trzy to dane wyjściowe.
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
Odpowiedzi:
Galaretka ,
313029 bajtówTo jest łącze monadyczne; akceptuje jako argument indeks kolumny oparty na 0 i zwraca listę ciągów znaków.
Wypróbuj online!
Jak to działa
źródło
Pyt , 44 bajty
Generowanie liczb zajęło 20 bajtów, a formatowanie zajęło 24 bajty.
Wypróbuj online!
źródło
Python 2, 120 bajtów
Wypróbuj na Ideone.
źródło
MATL , 38 bajtów
Wypróbuj online!
Obliczenie tablicy z (unikalnymi) liczbami zajmuje pierwsze 17 bajtów. Formatowanie zajmuje pozostałe 21 bajtów.
Wyjaśnienie
Część 1: generowanie liczb
To generuje tablicę liczb z pierwszych i drugich rzędów rosnące:
[1; 1; 3; 4; 11; 15; ...]
. Zaczyna się1
,1
. Każdy nowy numer jest iteracyjnie uzyskiwany z poprzednich dwóch. Z nich drugi jest mnożony przez1
lub2
indeks iteracji zależny od niego, a następnie sumowany do pierwszego w celu uzyskania nowej liczby.Liczba iteracji jest równa wartości wejściowej
n
. Oznacza to, żen+2
liczby są generowane. Po wygenerowaniu tablica musi zostać przycięta, aby zachować tylko pierwszen
wpisy.Część 2: sformatuj wyjście
Dla każdej liczby w uzyskanej tablicy generowane są dwa ciągi: ciąg reprezentujący liczbę oraz ciąg o tej samej długości składający się ze znaku 0 powtarzanego (znak 0 jest wyświetlany jako spacja w MATL). Nawet w przypadku iteracji te dwa ciągi są zamieniane.
Dwa łańcuchy są następnie łączone w pionie. Tak więc
n
tablice·
znaków 2D są tworzone w następujący sposób (przy użyciu do reprezentowania znaku 0):Te tablice są następnie łączone poziomo w celu wytworzenia
Wreszcie, ta tablica znaków 2D jest podzielona na dwa rzędy, a pierwszy jest powielany na górze stosu. Trzy ciągi znaków są wyświetlane w kolejności, każdy w innym wierszu, tworząc pożądany wynik
źródło
Haskell, 101 bajtów
Definiuje funkcję
f :: Int → [String]
.Michael Klein przypomniał mi, że nie musiałem sprawdzać
unlines
wyniku, oszczędzając 7 bajtów. Dzięki!Zapisałem bajt, zastępując
" 9"!!mod i 2
gocycle" 9"!!i
.Jeszcze trzy bajty, pisząc dwie listy corecursive zamiast używać
drop
.Moja dziewczyna zauważyła, że mogę zaoszczędzić jeszcze dwa bajty, rozpoczynając odpowiedzi od
0
zamiast1
.źródło
C
183177176 bajtówWyjaśnienie
C nigdy nie wygra żadnych nagród za zwięzłość w stosunku do języka wyższego poziomu, ale ćwiczenie to jest interesujące i dobre praktyki.
Makro F goli sześć bajtów kosztem czytelności. Zmienne są deklarowane globalnie, aby uniknąć wielokrotnych deklaracji. Potrzebowałem bufora znaków dla sprintf, ale ponieważ K&R jest luźny w sprawdzaniu typów, sprintf i printf mogą interpretować t [9] jako wskaźnik do bufora 36-bajtowego. Zapisuje to osobną deklarację.
Ładna funkcja drukowania, gdzie r jest numerem wiersza. Sprintf formatuje liczbę i oblicza szerokość kolumny. Aby zaoszczędzić miejsce, po prostu wywołujemy to trzy razy, po jednym dla każdego wiersza wyniku; wyrażenie ri i 1 filtruje to, co zostanie wydrukowane.
Funkcja punktu wejścia, argument to liczba kolumn. Oblicza tablicę a wartości kolumn a [], a następnie wywołuje funkcję drukowania p jeden raz dla każdego wiersza wyniku.
Przykładowe wywołanie (nieuwzględnione w odpowiedzi i liczbie bajtów):
Zaktualizowano
Zawarte w linii sugestii sprintf z Tomsmeding. To zmniejszyło liczbę z 183 do 177 znaków. Pozwala to również na usunięcie nawiasów klamrowych wokół bloku printf (sprintf ()), ponieważ jest to teraz tylko jedna instrukcja, ale zapisano tylko jeden znak, ponieważ nadal wymaga spacji jako separatora. A więc do 176.
źródło
w
gdzie jest używany? Wydaje się, że używasz go tylko raz.itoa
zamiast sprintf?PowerShell v2 +, 133 bajty
44 bajty do obliczenia wartości, 70 bajtów do sformułowania ASCII
Pobiera dane wejściowe
$n
jako kolumnę o indeksie zerowym. Ustawia początek naszej tablicy sekwencji$a=1,1
. Następnie zapętlamy do$n
z,1..$n|%{...}
aby zbudować tablicę. Każdej iteracji łączymy sumę (dwa elementy temu) + (poprzedni element) * (niezależnie od tego, czy jesteśmy indeksem nieparzystym, czy parzystym). To wygeneruje$a=1,1,3,4,11...
do$n+2
.Musimy więc pokroić,
$a
aby wziąć tylko pierwsze0..$n
elementy i przepuścić je przez kolejną pętlę|%{...}
. W każdej iteracji ustawiamy helper$z
równy liczbie spacji plus bieżący element jako ciąg. Następnie rozdzielamy, czy to zostanie konkatenowane do$x
(górnego i dolnego rzędu) czy$y
(środkowego rzędu) przez zwykłe parzysteif
/ nieparzyste /else
. Następnie obliczamy liczbę spacji$l
, biorąc bieżącą liczbę, ustalając ją i biorąc ją.Length
.Wreszcie, umieszczamy
$x
,$y
i$x
znowu w potoku, a wyniki są niejawne. Ponieważ domyślnym.ToString()
separatorem dla tablicy podczas drukowania do STDOUT jest nowa linia, otrzymujemy to za darmo.Przykład
źródło
PHP 265 bajtów
Bez golfa:
Python 278 bajtów
źródło
Rubin, 120 bajtów
Zwraca ciąg multilinii.
Wypróbuj online!
źródło
Matlab, 223 znaki, 226 bajtów
Nie golfił i skomentował:
źródło
PHP,
135124123120 bajtówwykorzystując niejawne typecasty i zmienne zmienne
jedna trzecia kodu (37 bajtów) trafia do spacji, a 64 bajty w całości są wykorzystywane na wyjście
awaria
źródło
Partia, 250 bajtów
Ponieważ pierwsza i trzecia linia są takie same, musimy tylko zbudować dwa ciągi. Tutaj
d
reprezentuje ciąg, który kończy się ostatnim wpisem is
reprezentuje ciąg, który kończy się spacjami; ostatnie cztery wiersze zapewniają, że zostaną wydrukowane w odpowiedniej kolejności.i
jest tylko licznikiem pętli (jest nieco tańszy niż odliczanie od%1
).j
to przełączanie między podwojeniem poprzedniego numeru przed dodaniem go do bieżącego numeru, aby uzyskać następny numer.m
in
zawierają te liczby.l
, oprócz tego, że jest tymczasowo używany do obliczenia następnej liczby, zastępuje się również cyframi spacjamis
;s
id
są wymieniane za każdym razem za pośrednictwem zmiennej pośredniejt
.źródło