Rysowanie krzywej Peano

13

Wprowadzenie

W geometrii krzywa Peano jest pierwszym przykładem wykrytej przez Giuseppe Peano w 1890 r. Krzywej wypełniania przestrzeni. Krzywa Peano jest funkcją ciągłą od zera do przedziału jednostek, ale nie jest iniekcyjna. Peano był motywowany wcześniejszym wynikiem Georga Cantora, że ​​te dwa zestawy mają tę samą liczność. Z powodu tego przykładu niektórzy autorzy używają wyrażenia „Krzywa Peano”, aby bardziej ogólnie odwoływać się do dowolnej krzywej wypełniającej przestrzeń.

Wyzwanie

Program pobiera dane wejściowe, które są liczbami całkowitymi n, i wysyła rysunek przedstawiający niterację krzywej Peano, zaczynając od boków 2 pokazanych w skrajnej lewej części tego obrazu: Trzy iteracje krzywej Peano

Wejście

Liczba całkowita npodająca numer iteracji krzywej Peano. Opcjonalne, dodatkowe dane wejściowe opisano w sekcji bonusów.

Wynik

Rysunek niteracji krzywej Peano. Rysunek może być zarówno grafiką ASCII, jak i „prawdziwym” rysunkiem, w zależności od tego, który jest najłatwiejszy lub najkrótszy.

Zasady

  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie (wybierz najbardziej odpowiedni format dla swojego języka / rozwiązania).
  • Nie trzeba obsługiwać wartości ujemnych ani nieprawidłowych danych wejściowych
  • Dopuszczalny jest pełny program lub funkcja.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Bonusy

Ponieważ nie powinien to być spacer po parku (przynajmniej w większości języków, o których myślę), punkty premiowe są przyznawane za:

  • -100 bajtów, jeśli twój kod generuje gif z budowy krzywych Peano do n.
  • -100 bajtów, jeśli kod rysuje krzywą wypełniającą spację dla dowolnego kształtu prostokątnego (krzywa Peano działa oczywiście tylko dla kwadratów). Możesz założyć, że dane wejściowe przyjmują formę, w n l wktórej nma takie samo znaczenie jak poprzednio (liczba iteracji), ale gdzie li wstają się długością i szerokością prostokąta, w którym narysowana jest krzywa. Jeśli l == wstaje się to zwykłą krzywą Peano.

Negatywne wyniki są dozwolone (ale czy są możliwe ...).

Edytować

Proszę dołączyć wyniki swojego programu do rozwiązania dla n == 3 (l == w == 1).

Peiffap
źródło
1
Witamy w PPCG :) Na pierwszy rzut oka wygląda to na miłe pierwsze wyzwanie. Chociaż wydaje mi się to znajome, myślę, że wyzwanie, o którym mogłem myśleć, było ASCII. Należy jednak pamiętać, że zdecydowanie odradzamy premie i że będą istnieć języki gry w golfa, które mogą to osiągnąć w mniej niż 100 bajtach. Co najważniejsze, potrzebujesz kryterium wygranej. Biorąc pod uwagę, że twoje bonusy odejmują bajty od wyniku rozwiązania, podejrzewam, że zamierzasz to zrobić w golfa kodu .
Shaggy
4
Tak, nie sądzę, że premie są dobrym pomysłem, zwłaszcza, że istnieje co najmniej dwa animacja-zdolny ASCII-Art koncentruje golflangs
ASCII tylko
2
Aha również do czego by nsię posłużył, jeśli li wrównież dane wejściowe ??????????? I czy krzywa Peano byłaby szczególnym przypadkiem - nie jest to jedyna krzywa wypełniania przestrzennego, więc niektóre algorytmy mogą wymagać specjalnej specjalizacji
tylko ASCII
2
Ponadto, co powstrzymuje kogokolwiek od stworzenia trywialnej krzywej wypełnienia przestrzennego (tylko zygzakowanie tam i z powrotem) dla wymiarów innych niż kwadratowe
tylko ASCII
7
Bonusy w golfie kodowym to jedna z najbardziej uzgodnionych rzeczy, których należy unikać podczas pisania wyzwań. Sugeruję, aby je usunąć i zdecydować, która ma być kanoniczną wersją wyzwania.
lirtosiast

Odpowiedzi:

6

Mathematica, wynik 60-100 - 100 = -140

Graphics[PeanoCurve@a~Reverse~3~Scale~#2]~Animate~{a,1,#,1}&

Czysta funkcja. Pobiera ni {l, w}(szerokość i wysokość) jako dane wejściowe i daje animowaną grafikę jako dane wyjściowe. Najpierw tworzy krzywą Peano n- tego rzędu PeanoCurve. Ponieważ przypadek l = w nadal musi tworzyć krzywą Peano, zmieniamy wyrażenie na poziomie 3, podobnie jak odpowiedź Davida ; dla lw po prostu Scalekrzywą prostokąta. Ta krzywa nadal będzie wypełniać przestrzeń, spełniając drugą premię. Aby uzyskać pierwszy bonus, po prostu Animatewe wszystkich rozmiarach. Zauważ, że OP zasugerował, że było to wystarczająco różne od Davida C, aby uzasadnić własną odpowiedź. Wynik dla n = 3, l = w = 1 wygląda następująco:

LegionMammal978
źródło
bardzo dobrze! (również z właściwą orientacją)
DavidC
13

GFA Basic 3.51 (Atari ST), 156 134 124 bajtów

Ręcznie edytowany wpis w formacie .LST. Wszystkie linie kończą się CR, w tym ostatnia.

PRO f(n)
DR "MA0,199"
p(n,90)
RET
PRO p(n,a)
I n
n=n-.5
DR "RT",a
p(n,-a)
DR "FD4"
p(n,a)
DR "FD4"
p(n,-a)
DR "LT",a
EN
RET

Rozszerzony i skomentowany

PROCEDURE f(n)      ! main procedure, taking the number 'n' of iterations
  DRAW "MA0,199"    !   move the pen to absolute position (0, 199)
  p(n,90)           !   initial call to 'p' with 'a' = +90
RETURN              ! end of procedure
PROCEDURE p(n,a)    ! recursive procedure taking 'n' and the angle 'a'
  IF n              !   if 'n' is not equal to 0:
    n=n-0.5         !     subtract 0.5 from 'n'
    DRAW "RT",a     !     right turn of 'a' degrees
    p(n,-a)         !     recursive call with '-a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,a)          !     recursive call with 'a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,-a)         !     recursive call with '-a'
    DRAW "LT",a     !     left turn of 'a' degrees
  ENDIF             !   end
RETURN              ! end of procedure

Przykładowe dane wyjściowe

peano-gfa

Arnauld
źródło
10

Perl 6 , 117 bajtów

{map ->\y{|map {(((++$+y)%2+$++)%3**(y+$^v,*/3...*%3)??$^s[$++%2]!!'│')xx$_*3},<┌ ┐>,$_,<└ ┘>,1},^$_}o*R**3

Wypróbuj online!

0-indeksowane. Zwraca tablicę 2D znaków Unicode. Podstawową ideą jest to, że w przypadku niższych rzędów wyrażenie

(x + (x+y)%2) % (3 ** trailing_zeros_in_base3(3*(y+1)))

daje wzór

|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|................||........  % 9
..||....||....||....||....|  % 3
|....||....||....||....||..  % 3
........||................|  % 9
|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|..........................  % 27

W górnych wierszach wyrażenie to

(x + (x+y+1)%2) % (3 ** trailing_zeros_in_base3(3*(y+3**n)))

Wyjaśnienie

{ ... }o*R**3  # Feed $_ = 3^n into block

map ->\y{ ... },^$_  # Map y = 0..3^n-1

|map { ... },<┌ ┐>,$_,<└ ┘>,1  # Map pairs (('┌','┐'),3^n) for upper rows
                               # and (('└','┘'),1) for lower rows.
                               # Block takes items as s and v

( ... )xx$_*3  # Evaluate 3^(n+1) times, returning a list

 (++$+y)%2  # (x+y+1)%2 for upper rows, (x+y)%2 for lower rows
(         +$++)  # Add x
                   (y+$^v,*/3...*%3)  # Count trailing zeros of 3*(y+v) in base 3
                3**  # nth power of 3
               %  # Modulo
??$^s[$++%2]  # If there's a remainder yield chars in s alternately
!!'│'         # otherwise yield '│'
nwellnhof
źródło
6

K (ngn / k) , 37 27 26 bajtów

{+y,(|'y:x,,~>+x),x}/1,&2*

Wypróbuj online!

zwraca macierz boolowską

|'yjest składnią specyficzną dla ngn / k. inne dialekty wymagają, :aby każdy czasownik był monadyczny:|:'y

ngn
źródło
1
Aby
upiększyć
3
@ user202729 zrobione - w stopce, aby nie wpłynęło to na liczbę bajtów
ngn
5

Wolfram Language 83 36 bajtów (ewentualnie -48 bajtów z bonusem)

Od wersji 11.1 PeanoCurvejest wbudowany.

Moje oryginalne, niezdarne przesłanie zmarnowało wiele bajtów na GeometricTransformationiReflectionTransform.

Ta znacznie zredukowana wersja została zasugerowana przez alephalpha . Reversebyło wymagane do prawidłowego ustawienia wyjścia.

Graphics[Reverse/@#&/@PeanoCurve@#]&

Przykład 36 bajtów

Graphics[Reverse/@#&/@PeanoCurve@#]&[3]

Krzywa Peano


Premia

Jeśli kwalifikuje się to do premii 100 pkt, waży 52 - 100 = -48 Kod [5]nie został zliczony, tylko czysta funkcja.

Table[Graphics[Reverse/@#&/@PeanoCurve@#]&@k{k,#}&[5]

sekwencja

DavidC
źródło
Graphics[Reverse/@#&/@PeanoCurve@#]&
alephalpha
To trochę jak oszustwo, mając funkcję, która sama oblicza krzywą Peano, ale wezmę ją za przyjętą odpowiedź, ponieważ mimo to jest dość imponująca;). @ LegionMammal978 Myślę, że zasługujesz na opublikowanie własnej odpowiedzi. Twierdzę, że jest ona na tyle inna, że ​​uzasadnia uznanie jej za zwycięską odpowiedź.
Peiffap,
4

BBC BASIC, 142 znaki ASCII (130 bajtów tokeny)

Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/download.html

I.m:q=FNh(m,8,8,0)END
DEFFNh(n,x,y,i)
IFn F.i=0TO8q=FNh(n-1,x-i MOD3MOD2*2*x,y-i DIV3MOD2*2*y,i)DRAWBY(1AND36/2^i)*x,y*(12653/3^i MOD3-1)N.
=0

wprowadź opis zdjęcia tutaj

Level River St
źródło
4

HTML + SVG + JS, 224 213 bajtów

Dane wyjściowe są odbijane w poziomie.

n=>document.write(`<svg width=${w=3**n*9} height=${w}><path d="M1 ${(p=(n,z)=>n--&&(p(n,-z,a(a(p(n,-z,d+=z)),p(n,z))),d-=z))(n*2,r=d=x=y=1,a=_=>r+=`L${x+=~-(d&=3)%2*9} ${y+=(2-d)%2*9}`)&&r}"fill=#fff stroke=red>`)

Wypróbuj online! (drukuje HTML)

Arnauld
źródło
3

Logo, 89 bajtów

to p:n:a
if:n>0[rt:a
p:n-1 0-:a
fw 5
p:n-1:a
fw 5
p:n-1 0-:a
lt:a]end
to f:n
p:n*2 90
end

Port odpowiedzi Atari BASIC @ Arnauld. Do użytku, coś takiego zrobić to :

reset
f 3
Neil
źródło
3

Stax , 19 bajtów

∩▐j>♣←╙~◘∩╗╢\a╘─Ràô

Uruchom i debuguj

Wyjście dla 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
rekurencyjny
źródło