สร้าง ASCII Padovan Spiral


22

นี่เป็นเวอร์ชัน ASCII ของการท้าทายนี้ โพสต์เริ่มต้นถูกคั่นตามคำขอโดยMartin Ender

บทนำ

คล้ายกับ Fibonacci Sequence, Padovan Sequence ( OEIS A000931 ) เป็นลำดับของตัวเลขที่สร้างขึ้นโดยการเพิ่มคำก่อนหน้าในลำดับ ค่าเริ่มต้นถูกกำหนดเป็น:

P(0) = P(1) = P(2) = 1

ข้อกำหนดที่ 1, ที่ 1 และที่ 2 มีทั้งหมด 1 ความสัมพันธ์ที่เกิดซ้ำแสดงอยู่ด้านล่าง:

P(n) = P(n - 2) + P(n - 3)

ดังนั้นจึงให้ลำดับต่อไปนี้:

1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...

การใช้ตัวเลขเหล่านี้เป็นความยาวด้านข้างของรูปสามเหลี่ยมด้านเท่าให้ผลเป็นเกลียวที่ดีเมื่อคุณวางพวกมันทั้งหมดเข้าด้วยกันคล้ายกับ Fibonacci Spiral:

ป้อนคำอธิบายรูปภาพที่นี่

เอื้อเฟื้อภาพของWikipedia


งาน

งานของคุณคือการเขียนโปรแกรมที่สร้างเกลียวนี้ด้วยศิลปะ ASCII พร้อมอินพุตที่สอดคล้องกับคำศัพท์ใด เนื่องจากสามเหลี่ยมที่มีความยาวด้าน 1 (1 ตัวอักษร) เป็นไปไม่ได้ที่จะเป็นตัวแทนอย่างดีใน ASCII ความยาวด้านได้ถูกขยายด้วยปัจจัย 2 ดังนั้นสามเหลี่ยมของความยาวด้าน 1 จึงเป็นตัวแทนดังนี้:

 /\
/__\

ตัวอย่างเช่นถ้าอินพุตเท่ากับ 5 (เทอมที่ 5) เอาต์พุตควรเป็น:

   /\
  /  \
 /    \
/______\
\      /\
 \    /__\ 
  \  /\  /
   \/__\/

5 เทอมแรกคือ 1, 1, 1, 2, 2 ดังนั้นสามเหลี่ยมจึงมีด้านยาว 2, 2, 2, 4, 4 อันเนื่องมาจากการขยาย อีกตัวอย่างหนึ่งสำหรับอินพุต 8:

     __________
   /\          /\
  /  \        /  \
 /    \      /    \
/______\    /      \
\      /\  /        \
 \    /__\/          \
  \  /\  /            \
   \/__\/______________\
    \                  /
     \                /
      \              /
       \            /
        \          /
         \        /
          \      /
           \    /
            \  /
             \/

กฎระเบียบ

  • คุณต้องพิมพ์ผลลัพธ์และการป้อนข้อมูลจะต้องเป็นจำนวนเต็มที่สอดคล้องกับจำนวนคำ
  • อนุญาตการขึ้นบรรทัดใหม่และนำขึ้นบรรทัดใหม่การเว้นวรรคต่อท้ายหลังจากบรรทัดได้รับอนุญาตด้วย
  • การส่งของคุณจะต้องสามารถจัดการได้อย่างน้อยสูงสุดเทอมที่ 10 (9)
  • การส่งของคุณจะต้องเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่รับอินพุตและพิมพ์ผลลัพธ์
  • อนุญาตให้มีการหมุนของเอาต์พุตในทวีคูณ 60 องศา แต่ขนาดของสามเหลี่ยมจะต้องคงเดิมพร้อมกับการแทนค่า
  • อนุญาตให้ใช้ทวนเข็มนาฬิกา
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

คุณอาจสันนิษฐานว่าอินพุตนั้น> 0 และรูปแบบการป้อนข้อมูลที่ถูกต้องจะได้รับ

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ สวัสดีปีใหม่ทุกคน!


1
ภาษาของฉันTurtlèdสามารถรับค่าฐาน 10 ได้และประมวลผลได้ดี แต่ความท้าทายนี้จะง่ายขึ้นมากถ้ามันใช้อินพุตแบบ unary จะอนุญาตหรือไม่
เลมอนที่ทำลายได้

1
@ ทำลายโครงสร้างแตงโมใช่ อินพุตจะต้องเป็นจำนวนเต็มในรูปแบบบางประเภท
Andrew Li

เย็น. ฉันจะเริ่มทำงานทันที
เลมอนที่ทำลายได้

3
รอจริงมันยังยากอยู่
มะนาวที่ทำลายได้

คำตอบ:


13

Befunge, 871 836 798 bytes

&00p45*:10p20p030p240p050p060p9010gp9110gp1910gp1-91+10gpv
<v-g03+g06*2g041g055_v#!:%6:p06p05+p04g05g06:g04<p*54+292<
->10g:1\g3+:70p110gv >:5- #v_550g:01-\2*40g+1-30g
/\110:\-g03:\1:g055 _v#!-4:<vp01:-1g01-g03-1\-
^1<v07+1:g07< p08p < >:1-#v_550g:01-\40g+60g+1-30g-50g>v
 _0>p80gp:5-|v1\+66\:p\0\9:$<:p02:+1g02-g03+g06-\g04\1:<
0v|-g00:+1$$<>\p907^>p:!7v>3-#v_550g:30g+:30p1\0\-
1>10g+::0\g3-:70p\0^^07<v<>50#<g::30g+:30p-1-01-\
v >\$0gg> :1+10gg1- #v_^>0g10gg*+\:!2*-70g2+10gv>:#->#,"_"$#1_:1#<p
+1+g03$_^#`gg011+3:+3<g07\+*2+*`0:-\gg01+5g07:g<>1#,-#*:#8>#4_$#:^#
>55+,p30g40p10gg10g1>#v_
#v:#p0$#8_:$#<g!#@_0^ >
 >>:180gg`>>#|_:2+80gg:!v
3+^g\0p08:<vgg08+2::+3<$_100p1-v>g,\80gg+\80gp:2+90g:!01p\80gp
!#^_80g:1+^>\180gg`+!#^_20g80g`
5*g10!g09p04-1-\0\+g04:gg08:p09<^3`0:gg08+1:::$$_1#!-#\\:,#\<g

ลองออนไลน์!

บ่อยครั้งที่ Befunge เป็นกลอุบายที่เกิดขึ้นกับอัลกอริธึมที่ทำให้เราสามารถสร้างรูปแบบจากบนลงล่างเนื่องจากไม่สามารถทำการเรนเดอร์ลงในหน่วยความจำก่อนด้วยพื้นที่ จำกัด

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

การใช้เทคนิคนี้เราสามารถรองรับได้สูงสุด n = 15 ในการดำเนินการอ้างอิงก่อนที่เราจะเริ่มมีปัญหาล้นในเซลล์หน่วยความจำ 8 บิต ล่ามที่มีขนาดใหญ่กว่าเซลล์ควรจะรองรับได้ถึง n = 25 ก่อนที่หน่วยความจำจะหมด


มันน่าประทับใจมาก ... แต่คุณคิดว่าคุณสามารถอ่านโปรแกรมเหล่านี้ได้หรือไม่? ฮ่า ๆ สำหรับฉันมันดูสุ่มมาก มันสร้างโครงสร้างข้อมูลได้อย่างไร โครงสร้างข้อมูลชนิดใดที่ใช้? ขอบคุณ!
ดอนสดใส

1

ไป 768 ไบต์

func 卷(n int){
    数:=0
    p:=[]int{1,1,1}
    for i:=3;i<n;i++ {p=append(p,p[i-2]+p[i-3])}
    宽:=p[len(p)-1]*10+10
    素:=make([]int,宽*宽)
    for 数=range 素 {素[数]=32}
    for i:=0;i<数;i+=宽 {素[i]=10}
    态:=[]int{1,1,宽/2,宽/2,92}
    表:=[70]int{}
    s:="SRSQTSPQQ!QOQP~QQQQQQSQR~ORQR!OPOPTSQRQ$QPPQNQPPPXQQQQQQRRQXQRRRNOQPQ$"
    for i:=range s {表[i]=int(s[i])-33-48}
    表[49],表[59]=48,48
    for i:=0;i<4*n;i++ {
        梴:=p[i/4]*2
        if 态[1]==0 {梴=梴*2-2}
        for k:=0;k<梴;k++ {
            址:=(态[2]+态[3]*宽)%len(素)
            if 素[址]==32 {素[址]=态[4]}
            态[2]+=态[0]
            态[3]+=态[1]
        }
        数=((态[0]+1)*2+态[1]+1)*5
        if i%4>2 {数+=35}
        for k:=0;k<5;k++ {态[k]+=表[数+k]}
    }
    for i:=0;i<宽*宽;i++ {fmt.Printf("%c",rune(素[i]))}
}

แน่นอนว่ามันไม่เหมาะสม แต่มันก็ไม่ใช่จุดเริ่มต้นที่แย่ ฉันรู้ว่ามันอาจจะง่ายนิดหน่อยสำหรับมาตรฐานการเล่นกอล์ฟ แต่มันสนุกและฉันหวังว่ามันจะไม่สนใจถ้าฉันทิ้งโน้ตไว้กับตัวเองในอนาคต

มันทำงานอย่างไร

โดยทั่วไปฉันจำลอง 'เต่าวาด' ในโลโก้บนตารางพิกเซล ASCII แต่เต่าสามารถทำได้เพียงสามคำสั่งนี้:

rt   - right turn, turn 120 degrees right (1/3 of a Turn)
rth  - right turn half, turn  60 degrees right (1/6 of a Turn)
fd n - forward, go forward n steps, drawing a trail of _, /, or \

ทีนี้สำหรับสามเหลี่ยมแต่ละอันฉันไปแบบนี้โดยที่ P คือ 2x จำนวน Padovan ที่ n:

fd P
rt
fd P
rt 
fd P
rt
fd P
rth

'fd' ตัวที่สี่หมายถึงฉันกำลังติดตามด้านแรกของแต่ละสามเหลี่ยมอีกครั้ง สิ่งนี้จะช่วยให้กลับไปเป็นจุดเริ่มต้นที่ดีสำหรับรูปสามเหลี่ยม เลี้ยวขวาครึ่งทำให้แน่ใจว่าสามเหลี่ยมถัดไปจะอยู่ในทิศทางที่ถูกต้อง


ในการเล่นเต่าทะเลฉันเก็บตัวแปร 5 สถานะในอาเรย์态: ตำแหน่ง x, ตำแหน่ง y, ความเร็ว x, ความเร็ว y และ 'รูปวาดรูน' ในแต่ละเฟรมแอนิเมชัน x + = x velocity, y + = y velocity และรูนจะถูกวาด

จากนั้นฉันตั้งค่าตาราง表ซึ่งบอกวิธีการเลี้ยว รหัสเทิร์นเป็นเรื่องยุ่งยากเพราะ ASCII art ทำงานอย่างไร มันไม่ได้เคลื่อนไหวอย่างตรงไปตรงมาเหมือนบนหน้าจอพิกเซล ทิศทางของเต่าที่กำหนดโดยความเร็ว x และ y กำหนดการเปลี่ยนแปลงที่จำเป็นเพื่อให้ได้เทิร์นที่เหมาะสม

ในการเปิดมันจะดูที่ความเร็ว x และ y ในปัจจุบันและรวมเข้ากับดัชนี

xv = x velocity, yv = y velocity. 
i.e. a turtle facing down and to the right has 
xv of 1, and yv of 1. It can only face 6 
different directions. Formula is (xv+1)*2+yv+1

xv  yv    index
-1  -1    0
-1   0    1
-1   1    2
 1  -1    4
 1   0    5
 1   1    6

ดัชนีนี้ใช้เพื่อค้นหาชุดของ 5 ค่าในตาราง表 5 ค่าเหล่านั้นในตาราง表จะถูกเพิ่มให้กับตัวแปร 5 ตัวในสถานะ态 เต่าจะถูกเปิดอย่างมีประสิทธิภาพและพร้อมสำหรับการ 'fd' ครั้งต่อไป

สำหรับ rth ให้เลี้ยวขวาครึ่งมีส่วนแยกของตาราง表 มันถูกชดเชยด้วย 7 * 5 หรือ 35 รายการจากตารางแรกใน表

สุดท้ายฉันก็ทำการเข้ารหัสค่าจำนวนเต็มของตารางอย่างง่าย ๆ ลงในสตริง ascii

ฉันรู้ว่าฉันสามารถ 'บันทึก bytes' โดยการลบ Hanzi แต่อย่างที่ฉันบอกว่านี่ไม่เหมาะสมและมีสนามกอล์ฟที่เป็นไปได้มากขึ้น ... ฉันจะลบออกเมื่อไม่มีการเพิ่มประสิทธิภาพที่เป็นไปได้อื่น ๆ จริง ๆ แล้วฮันซี่นั้นมีความหมายตามความหมายที่แท้จริงของพวกเขาและแม้ว่าฉันจะไม่รู้จักภาษาจีนมันก็ช่วยให้ฉันคิดถึงโปรแกรม

数  index number
宽  screen width
素  pixel data
梴  length of side of triangle
态  current state
址  address of pixel
表  state transition table

ในการทดสอบรหัสคุณจะต้องใช้ไฟล์ golang แบบเต็มโดยมีส่วนหัวนี้

package main
import "fmt"

และส่วนท้ายนี้

func main ()  {
    for i := 0; i<15; i++ {
       卷(i)
    }
}

ขอบคุณ

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