การวาดเส้นโค้ง Peano


13

บทนำ

ในเรขาคณิตPeano curveเป็นตัวอย่างแรกของเส้นโค้งการเติมพื้นที่ที่จะถูกค้นพบโดย Giuseppe Peano ในปี 1890 โค้งของ Peano เป็นฟังก์ชันที่ต่อเนื่องและยอดเยี่ยมจากช่วงหน่วยลงบนตารางหน่วย Peano ได้รับแรงบันดาลใจจากผลลัพธ์ก่อนหน้านี้ของ Georg Cantor ซึ่งทั้งสองชุดมีความสำคัญเชิงเดียวกัน เนื่องจากตัวอย่างนี้ผู้เขียนบางคนใช้วลี "Peano curve" เพื่ออ้างอิงโดยทั่วไปกับเส้นโค้งการเติมช่องว่างใด ๆ

ท้าทาย

โปรแกรมรับอินพุตซึ่งเป็นจำนวนเต็มnและเอาท์พุทภาพวาดที่แสดงการnวนซ้ำของเส้นโค้ง Peano เริ่มต้นจากด้านข้าง 2 ที่แสดงในส่วนด้านซ้ายของภาพนี้: การวนซ้ำสามครั้งของโค้ง Peano

อินพุต

เลขจำนวนเต็มnให้จำนวนการวนซ้ำของเส้นโค้ง Peano ทางเลือกอินพุตเพิ่มเติมอธิบายไว้ในส่วนโบนัส

เอาท์พุต

ภาพวาดของการnวนซ้ำของเส้นโค้ง Peano การวาดสามารถเป็นได้ทั้งแบบ ASCII หรือการวาด "ของจริง" แล้วแต่ว่าจะง่ายหรือสั้นที่สุด

กฎระเบียบ

  • สามารถกำหนดอินพุตและเอาต์พุตในรูปแบบที่สะดวก (เลือกรูปแบบที่เหมาะสมที่สุดสำหรับภาษา / โซลูชันของคุณ)
  • ไม่จำเป็นต้องจัดการค่าลบหรืออินพุตที่ไม่ถูกต้อง
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • หากเป็นไปได้โปรดใส่ลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

โบนัส

เนื่องจากสิ่งนี้ไม่ควรเดินในสวนสาธารณะ (อย่างน้อยก็ในภาษาส่วนใหญ่ที่ฉันนึกถึง) จึงได้รับคะแนนโบนัสสำหรับสิ่งต่อไปนี้:

  • -100 ไบต์หากรหัสของคุณสร้าง GIF nของการก่อสร้างของเส้นโค้งอาโน่ที่ขึ้นไป
  • -100 ไบต์หากรหัสของคุณวาดเส้นโค้งเติมช่องว่างสำหรับรูปสี่เหลี่ยมผืนผ้าใด ๆ (เส้นโค้ง Peano ใช้ได้กับสี่เหลี่ยมเท่านั้นอย่างเห็นได้ชัด) คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นใช้กับแบบฟอร์มn l wที่nมีความหมายเหมือนก่อนหน้า (จำนวนการวนซ้ำ) แต่เมื่อใดlและwกลายเป็นความยาวและความกว้างของสี่เหลี่ยมที่วาดเส้นโค้ง หากl == wนี่เป็นเส้นโค้ง Peano ปกติ

อนุญาตคะแนนเชิงลบ (แต่เป็นไปได้ ... )

แก้ไข

n == 3 (l == w == 1)กรุณารวมการส่งออกของโปรแกรมของคุณในการแก้ปัญหาสำหรับ


1
ยินดีต้อนรับสู่ PPCG :) นี่เป็นความท้าทายครั้งแรกที่ดี แม้ว่าจะรู้สึกคุ้นเคย แต่ฉันคิดว่าความท้าทายที่ฉันอาจนึกถึงคือศิลปะ ASCII อย่างไรก็ตามโปรดทราบว่าเราไม่สนับสนุนโบนัสอย่างมากและจะมีภาษากอล์ฟที่สามารถทำได้ในเวลาไม่ถึง 100 ไบต์ นอกจากนี้และที่สำคัญที่สุดคุณต้องมีเกณฑ์การชนะ ระบุว่าโบนัสของคุณลบไบต์จากคะแนนการแก้ปัญหาของฉันสงสัยว่าคุณตั้งใจนี้จะเป็นรหัสกอล์ฟ
Shaggy

4
ใช่ฉันไม่คิดว่าโบนัสเป็นความคิดที่ดีโดยเฉพาะอย่างยิ่งเมื่อมีอย่างน้อยสองอนิเมชั่นที่เน้นความสามารถในการเคลื่อนไหว ASCII
ASCII เท่านั้น ASCII เท่านั้น

2
โอ้ยังจะnใช้อะไรถ้าlและยังwเป็นอินพุต ???????????? และเส้นโค้ง Peano จะเป็นกรณีพิเศษ - ไม่ใช่เส้นโค้ง spacefilling เพียงอย่างเดียวดังนั้นอัลกอริทึมบางอย่างอาจต้องพิเศษ
ASCII-only

2
นอกจากนี้สิ่งที่ห้ามไม่ให้ใครทำโค้ง spacefilling เล็กน้อย (แค่ซิกแซกไปมา) สำหรับขนาดที่ไม่ใช่ตาราง
ASCII เท่านั้น

7
โบนัสในรหัสกอล์ฟเป็นหนึ่งในสิ่งที่ตกลงกันมากที่สุดเพื่อหลีกเลี่ยงเมื่อเขียนความท้าทาย ฉันขอแนะนำให้คุณลบออกและตัดสินใจว่าจะใช้เวอร์ชันท้าทายรุ่นใด
lirtosiast

คำตอบ:


6

Mathematica คะแนน 60 - 100 - 100 = -140

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

ฟังก์ชั่นบริสุทธิ์ ใช้nและ{l, w}(ความกว้างและความสูง) เป็นอินพุตและให้กราฟิกภาพเคลื่อนไหวเป็นเอาต์พุต มันเป็นครั้งแรกสร้างn TH PeanoCurveเพื่อโค้งอาโน่ด้วย ตั้งแต่L = Wกรณีที่ยังคงต้องการที่จะสร้างเส้นโค้ง Peano เราพลิกแสดงออกในระดับ 3, คล้ายกับคำตอบของ DavidC ; สำหรับlwเราแค่Scaleโค้งไปที่สี่เหลี่ยมผืนผ้า เส้นโค้งนี้จะยังคงเป็นช่องว่างการเติมโบนัสที่สอง สำหรับโบนัสครั้งแรกเราทำได้Animateทุกขนาด โปรดทราบว่า OP แนะนำว่าสิ่งนี้แตกต่างจาก DavidC เพื่อรับประกันคำตอบของตัวเอง ผลลัพธ์สำหรับn = 3, l = w = 1 มีดังนี้:


ดีมาก! (ด้วยการวางแนวที่เหมาะสมด้วย)
DavidC

13

GFA พื้นฐาน 3.51 (อาตาริ ST), 156 134 124 ไบต์

รายการที่แก้ไขด้วยตนเองในรูปแบบ. LST ทุกบรรทัดลงท้ายด้วยCRรวมถึงบรรทัดสุดท้าย

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

ขยายตัวและแสดงความคิดเห็น

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

ตัวอย่างผลลัพธ์

Peano-GFA


10

Perl 6 , 117 ไบต์

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

ลองออนไลน์!

0 การจัดทำดัชนี ส่งคืนอาร์เรย์ 2D ของอักขระ Unicode แนวคิดพื้นฐานคือสำหรับแถวที่ต่ำกว่านิพจน์

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

ให้รูปแบบ

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

สำหรับแถวบนการแสดงออกคือ

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

คำอธิบาย

{ ... }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 ไบต์

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

ลองออนไลน์!

ส่งกลับเมทริกซ์บูลีน

|'yเป็นไวยากรณ์เฉพาะสำหรับ ngn / k ภาษาถิ่นอื่น ๆ จำเป็นต้องมี:กริยาที่เป็นคำกริยา:|:'y


1
เพื่อให้การแสดงผลออกมาสวยงามยิ่งขึ้นให้เน้นทุกสิ่งที่เกิดขึ้น(หากเบราว์เซอร์ของคุณรองรับ)
user202729

3
@ user202729 เรียบร้อยแล้ว - ในส่วนท้ายดังนั้นจึงไม่ส่งผลกระทบต่อจำนวนไบต์
ngn

5

ภาษา Wolfram 83 83ไบต์ (อาจเป็น -48 ไบต์พร้อมโบนัส)

ตั้งแต่เวอร์ชัน 11.1 PeanoCurveเป็นรุ่นในตัว

การยอมจำนนแบบดั้งเดิมของฉันสูญเปล่าไปหลายไบต์GeometricTransformationและReflectionTransform.

รุ่นนี้ลดลงมากได้รับการแนะนำโดยalephalpha Reverseจำเป็นต้องปรับทิศทางเอาต์พุตอย่างถูกต้อง

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

ตัวอย่าง 36 ไบต์

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

Peano curve


โบนัส

หากสิ่งนี้มีคุณสมบัติสำหรับโบนัส 100 pt มันจะชั่งน้ำหนักที่ 52 - 100 = -48 รหัส[5]ไม่ถูกนับเฉพาะฟังก์ชั่นแท้

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

ลำดับ


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

มันรู้สึกเหมือนเป็นการโกงที่มีฟังก์ชั่นที่คำนวณเส้นโค้ง Peano ด้วยตัวเอง แต่ฉันจะใช้มันเป็นคำตอบที่ได้รับการยอมรับเพราะมันค่อนข้างน่าประทับใจอย่างไรก็ตาม) @ LegionMammal978 ฉันคิดว่าคุณสมควรที่จะโพสต์คำตอบของคุณเองฉันจะยืนยันว่ามันแตกต่างกันมากพอที่จะรับประกันได้ว่าการยอมรับมันเป็นคำตอบที่ชนะ
Peiffap


4

HTML + SVG + JS, 224 213 ไบต์

เอาต์พุตจะถูกทำมิเรอร์ในแนวนอน

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

ลองออนไลน์! (พิมพ์ HTML)


3

โลโก้ขนาด 89 ไบต์

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

คำตอบพื้นฐานของพอร์ตของ @ Arnauld ของอาร์นาลด์ หากต้องการใช้ทำสิ่งนี้ :

reset
f 3

3

Stax , 19 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

ผลลัพธ์สำหรับ 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.