Vẽ đường cong Peano


13

Giới thiệu

Trong hình học, đường cong Peano là ví dụ đầu tiên của đường cong lấp đầy không gian được phát hiện, bởi Giuseppe Peano vào năm 1890. Đường cong Peano là một hàm giả định, liên tục từ khoảng đơn vị trên hình vuông đơn vị, tuy nhiên nó không phải là tiêm. Peano được thúc đẩy bởi một kết quả trước đó của Georg Cantor rằng hai bộ này có cùng số lượng. Do ví dụ này, một số tác giả sử dụng cụm từ "đường cong Peano" để nói chung hơn về bất kỳ đường cong lấp đầy không gian nào.

Thử thách

Chương trình lấy một đầu vào là một số nguyên nvà xuất ra một bản vẽ đại diện cho nlần lặp thứ hai của đường cong Peano, bắt đầu từ 2 bên được hiển thị ở phần ngoài cùng bên trái của hình ảnh này: Ba lần lặp của đường cong Peano

Đầu vào

Một số nguyên ncho số lần lặp của đường cong Peano. Tùy chọn, đầu vào bổ sung được mô tả trong phần thưởng.

Đầu ra

Một bản vẽ của nlần lặp thứ năm của đường cong Peano. Bản vẽ có thể là cả nghệ thuật ASCII hoặc bản vẽ "thực", tùy theo cách dễ nhất hay ngắn nhất.

Quy tắc

  • Đầu vào và đầu ra có thể được cung cấp ở bất kỳ định dạng thuận tiện nào (chọn định dạng phù hợp nhất cho ngôn ngữ / giải pháp của bạn).
  • Không cần xử lý các giá trị âm hoặc đầu vào không hợp lệ
  • Hoặc là một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Tiền thưởng

Vì đây không phải là một cuộc dạo chơi trong công viên (ít nhất là trong hầu hết các ngôn ngữ tôi có thể nghĩ ra), điểm thưởng được trao cho những điều sau:

  • -100 byte nếu mã của bạn tạo ra một gif về cấu trúc của đường cong Peano lên đến n.
  • -100 byte nếu mã của bạn vẽ đường cong lấp đầy không gian cho bất kỳ hình dạng hình chữ nhật nào (đường cong Peano chỉ hoạt động cho hình vuông, rõ ràng). Bạn có thể giả định rằng các đầu vào sau đó đưa về hình thức n l wncó ý nghĩa tương tự như trước (số lặp), nhưng nơi lwtrở thành chiều dài và chiều rộng của hình chữ nhật, trong đó để vẽ đường cong. Nếu l == w, điều này trở thành đường cong Peano thông thường.

Điểm số âm được cho phép (nhưng chúng có thể ...).

Biên tập

Vui lòng bao gồm đầu ra của chương trình của bạn trong giải pháp cho n == 3 (l == w == 1).


1
Chào mừng bạn đến với PPCG :) Điều này, trong nháy mắt, có vẻ như là một thử thách đầu tiên tốt đẹp. Mặc dù cảm thấy quen thuộc, tôi nghĩ rằng thách thức mà tôi có thể nghĩ đến là một nghệ thuật ASCII. Tuy nhiên, xin lưu ý rằng chúng tôi không khuyến khích mạnh mẽ các phần thưởng và sẽ có các ngôn ngữ chơi gôn có thể đạt được điều này trong vòng dưới 100 byte. Ngoài ra, và quan trọng nhất, bạn cần một tiêu chí chiến thắng. Cho rằng tiền thưởng của bạn trừ đi byte từ điểm số của giải pháp, tôi nghi ngờ bạn dự định đây là môn đánh gôn .
Xù xì

4
Vâng, tôi không nghĩ rằng tiền thưởng là một ý tưởng hay, đặc biệt là vì có ít nhất hai golfl tập trung nghệ thuật ASCII có khả năng hoạt hình
ASCII - chỉ

2
Oh cũng là những gì sẽ nđược sử dụng cho nếu lwcũng đóng góp ??????????? Và đường cong Peano có phải là trường hợp đặc biệt - đó không phải là đường cong lấp đầy không gian duy nhất, vì vậy một số thuật toán có thể phải đặc biệt hóa nó
ASCII - chỉ

2
Ngoài ra, điều khiến mọi người không thể tạo ra một đường cong lấp đầy không gian tầm thường (chỉ ngoằn ngoèo qua lại) cho các kích thước không vuông
ASCII - chỉ

7
Tiền thưởng trong môn đánh gôn là một trong những điều được thỏa thuận nhất khi tránh các thử thách. Tôi đề nghị bạn loại bỏ chúng và quyết định đó sẽ là phiên bản chính tắc của thử thách.
lirtosiast

Câu trả lời:


6

Toán học, điểm 60 - 100 - 100 = -140

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

Chức năng thuần túy. Lấy n{l, w}(chiều rộng và chiều cao) làm đầu vào, và đưa ra một đồ họa hoạt hình làm đầu ra. Đầu tiên, nó tạo một đường cong Peano thứ n với PeanoCurve. Vì trường hợp l = w vẫn cần tạo đường cong Peano, chúng tôi lật biểu thức ở cấp 3, tương tự như câu trả lời của DavidC ; với lw , chúng ta chỉ Scaleđường cong đến hình chữ nhật. Đường cong này vẫn sẽ được lấp đầy không gian, đáp ứng phần thưởng thứ hai. Đối với phần thưởng đầu tiên, chúng tôi chỉ cần Animatenó trên tất cả các kích cỡ. Lưu ý rằng OP đề nghị rằng điều này đủ khác với DavidC để đảm bảo câu trả lời của riêng mình. Kết quả cho n = 3, l = w = 1 như sau:


rất đẹp! (với định hướng phù hợp quá)
DavidC

13

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

Một danh sách được chỉnh sửa thủ công ở định dạng .LST. Tất cả các dòng kết thúc với CR, bao gồm cả cuối cùng.

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

Mở rộng và bình luận

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

Ví dụ đầu ra

đậu phộng-gfa


10

Perl 6 , 117 byte

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

Hãy thử trực tuyến!

Chỉ số 0. Trả về một mảng 2D của các ký tự Unicode. Ý tưởng cơ bản là cho các hàng thấp hơn, biểu thức

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

mang lại mô hình

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

Đối với các hàng trên, biểu thức là

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

Giải trình

{ ... }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*

Hãy thử trực tuyến!

trả về một ma trận boolean

|'ylà cú pháp cụ thể cho ngn / k. các phương ngữ khác đòi hỏi :phải tạo ra một động từ đơn âm:|:'y


1
Để làm cho đầu ra đẹp hơn, hãy làm nổi bật tất cả các lần xuất hiện của (nếu được trình duyệt của bạn hỗ trợ)
user202729

3
@ user202729 đã hoàn tất - trong phần chân trang để nó không ảnh hưởng đến số byte
ngn

5

Ngôn ngữ Wolfram 83 36 byte, (có thể là -48 byte có thưởng)

Kể từ phiên bản 11.1, PeanoCurveđược tích hợp sẵn.

Bản gốc vụng về, vụng về của tôi đã lãng phí nhiều byte trên GeometricTransformationReflectionTransform.

Phiên bản giảm nhiều này đã được đề xuất bởi alephalpha . Reverseđược yêu cầu để định hướng đầu ra đúng.

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

Ví dụ 36 byte

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

Đường cong đậu phộng


Tặng kem

Nếu điều này đủ điều kiện cho phần thưởng 100 pt, nó nặng khoảng 52 - 100 = -48 Mã [5]không được tính, chỉ có chức năng thuần túy.

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

sự nối tiếp


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

Cảm giác giống như gian lận khi có một hàm tính toán đường cong Peano, nhưng tôi sẽ coi đó là câu trả lời được chấp nhận vì dù sao nó cũng khá ấn tượng;). @ LegionMammal978 Tôi nghĩ rằng bạn xứng đáng đăng câu trả lời của riêng mình, tôi cho rằng nó đủ khác nhau để đảm bảo chấp nhận nó là câu trả lời chiến thắng.
Peiffap


4

HTML + SVG + JS, 224 213 byte

Đầu ra được nhân đôi theo chiều ngang.

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

Hãy thử trực tuyến! (in 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

Câu trả lời Atari BASIC của cảng @ Arnauld. Để sử dụng, làm một cái gì đó như này :

reset
f 3

3

Stax , 19 byte

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

Chạy và gỡ lỗi nó

Đầu ra cho 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.