Menggambar kurva Peano


13

pengantar

Dalam geometri, kurva Peano adalah contoh pertama dari kurva pengisian-ruang yang ditemukan, oleh Giuseppe Peano pada tahun 1890. Kurva Peano adalah fungsi surjective, kontinu dari interval satuan ke unit square, namun itu tidak injeksi. Peano termotivasi oleh hasil sebelumnya dari Georg Cantor bahwa dua set ini memiliki kardinalitas yang sama. Karena contoh ini, beberapa penulis menggunakan frasa "kurva Peano" untuk merujuk secara lebih umum ke kurva pengisian-ruang.

Tantangan

Program ini mengambil input yang merupakan bilangan bulat n, dan mengeluarkan gambar yang mewakili niterasi kurva Peano, mulai dari sisi 2 yang ditunjukkan di bagian paling kiri gambar ini: Tiga iterasi kurva Peano

Memasukkan

Integer nmemberikan angka iterasi dari kurva Peano. Opsional, input tambahan dijelaskan di bagian bonus.

Keluaran

Sebuah gambar dari niterasi kurva Peano. Gambar dapat berupa seni ASCII atau gambar "nyata", mana yang paling mudah atau paling pendek.

Aturan

  • Input dan output dapat diberikan dalam format apa pun yang nyaman (pilih format yang paling sesuai untuk bahasa / solusi Anda).
  • Tidak perlu menangani nilai negatif atau input yang tidak valid
  • Program lengkap atau fungsi dapat diterima.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Bonus

Karena ini seharusnya bukan jalan-jalan di taman (paling tidak dalam sebagian besar bahasa yang bisa saya pikirkan), poin bonus diberikan untuk hal berikut:

  • -100 byte jika kode Anda menghasilkan gif konstruksi kurva Peano hingga n.
  • -100 byte jika kode Anda menggambar kurva ruang-mengisi untuk segala bentuk persegi panjang (kurva Peano hanya bekerja untuk kotak, jelas). Anda dapat mengasumsikan bahwa input kemudian mengambil bentuk di n l wmana nmemiliki arti yang sama seperti sebelumnya (jumlah iterasi), tetapi di mana ldan wmenjadi panjang dan lebar persegi panjang untuk menggambar kurva. Jika l == w, ini menjadi kurva Peano biasa.

Skor negatif diizinkan (tetapi apakah mungkin ...).

Edit

Harap sertakan hasil program Anda dalam solusi untuk n == 3 (l == w == 1).


1
Selamat datang di PPCG :) Ini, sekilas, sepertinya tantangan pertama yang bagus. Meskipun terasa akrab, saya pikir tantangan yang mungkin saya pikirkan adalah seni ASCII. Namun, perlu diketahui bahwa kami sangat tidak menyarankan bonus dan bahwa akan ada bahasa golf yang dapat mencapai ini dalam waktu kurang dari 100 byte. Juga, dan yang paling penting, Anda membutuhkan kriteria kemenangan. Mengingat bahwa bonus Anda mengurangi byte dari skor solusi, saya menduga Anda bermaksud ini menjadi kode-golf .
Shaggy

4
Ya, saya tidak berpikir bonus adalah ide yang baik, terutama karena setidaknya ada dua golflang fokus seni ASCII yang mampu animasi
ASCII

2
Oh juga apa yang akan ndigunakan untuk jika ldan wyang juga masukan ??????????? Dan apakah kurva Peano akan menjadi kasus khusus - itu bukan satu-satunya kurva spacefilling, jadi beberapa algoritma mungkin harus membuatnya khusus
ASCII-only

2
Juga, apa yang menghentikan siapa pun dari membuat kurva pengisian ruang sepele (hanya zig-zag bolak-balik) untuk dimensi non-persegi
ASCII-only

7
Bonus dalam kode golf adalah salah satu hal yang paling disepakati untuk dihindari saat menulis tantangan. Saya sarankan Anda menghapusnya dan memutuskan mana yang akan menjadi versi kanonik dari tantangan.
lirtosiast

Jawaban:


6

Mathematica, skor 60 - 100 - 100 = -140

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

Fungsi murni. Mengambil ndan {l, w}(lebar dan tinggi) sebagai input, dan memberikan grafik animasi sebagai output. Ini pertama menciptakan n th rangka Peano kurva dengan PeanoCurve. Karena kasus l = w masih perlu membuat kurva Peano, kami membalikkan ekspresi pada level 3, mirip dengan jawaban DavidC ; untuk lw , kita hanya Scalekurva ke persegi panjang. Kurva ini akan tetap mengisi ruang, memuaskan bonus kedua. Untuk bonus pertama, kami cukupkan Animatesemua ukuran. Perhatikan bahwa OP menyarankan bahwa ini cukup berbeda dari DavidC untuk menjamin jawabannya sendiri. Hasil untuk n = 3, l = w = 1 adalah sebagai berikut:


sangat bagus! (dengan orientasi yang tepat juga)
DavidC

13

GFA Basic 3.51 (Atari ST), 156 134 124 byte

Daftar yang diedit secara manual dalam format .LST. Semua baris diakhiri dengan CR, termasuk yang terakhir.

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

Diperluas dan dikomentari

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

Contoh output

peano-gfa


10

Perl 6 , 117 byte

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

Cobalah online!

Diindeks 0. Mengembalikan array 2D karakter Unicode. Ide dasarnya adalah untuk baris bawah, ekspresi

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

menghasilkan pola

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

Untuk baris atas, ungkapannya adalah

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

Penjelasan

{ ... }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 '│'

6

K (ngn / k) , 37 27 26 byte

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

Cobalah online!

mengembalikan matriks boolean

|'ysintaks khusus untuk ngn / k. dialek lain membutuhkan a :untuk membuat kata kerja monadik:|:'y


1
Untuk membuat output lebih indah, sorot semua kejadian (jika didukung oleh browser Anda)
user202729

3
@ user202729 selesai - di footer sehingga tidak mempengaruhi jumlah byte
ngn

5

Bahasa Wolfram 83 36 byte, (mungkin -48 byte dengan bonus)

Pada versi 11.1, PeanoCurveadalah built-in.

Pengajuan asli saya yang canggung membuang banyak byte pada GeometricTransformationdanReflectionTransform.

Versi yang jauh berkurang ini disarankan oleh alephalpha . Reversediperlukan untuk mengarahkan output dengan benar.

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

Contoh 36 byte

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

Kurva Peano


Bonus

Jika ini memenuhi syarat untuk bonus 100 pt, itu berbobot di 52 - 100 = -48 Kode [5]tidak dihitung, hanya fungsi murni.

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

urutan


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

Rasanya agak curang untuk memiliki fungsi yang menghitung kurva Peano dengan sendirinya, tetapi saya akan menganggapnya sebagai jawaban yang diterima karena toh itu cukup mengesankan;). @ LegionMammal978 Saya pikir Anda pantas memposting jawaban Anda sendiri, saya berpendapat bahwa itu cukup berbeda untuk menjamin menerimanya sebagai jawaban kemenangan.
Peiffap


4

HTML + SVG + JS, 224 213 byte

Outputnya dicerminkan secara horizontal.

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>`)

Cobalah online!(mencetak HTML)


3

Logo, 89 byte

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

Jawaban Atari BASIC dari @ Arnauld. Untuk menggunakan, lakukan sesuatu seperti ini :

reset
f 3

3

Stax , 19 byte

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

Jalankan dan debug itu

Output untuk 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.