Wprowadzenie
Wczoraj widziałem urodzinową układankę . Gratulacje!!
Również w tym tygodniu oglądałem odcinek programu telewizyjnego Bones, w którym znaleziono zwłoki zakopane pod drzewem. Aby obliczyć czas śmierci, policzyli słoje drzew.
Pierścienie drzew powstają, ponieważ drzewa rosną wolniej zimą i szybciej latem. W ten sposób możesz obliczyć wiek drzewa, licząc pierścienie. Możesz także zobaczyć naturalne wydarzenia, takie jak pora deszczowa lub sucha.
Wyzwanie
Biorąc pod uwagę liczbę całkowitą n >= 1
jako dane wejściowe, napisz pełny program do generowania pierścieni wieku drzewa.
Ponieważ pierścienie mogą zmieniać kształt, użyj trzech różnych znaków („0”, „*”, „+”), aby pokazać cykle klimatyczne.
Wiek 1
0
Wiek 2
***
*0*
***
Wiek 3
+++++
+***+
+*0*+
+***+
+++++
Wiek 4
0000000
0+++++0
0+***+0
0+*0*+0
0+***+0
0+++++0
0000000
Wielkość drzewa to kwadrat boków 2*n - 1
Zwycięski
Najkrótszy kod w bajtach wygrywa.
('0', '*', '+')
więc 5 lat to*
Odpowiedzi:
K5,
2730262522 bajtówTakie podejście iteracyjnie „otacza” rdzeń (zaczynając od
"0"
) ze wszystkich czterech stron za pomocą innej postaci ({4(|+y,)/x}
). Sekwencja zawijania sezonowego jest określona przez3!
sekwencję modulo 3 ( ). To trochę kłopotliwe, aby ustawić skrzynkę podstawową w sam raz.edytować:
Ta alternatywa buduje cały prostokątny układ jednocześnie z podanego wyłącznego zakresu (
!
) odwróconego i połączonego ze sobą po upuszczeniu elementu (t,1_|t:|
). Następnie bierzemy iloczyn kartezjański maksimum (u|\:u:
), bierzemy całą macierz modulo 3 (3!
) i indeksujemy do tablicy znaków.W akcji:
źródło
BBC Basic, 93 bajty
Skrócone słowa kluczowe bardzo tu pomagają. W wierszu 2 używam
VDU
polecenia (odpowiednika liter Cputchar()
), aby wydrukować każdy znak. Jest to o wiele bardziej wydajne niżP.MID$("0*+",p MOD3+1,1)
.Tutaj działa w BeebEm3 na Macu:
źródło
CJam, 25 bajtów
Sprawdź to tutaj.
Wyjaśnienie
źródło
Matlab, 63 bajty
Przykład:
źródło
Python 2, 83 bajty
Drukuje linia po linii. Każda linia jest podzielona na trzy części:
Dla
n=4
:Generujemy lewą część w odwrotnej kolejności
w
, klonujemy2*i
czasy ostatniego znaku , a następnie dodajemy oryginalną wersję bez pierwszego znaku.źródło
Python 2, 83 bajty
Jeśli myślimy o drzewie jako o siatce współrzędnych, symbol w
(i,j)
jest określany przezmax(abs(i),abs(j))%3
lub równorzędniemax(i,-i,j,-j)%3
. Dla każdego rzędui
łączymy i drukujemy symbole w tym rzędzie.źródło
R
dwa razy i jest dłuższy niż 5 znaków, więc przypisanie wygrywa.Pyth, 23 bajty
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
MATLAB,
807873 bajtówDzięki Luis Mendo za pomoc w goleniu 5 bajtów!
Przykład
Wykluczenie i objaśnienie kodu
Drobne uwagi
bwdist
to funkcja, która jest częścią przybornika przetwarzania obrazu i może być uruchomiona tylko w MATLAB. Octave (IIRC) nie zostałbwdist
jeszcze zaimplementowany, więc nie można go uruchomić w Octave.źródło
eye
i pomnóż element przez jegorot90
edowaną wersję, aby wygenerować macierz „seed”:I=eye(2*input('')-1);a='0*+';a(mod(bwdist(I.*rot90(I),'chessboard'),3)+1)
Python 2, 134 bajty
źródło
Perl, 118 bajtów
Więcej do zrobienia, ale na razie podstawowa wersja. Teraz z zachowaniem doskonałej przyczepności do specyfikacji
Stosowanie:
źródło
Matlab 92
źródło
Sed,
277252 znaków(251 znaków kodowych + opcja 1 wiersza poleceń).
Oczekuje danych wejściowych w formacie jednoargumentowym .
Przykładowy przebieg:
źródło
JavaScript (ES6), 114
Użycie alertu do wydruku - zła czcionka proporcjonalna i wynik jest brzydki. W poniższym fragmencie alert jest przekierowywany do wyciętego ciała, co daje lepszy wynik. Nowa linia w backticks jest znacząca i liczona.
Przetestuj uruchomienie fragmentu w przeglądarce Firefox.
źródło
Test running the snippet in Firefox
ale oczywiście żartowałem, Chrome (brak wersji Chrome) nie jest zgodny z EcmaScritpt 6, brakuje=>
funkcji....
. Nadal daleko od ES6Ruby, 85 znaków
Przykładowy przebieg:
źródło
Moonscript - 104 bajty
źródło
C, 138 bajtów
Funkcja
t
przyjmująca jeden parametr liczby całkowitej - wiek.Niegolfowany (z
main
funkcją łatwego uruchomienia powyższego):stdlib.h
Mogą być konieczne w niektórych systemach, ponieważ bez tego rodzaju powrót funkcji nierejestrowanejcalloc
będzie domyślnieint
. Ponieważint
ichar*
niekoniecznie mają taki sam rozmiar, można zapisać nieprawidłowy wskaźnikc
. W większości systemów 32-bitowych zarównochar*
iint
mieć taką samą wielkość, ale nie jest to prawdą dla systemów 64-bitowych.źródło