Twoim celem jest wygenerowanie spirali Fibonacciego z liczbami.
Przykład wejścia / wyjścia
1 -> 1
2 -> 1 1
3 -> 1 1
2 2
2 2
6 -> 8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 5 5 5 5 5
8 8 8 8 8 8 8 8 1 1 3 3 3
8 8 8 8 8 8 8 8 2 2 3 3 3
8 8 8 8 8 8 8 8 2 2 3 3 3
Dane wejściowe Dane wejściowe można pobierać za pomocą argumentu STDIN lub funkcji. Będzie to pojedynczy numer
Dane wyjściowe Dane wyjściowe mogą pochodzić z STDOUT lub wartości zwracanej przez funkcję. Powinien to być pojedynczy ciąg.
Dodatkowe białe znaki na samym końcu linii nie są dozwolone. Dane wyjściowe mogą zawierać cyfry, linie (znaki nowego wiersza) i spacje.
Orientacja nie ma znaczenia, oznacza to obroty i odbicia. O ile podąża za prawidłowym wzorem spirali Fibonacciego.
Liczby z różnymi ilościami cyfr (np. 1 i 13) powinny być wyrównane do siebie w prawo. Może być konieczne dodanie spacji na samym początku linii, aby wszystko mogło się wyrównać.
1 1 1 1
100 100 should actually be 100 100
Można zobaczyć przykład tutaj
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!
Numbers with different amounts of digits (e.g. 1 and 13) should be aligned to the left side of the digit a space may need to be added to the very beginning of a line so everything can line up.
To brzmi jak może być jaśniejsze jako dwa zdania.Odpowiedzi:
APL, 23
Wyjaśnienie:
Wypróbuj na tryapl.org
źródło
⌸
lub⍤
) brakuje w tym zestawie znaków i nie można ich użyć, jeśli chcesz przywołać tę regułę.Matlab, 84 bajty
Używana jest funkcja. Wyjście jest ustawione na standardowe wyjście.
Przykłady:
Matlab, 78 bajtów
To samo co powyżej, z wyjątkiem tego, że funkcja Matlaba jest wykorzystywana, mianowicie automatycznie wyświetla wyjście funkcji (jako ciąg) w standardowym wyjściu. Pozwala to uniknąć konwersji na ciąg znaków w powyższym podejściu.
źródło
Python 2, 121 bajtów
Złagodzone zasady dotyczące rotacji sprawiają, że jest to o wiele prostsze.
Nie użyłem tu backsicków
str(a)
, ponieważ nie jestem pewien, czy wolno nam więcej wiodących pól niż to konieczne, jeśli kiedykolwiek osiągniemy długie. Chociaż nawet gdybyśmy to zrobili, użyciea
samego siebie i tak byłoby krótsze.źródło
Rubinowy,
243242236233222170130 bajtówźródło
t==value
warunki nat>value
. Na przykład(t=x%4)>2?s.times{r<<[s]*s}:t>1?s.times{r.map!{|w|w.unshift s}}:t>0?s.times{r.unshift [s]*s}:r.map!{|w|w+=[s]*s}}
Python -
189179174źródło
J, 36 bajtów
Stosowanie:
Metoda:
Funkcja obraca bieżący kwadrat i dodaje nowy kwadrat do prądu jeden
input-1
raz. Rozmiar kwadratu i wartości elementów są zbierane z wielkości poprzedniego prostokąta.Objaśnienie kodu:
Wypróbuj online tutaj.
źródło
Haskell,
183176171163 bajtówTa funkcja
f
pobiera liczbę i zwraca pojedynczy ciąg znaków:źródło
Pyth, 34 bajty
Co zaskakujące, ponad połowa kodu to drukowanie / wypełnianie, a nie generowanie matrycy.
Generowanie macierzy jest naprawdę proste, polega jednak na transpozycji i odwróceniu oraz dodaniu N linii zawierających N kopii N, gdzie N jest bieżącą liczbą linii.
Przykładowe dane wyjściowe dla 7:
źródło
Perl,
289 277257 bajtówźródło
K, 48 bajtów
I w akcji:
Nadal mogą być dobre okazje do gry w golfa.
Program składa się zasadniczo z dwóch części - generowania skonkatowanej macierzy i formatowania jej w celu uzyskania wyniku. Pierwsza jest dość prosta:
Zaczynając od macierzy 1x1 zawierającej 1, zbuduj wektor T długości T, gdzie T jest długością macierzy początkowej w pierwszym wymiarze (
t#t:#x
) i dołącz ją do każdego rzędu oryginalnej macierzy (x,\:
). Odwrócenie i transpozycja wyniku (+|
) powoduje obrót o 90 stopni. Robimy to N-1 razy.Formatowanie jest dość niezgrabne, ponieważ naturalne podejście K do drukowania matrycy nie wyrówna kolumn liczbowych tak, jak potrzebujemy:
Podstawową ideą jest pobranie maksymalnego elementu macierzy (
|//x
), przekonwertowanie go na ciąg (jednoargumentowy$
), przyjęcie jego długości plus jeden (1+#
), a następnie sformatowanie elementów macierzy na wyrównane do prawej ciągi tego rozmiaru. Następnie, aby uporządkować, połącz te ciągi (,/'
) i upuść wynikową spację wiodącą (1_'
).źródło
CJam, 48 bajtów
Wypróbuj online
Zasadnicza część generowania wzoru wydaje się dość prosta. Obróć utworzony dotychczas prostokąt i dodaj kwadrat wartości na dole.
Kod wypełniania wyniku wygląda jednak okropnie. Wypróbowałem kilka kombinacji operatorów
f
i:
operatorów, aby zastosować dopełnienie do listy zagnieżdżonej, ale nic nie działało. Jeśli ktoś ma lepsze sugestie, jest bardzo mile widziany.źródło
Wf%
. Czy byłbyś w stanie zrobić coś takiego{Se[}ff%
, jak zamiast:U;{USe[}f%
wypełnienia? (To może nie działać tak, jak jest, nie mogę teraz tego przemyśleć.)Pyth, 29 bajtów
Demonstracja.
Gdyby dopełnienie było dowolne / niejawne, jak w APL lub dozwolone było wyjście macierzy, byłoby to 14 bajtów:
źródło
Ruby, 129 bajtów
Zredagowałem drugą rubinową odpowiedź, ale moja ostatnia zmiana nie została zaakceptowana, czy coś, więc oto:
źródło
ES6, 248 bajtów
Gdzie
\n
reprezentuje dosłowny znak nowej linii.Irytujące formatowanie zajmuje dużą część kodu.
f
to funkcja pomocnicza, która tworzy wypełnioną tablicę. Służy głównie do tworzenia wypełnionych kwadratów, ale także ręcznie podwaja się w celu utworzenia bazowych przypadków rekurencji.g
jest głównym pomrukiem. Rekurencyjnie generuje ostatnie, jedno rozwiązanie, obraca je o 180 stopni, a następnie dodaje kolejne dwa kwadraty.źródło