ASCII Doodling: เลเซอร์ในกล่อง


31

บางครั้งเมื่อฉันวาดรูปฉันวาดรูปสี่เหลี่ยมผืนผ้าเริ่มต้นด้วยเส้นทแยงมุมจากมุมใดมุมหนึ่งและจากนั้นก็แค่ลากเส้นเป็นเส้นโดย "สะท้อน" เมื่อใดก็ตามที่ฉันตีด้านข้างของรูปสี่เหลี่ยมผืนผ้า ฉันทำสิ่งนี้ต่อไปจนกว่าฉันจะตีอีกมุมหนึ่งของสี่เหลี่ยม (และหวังว่าอัตราส่วนของสี่เหลี่ยมมุมฉากของฉันจะไม่ลงตัวเลย) มันเหมือนกับการติดตามเส้นทางของแสงเลเซอร์ที่ส่องเข้าไปในกล่อง คุณต้องสร้างผลงานชิ้นนั้นด้วยศิลปะ ASCII

เป็นตัวอย่างให้พิจารณากล่องความกว้างและความสูง5 3เราจะเริ่มที่มุมซ้ายบนเสมอ #เครื่องหมายเขตแดนของกล่อง โปรดทราบว่าความกว้างและความสูงอ้างถึงมิติด้านใน

#######    #######    #######    #######    #######    #######    #######
#\    #    #\    #    #\   \#    #\  /\#    #\  /\#    #\/ /\#    #\/\/\#
# \   #    # \  /#    # \  /#    # \/ /#    # \/ /#    #/\/ /#    #/\/\/#
#  \  #    #  \/ #    #  \/ #    # /\/ #    #\/\/ #    #\/\/ #    #\/\/\#
#######    #######    #######    #######    #######    #######    #######

ความท้าทาย

เนื่องจากความกว้างและความสูงของกล่อง (บวก) คุณควรสร้างผลลัพธ์สุดท้ายของการติดตามเลเซอร์ คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่ง, ฟังก์ชั่นอาร์กิวเมนต์และส่งออกผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) หรือผ่านฟังก์ชั่น

คุณสามารถใช้รูปแบบรายการสตริงหรือตัวเลขที่สะดวกสำหรับการป้อนข้อมูล ผลลัพธ์จะต้องเป็นสตริงเดี่ยว (เว้นแต่คุณจะพิมพ์ลงใน STDOUT ซึ่งแน่นอนว่าคุณจะค่อยๆ) ซึ่งหมายความว่าคุณสามารถรับความสูงก่อนและความกว้างที่สอง - เพียงระบุรูปแบบการป้อนข้อมูลที่แน่นอนในคำตอบของคุณ

จะต้องไม่มีช่องว่างนำหน้าหรือต่อท้ายบนบรรทัดใด ๆ ของเอาต์พุต คุณสามารถเลือกที่จะออกบรรทัดใหม่ต่อท้ายบรรทัดเดียว

คุณต้องใช้พื้นที่/, \และ#และทำซ้ำกรณีทดสอบตรงตามที่แสดง

กรณีทดสอบ

2 2
####
#\ #
# \#
####

3 2
#####
#\/\#
#/\/#
#####

6 3
########
#\    /#
# \  / #
#  \/  #
########

7 1
#########
#\/\/\/\#
#########

1 3
###
#\#
#/#
#\#
###

7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

22 6
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

1
บางทีคำถามติดตามที่ดีเมื่อคำถามนี้ได้เริ่มแล้วก็ให้ทำแบบนี้กับกล่องและจุดเริ่มต้นที่ท้าทาย
Sanchises

@sanchises ฉันคิดว่าจริง ๆ แล้ว (และอาจจะยังคงโพสต์ไว้) แต่ฉันตัดสินใจที่จะไปกับรูปสี่เหลี่ยมผืนผ้าด้วยความหวังว่าบางคนอาจเกิดขึ้นกับสูตรที่ชัดเจน ฉันยังพิจารณาถึงจุดเริ่มต้นหลายจุดเช่นนั้นXจำเป็นสำหรับการข้าม อาจจะคราวหน้า. ;)
Martin Ender

2
เกี่ยวข้อง: i.imgur.com/6tXrIfw.webm
orlp

นี่จะเป็นจุดภาพเคลื่อนไหวที่สมบูรณ์แบบ "Animate 1 burst (one slash) 1 รอบ / ไม่มีที่สิ้นสุด)"
Martijn

คำตอบ:


20

Pyth, 43 41 39 ไบต์

K*\#+2QKVvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K

ลองมันออนไลน์: Pyth คอมไพเลอร์ ป้อนตัวเลขตามลำดับต่อไปนี้: height first line, second width width

ขอบคุณ isaacg ที่ช่วยประหยัดสองไบต์

คำอธิบาย:

โซลูชันของฉันไม่ติดตามแสงเลเซอร์ใช้รูปแบบง่าย ๆ ที่รวม gcd ถ้ามีขนาดของกล่องให้m, n ขนาดของแบบแผนคือว่าd = gcd(m, n)2*d x 2*d

เช่นรูปแบบการทำซ้ำสำหรับ 7 5

#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

คือ

\/
/\

( gcd(7, 5) = 1ขนาดของรูปแบบคือ2 x 2)

และรูปแบบการทำซ้ำสำหรับ 22 6

########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

คือ

\  /
 \/ 
 /\
/  \

( gcd(22, 6) = 2ขนาดของรูปแบบคือ4 x 4)

โซลูชันของฉันทำสิ่งต่าง ๆ ต่อไปนี้สำหรับแต่ละบรรทัด: มันสร้างรูปแบบหนึ่งบรรทัดทำซ้ำสองสามครั้งแล้วตัดมันในตอนท้ายเพื่อให้พอดีกับกล่อง

K*\#+2QK   implicit: Q is the second input number (=width)
K          K = 
 *\#+2Q        "#" * (2 + Q)
       K   print K (first line)

Vvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K  implicit: vz is the first input number (=height)
VQ                               for N in [0, 1, ..., vz-1]:
           ivzQ                             gcd(vz,Q)
          y                               2*gcd(vz,Q)
        *d                           string with 2*gcd(vz,Q) space chars
       X       N\\                   replace the Nth char with \
      X           _hN\/              replace the -(N+1)th char with /
    *Q                               repeat Q times
   <                   Q           only use the first Q chars
  p                     \#\#       print "#" + ... + "#"
                            )    end for
                             K   print K

ตั้งแต่Xการสนับสนุน "กำหนด" เพื่อสตริงคุณสามารถเปลี่ยนm\ ไปและลบ*d s
isaacg

@isaacg โทรดีมาก ฉันคิดว่าจะใช้*\ แทนในm\ ไม่ช้า แต่ทิ้งเพราะมีขนาดเท่ากัน ไม่คิดว่าของตัวแปรและไม่จำเป็นd s
Jakube

11

C, 256 ไบต์

f(w,h){int i,j,x=1,y=1,v=1,u=1;char b[h+2][w+3];for(i=0;i<w+3;i++)for(j=0;j<h+2;j++)b[j][i]=!i||!j||i>w||j>h?i>w+1?0:35:32;while((x||y)&&(x<=w||y<=h))v=x&&w+1-x?v:(x-=v,-v),u=y&&h+1-y?u:(y-=u,-u),b[y][x]=v/u<0?47:92,x+=v,y+=u;for(i=0;i<h+2;i++)puts(b[i]);}

ฉันอาจได้รับต่ำกว่า 200 และฉันจะเพิ่มคำอธิบายในภายหลัง แต่ฉันอาจมีเอกสารเนื่องจากในไม่กี่ชั่วโมงฉันควรจะทำแทน


27
คะแนนอินเทอร์เน็ตปลอมมีค่ามากกว่าระดับการศึกษาฉันแน่ใจ
Adam Davis


5

J, 85 ไบต์

g = gcd(w,h)ให้ ฟังก์ชั่นเติมองค์ประกอบของw/g by h/gเมทริกซ์ด้วยg by gกระเบื้องที่มี/และ\อยู่ในแนวทแยงและแนวทแยง อาร์เรย์ 4D ที่ได้จะถูกแปลงเป็นแบบ 2D (ด้านในของกล่อง) จากนั้นล้อมรอบด้วย#'s (ตัวเลข0 1 2 3จะถูกใช้แทน[space] / \ #และตัวเลขจะถูกเปลี่ยนเป็นอักขระที่ส่วนท้าย)

การคำนวณตามตำแหน่งโดยตรงของพิกัดภายในอาจทำให้ได้โซลูชันที่สั้นลงเล็กน้อย

' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.

การใช้งาน:

   6 (' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.) 22
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

ลองออนไลน์ได้ที่นี่


0

เครื่องคิดเลข Desmos - การแข่งขันที่ไม่ใช่เพื่อช่วยให้ความรู้เพิ่มเติม

ลองออนไลน์!

ปัจจัยการผลิต:

h as height of box, with 0-indexing
w as width of box, with 0-indexing

นายหน้า:

Let b = gcd(h,w),
Let c = |b-h%2b| Or |b-mod(h,2b)|

สูตรย่อ:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

ขาออก:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

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

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

โปรแกรมไม่เป็นไปตามเกณฑ์ขั้นสุดท้าย - สร้าง ASCII art of box และ line ดังนั้นฉันจึงส่งข้อมูลที่ไม่สามารถแข่งขันเพื่อช่วยให้ผู้อื่นดำเนินการท้าทายได้ โปรดทราบว่าเพื่อให้ Desmos ทำงานเมื่อ c = 0 หรือ c = b ได้มีการแนะนำตัวประกอบออฟเซ็ตเล็ก ๆ ที่ 0.01 เนื่องจาก Desmos ดูเหมือนว่ามีขอบเขตของ Mod (A, B) ของ (0, B) แทนที่จะเป็น [0, B )

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