Moje wyzwania wydają się być trochę trudne i nieatrakcyjne. Więc tutaj coś łatwego i przyjemnego.
Sekwencja Alcuina
Sekwencja Alcuina A(n)
jest definiowana przez zliczanie trójkątów. A(n)
to liczba trójkątów o bokach i obwodzie całkowitym n
. Ta sekwencja nosi nazwę Alcuin of York.
Pierwsze kilka elementów tej sekwencji, zaczynając od n = 0
:
0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...
Na przykład A(9) = 3
, ponieważ jedynymi trójkątami z liczbami całkowitymi po bokach i obwodzie 9
są 1 - 4 - 4
, 3 - 3 - 3
i 2 - 3 - 4
. Poniżej widoczne są 3 prawidłowe trójkąty.
W tej sekwencji jest trochę interesujący wzór. Na przykład A(2*k) = A(2*k - 3)
.
Aby uzyskać więcej informacji, patrz A005044 w OEIS.
Wyzwanie
Ale twoje wyzwanie dotyczy binarnej reprezentacji tych liczb. Jeśli przekonwertujemy każdy numer sekwencji na jego reprezentację binarną, umieścimy je w wektorach kolumnowych i ustawimy w jednej linii, tworzy to całkiem interesujący obraz binarny.
Na poniższym obrazku widać binarną reprezentację numerów sekwencji A(0), A(1), ..., A(149)
. W pierwszej kolumnie można zobaczyć reprezentację binarną A(1)
, w drugiej kolumnie reprezentację A(1)
i tak dalej.
Na tym zdjęciu widać powtarzający się wzór. Wygląda nawet trochę jak fraktale, jeśli spojrzysz na przykład na obraz z numerami sekwencji A(600), A(601), ..., A(899)
.
Twoim zadaniem jest wygenerowanie takiego obrazu. Twoja funkcja, twój skrypt otrzyma dwie liczby całkowite 0 <= m < n
i musi wygenerować binarny obraz sekwencji Alcuina A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1)
. Tak więc wejście 0, 150
generuje pierwszy obraz, wejście 600, 900
drugi obraz.
Możesz użyć dowolnego popularnego formatu graficznego. Powiedzmy, że każdy format, który można przekonwertować do formatu png za pomocą image.online-convert.com . Alternatywnie możesz wyświetlić obraz na ekranie. Żadne wiodące białe rzędy nie są dozwolone!
To jest golf golfowy. Tak więc wygrywa najkrótszy kod (w bajtach).
white=1 and black=0
na odwrót?white=0 and black=1
. Więc w drugą stronę.A(0)
tworzy białą kolumnę,A(9)=3
tworzy białą kolumnę z 2 czarnymi pikselami na dole.0,0,0,1,0,2
podczas gdy lista na początku pytania mówi0,0,0,1,0,1
.Odpowiedzi:
J (
5245 (strona kodowa 437))To byłoby dozwolone (myślę)
Zrzut heksowy
(Naprawdę nic specjalnego, czarny kwadrat to DB 16 lub 219 10 na stronie kodowej 437.)
Stosowanie
Wyprowadza to w następujący sposób (tagi kodu psują go, dodając spację między wierszami):
W standardowej konsoli J nie ma odstępów między wierszami, dlatego nazywam zasadę „Alternatywnie możesz wyświetlić obraz na ekranie”. (Nigdzie nie było powiedziane, że ten obraz musi być reprezentowany wewnętrznie jako rozsądny format obrazu)
EDYCJA: Jconsole (w przeciwieństwie do JQT) używa strony kodowej 437 jako domyślnej i NIE renderuje poprawnie prostokątów, gdy używa się ich z łańcucha.
źródło
Mathematica,
12612212189 bajtówDefiniuje to nienazwaną funkcję przyjmującą dwie liczby całkowite jako parametry i wyświetlającą obraz na ekranie. Rysuje każdy kwadrat jako pojedynczy piksel, ale jeśli chcesz, możesz powiększyć.
Teraz używam wyraźnej formuły podanej w artykule OEIS (pierwszy w sekcji Mathematica, dzięki Davidowi Carraherowi za zwrócenie na to uwagi). Teraz jest też niesamowicie szybki.
Oto wcięty kod z kilkoma komentarzami:
Oto dane wyjściowe dla
0, 600
:źródło
Image[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
CJam (
56 5553 znaków) / GolfScript (64 znaków)CJam:
GolfScript:
Oba generują dane wyjściowe w formacie NetPBM i są w zasadzie portami między sobą.
Sekcja
Dzięki Optimizer dla CJam 56 -> 53.
źródło
'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
Pyth -
1016059Wyjścia a
.pbm
. Prawdopodobnie można grać w golfa więcej.Bardzo nie golfisty, bo będę tłumaczyć na Pytha.Wyjaśnienie wkrótce. Teraz spójrz na równoważny kod Pythona.Wykorzystuje algorytm OEIS do obliczenia sekwencji, a następnie konwertuje na dane binarne, uzupełnia liczby, wykonuje obrót matrycy i formatuje go w
pbm
obraz. Ponieważ nie używam brutalnej siły, jest niesamowicie szybki.Oto
600,900
przykład:Wypróbuj tutaj online .
źródło
R -
127125Nie jestem pewien, czy jest to całkowicie zgodne z zasadami. Nie wysyła obrazu do pliku, ale tworzy raster i drukuje go na urządzeniu wyjściowym.
Znalazłem tę samą formułę co Martin, ale tutaj .
Używa nienazwanej funkcji.
Uruchom w następujący sposób
Tworzy następujący wykres
źródło
raster
się do przestrzeni nazw, ponieważraster()
jest to jedyna rzecz tam specyficzna dla tego pakietu. Zamiast tego po prostu zróbraster::raster(...)
.Python 2
+ PIL,255184Moja pierwsza wersja używała PIL w celu wyświetlenia obrazu:
Nowa wersja właśnie produkuje czarno-biały obraz PPM na standardowym wyjściu:
źródło
for
. Możesz uniknąć parensx%2
, zmieniając kolejność nax%2*...
. Krótsze jest, aby nie definiować drukowania jako funkcji i po prostu użyć dwóch zagnieżdżonychfor
pętli, używając,print ...,
aby uniknąć nowych linii i spacji,print
aby rozpocząć nową linię. Aby wymusić, aby rozszerzenia binarne miały długośćh
bez,zfill
należy dodać2**h
, a następnie wyodrębnić ostatnieh
cyfry.JAVASCRIPT - 291
Kod:
Wyjaśnienie:
Wynik:
Tak, wynik jest do góry nogami, ale to dlatego, że
0,0
wjs canvas
lewym górnym rogu. : 3Próbny:
Demo na jsfiddle
źródło