Zwykłe Polygramy

16

Biorąc pod uwagę liczbę wierzchołków n ≥ 3i „rozmiar kroku” 1 ≤ m < n/2 (wskazujący odległość między dwoma połączonymi wierzchołkami), należy przedstawić graficzną reprezentację odpowiedniego regularnego poligamu . Jeśli polygram składa się z wielu zamkniętych pętli, każda pętla musi być renderowana w innym kolorze linii. (Jeśli brzmi to myląco, poniższe przykłady powinny mieć wyjaśnienie).

Zasady

Każde rozsądne rozwiązanie problemu prawdopodobnie automatycznie spełni te reguły - są one po to, aby wprowadzić pewne ograniczenia parametrów wyjściowych, aby zapobiec odpowiedziom typu „Ten czarny blok jest całkowicie poligamem, ale nie można go zobaczyć, ponieważ Ustawiłem szerokość linii na ponad 9000. ”

  • Możesz renderować polygram do pliku (który może być zapisany na płycie lub do standardowego strumienia wyjściowego) lub wyświetlić go na ekranie.
  • Możesz użyć grafiki wektorowej lub rastrowej. Jeśli wydruk jest zrasteryzowany, obraz musi mieć wymiary 400 x 400 pikseli lub więcej, a promień poligamu (odległość od środka do każdego wierzchołka) musi wynosić od 35% do 50% długości boku.
  • Format obrazu poligamu musi wynosić 1 (aby jego wierzchołki leżały na odpowiednim kole) - płótno obrazu może być prostokątne.
  • Linie poligamu nie mogą być grubsze niż 5% promienia (i oczywiście muszą mieć niezerową grubość, aby były widoczne).
  • Oprócz poligamu możesz renderować osie lub ramę, ale nic więcej.
  • Możesz wybrać dowolny (jednolity) kolor tła.
  • W przypadku poligamów składających się z wielu zamkniętych pętli musisz obsługiwać co najmniej 6 wizualnie różnych kolorów, z których wszystkie muszą różnić się od tła. (Skala szarości jest w porządku, pod warunkiem, że odcienie są wystarczająco rozłożone w widmie.) Twój kod musi nadal działać dla więcej niż 6 pętli, ale kolory nie muszą być rozróżnialne dla żadnych dodatkowych pętli (tj. Możesz również użyć ponownie kolory z poprzednich pętli w tym punkcie).

To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).

Przykłady

Oto wszystkie dane wyjściowe do n = 16(gdzie kolumna odpowiada ni wiersz do m):

wprowadź opis zdjęcia tutaj Kliknij, aby zobaczyć większą wersję.

Jako przykłady większych n, oto (n, m) = (29, 11)i (30, 12):

wprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutaj

Martin Ender
źródło
Co z antyaliasingiem i tym podobne? (Ponieważ mamy do czynienia z liniami pod kątem)
Optymalizator
1
@Optimizer Nie zamierzam przepisywać algorytmu antyaliasingu. Linie mogą być wygładzane lub wygładzane, o ile są wyraźnie widoczne. Użyj najlepszej oceny.
Martin Ender

Odpowiedzi:

5

MATLAB, 85 81

Funkcja wyświetla wykres na ekranie.

function f(n,m)
hold all
axis equal
for k=1:gcd(m,n)
plot(i.^(4*(k:m:n^2)/n))
end

Wynik dla n = 30, m = 12: f (30,12)

feersum
źródło
Nie jestem pewien, czy to działa; jeśli zrobiłem to poprawnie, wyświetli ten obraz przez 30, 12. Patrz: bit.ly/1GFZni7
durron597,
@ durron597 W rzeczywistości działa w Matlabie, ale funkcja nie może być natychmiast ponownie użyta, ponieważ hold allprowadzi do następnego wykresu narysowanego na pierwszym ... Nie wiem, czy mamy konsensus co do możliwości ponownego użycia funkcji szczery.
Martin Ender
@ MartinBüttner I tak powinno być hold onzapisanie bajtu; jeśli dodasz cztery bajty, stanie się ono wielokrotnego użytku ( clf\n)
durron597,
Okazało się że mamy konsensus, a nawet kilka miesięcy temu opublikowałem pytanie i sam sobie odpowiedziałem. oO Tak więc ten post z meta byłby nieprawidłowy bez wydania hold.
Martin Ender
@ MartinBüttner Jeśli zmienisz hold allnaclf\nhold on czy to rozwiązuje problem?
durron597,
3

CJam, 114

"P2"N400:ASAN6N0aA*aA*q~:M;:K{:CK,f{M*+K%P*2*K/_[mc)\ms)]199f*}_+2ew{~1$.-Af/A,\ff*\f.+{:mo~_3$=@C6%)tt}/}/}/Sf*N*

Wysyła obraz w formacie ASCII PGM.

Możesz wypróbować online , ale wynik jest dość długi. Możesz zmienić 400i 199na mniejsze liczby, aby zmniejszyć rozmiar obrazu.

CJam nie ma pojęcia o obrazach, rysunkach, liniach ani kształtach, więc wygenerowałem obraz w macierzy kwadratowej, piksel po pikselu (jedna liczba reprezentuje szary odcień dla każdego piksela).

Tak wygląda wynik 30 12 :

polygram

aditsu
źródło
1

Mathematica, 70 bajtów

ListPolarPlot[Table[{2Pi(i+j#2)/#,1},{i,GCD@##},{j,#+1}],Joined->1>0]&

Cóż ... to jest moja referencyjna implementacja, która jak dotąd pokonuje oba zgłoszenia. Nie zamierzam wygrywać własnego wyzwania, więc mam nadzieję, że ktoś to pokona.

Dane wyjściowe są jak wykresy w samym wyzwaniu, tyle że nie usuwam tutaj osi:

wprowadź opis zdjęcia tutaj

Martin Ender
źródło