ร้านโดนัท™


19

คุณไม่ได้ลงทะเบียนเพื่อสร้างโดนัทสำหรับ The Donut Shop ™ บริษัท โดนัทดิจิทัลที่ใหญ่ที่สุดในโลกส่วนใหญ่เป็นเพราะพวกเขาขายโดนัททุกขนาดเท่าที่จะเป็นไปได้

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

ท้าทาย

ให้ 4 อินพุตรัศมีของวงแหวนรอบนอกรัศมีของวงแหวนด้านในโรยที่เป็นไปได้และโอกาสของเซลล์ที่มีการโรยเอาท์พุทโดนัทที่ปกคลุมด้วยโรยเหล่านั้นซึ่งมีรัศมีด้านในและด้านนอกที่ถูกต้อง

  • อินพุตอาจถูกใช้ตามที่คุณต้องการ (อาร์กิวเมนต์ของฟังก์ชัน stdin, อาร์กิวเมนต์ของโปรแกรม) และในลำดับใด ๆ
    • โรยจะได้รับในรูปแบบ 1 ตัวอักษรต่อประเภทโรย
    • ^+*-เป็น input โรยจะเป็นรายการของ 4 โรย, ^, +, *,-
    • โอกาสของการโรยจะถูกป้อนเป็นค่าทศนิยมระหว่าง 0 ถึง 1 เช่น: 0.1,0.23
  • คุณต้องพิมพ์เอาต์พุตไปที่ stdout หรือเทียบเท่า
  • โรยหน้าไม่ได้บนขอบของโดนัท
  • การโรยแต่ละประเภทจะต้องมีโอกาสเท่ากันในแต่ละเซลล์
  • รัศมีจะได้รับในหน่วย 1 เซลล์
  • หากรัศมีภายในเท่ากับ 0 หรือรัศมีด้านนอกโดนัทจะถูกบอกว่าไม่มีวงแหวน
  • รัศมีทั้งสองจะเป็นจำนวนเต็มที่ไม่เป็นลบ
  • ขอบด้านในและด้านนอกของโดนัทจะต้องแสดงโดยใช้แฮช ( #)
  • การทดสอบเพื่อดูว่ามีจุดอยู่ในวงกลมหรือไม่โดยกำหนดรัศมีและจุดศูนย์กลางของวงกลมคือ:

    (x-center)**2+(y-center)**2 < radius**2

ตัวอย่างอินพุตพร้อมเอาต์พุต

(รัศมีด้านนอกรัศมีด้านในโรยโอกาสของการโรย)

  • 10, 4, "^ + * -", 0.1

         #########
        #         #
      ##  ++   *  *##
      #             #
     #       ^^ - *  #
    #      #####   ^  #
    #+    #     #     #
    #    #       #-   #
    #    #       #  * #
    #    #       #+   #
    #    #       #    #
    #^  +#       #    #
    #     #     #     #
    # *    #####      #
     #       +  -    #
      #        ^    #
      ##  ^  +     ##
        #       ^ #
         #########
    
  • 5, 2, ": ^ + *", 0.9

      #####
     #^^+ ^#
    #**###  #
    #:#   #^#
    #^#   #*#
    #:#   #*#
    #:+###* #
     # *:^:#
      #####
    

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


หากมีการกระจายอย่างเท่าเทียมกันของประกายไฟหรือการกระจายที่ไม่สม่ำเสมอจะทำเช่นกัน
Kishan Kumar

ควรมีการกระจายของโรยเท่ากัน
บลู

มันไม่ชัดเจนสำหรับฉันจากสเป็คที่ตำแหน่งสอดคล้องกับขอบของวงกลม
เดนนิส

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

เอาต์พุตของคุณตัวอย่างค่อนข้างโมฆะไปแล้วเนื่องจากรูปร่างสำหรับ10, 4และ5, 2แตกต่างกันมาก ฉันจะแสดงความคิดเห็นต่อคำตอบ แต่ฉันรู้ว่าฉันไม่เข้าใจจริง ๆ ว่าผลลัพธ์ควรมีลักษณะอย่างไรสำหรับมิติใด ๆ แต่อยู่ในตัวอย่าง หากคุณต้องการเปลี่ยนความคิดดั้งเดิมของคุณให้ตรงกับผลลัพธ์จากคำตอบนั่นก็ขึ้นอยู่กับคุณ แต่ความท้าทายควรกำหนดวิธีการวาดเส้นขอบอย่างชัดเจน
Dennis

คำตอบ:


2

MATLAB, 231 ไบต์

นี่เป็นวิธีการแก้ MATLAB:

function g=z(r,q,s,p);[x,y]=meshgrid(1:2*r,1:2*r);d=(x-r).^2+(y-r).^2;h=size(d);e=zeros(h);e(d<r^2 & d>=q^2)=1;f=bwperim(e,4);k=rand(h);j=numel(s);l=changem(randi(j,h),s,1:j);g=char(e);g(:,:)=' ';g(k<=p)=l(k<=p);g(f)='#';g(~e)=' ';

ตัวอย่างบางส่วน:

>> z(10, 4, '^+*-', 0.1)

ans =

     #########      
    #         #     
  ##           ##   
  #    -       -#   
 #               #  
#   -  #####    ^ # 
#     #     #     # 
#   -#       #    # 
# *  #       #+   # 
#**  #       #    # 
#  * #       # -  # 
#+  *#       #    # 
#     #     #     # 
#      #####      # 
 #           ^   #  
  #     *       #   
  ##+          ##   
    #         #     
     #########      

>> z(5, 2, ':^+*', 0.9)

ans =

  #####   
 #++::*#  
#^^###++# 
# #   #+# 
#^#   #^# 
#*#   #*# 
#+:###^*# 
 #*:^+^#  
  #####   

>> z(20,6, 'erthhjjjjkjkk', 0.4)

ans =

             #############              
           ##jh  k  k  k  ##            
         ##  jjj    j khh   ##          
        #r kj h   k tjhj j    #         
      ##jk    t k  jh j       h##       
     #k       rre            k j #      
    # j   j j  j  khtkt jr     kj #     
    #  k   rk je    j      h   j  #     
   # j   k   k  jth e k j   j    j #    
  #h   h h e     t e ej  j  r k r e #   
  #    j   r  jh  jk     j  kk   j  #   
 #      k     k    h k  jk     k j   #  
 #  jjk   hh k hj  r  j  je rjj k j  #  
#  ek  j j jj  h#######          hke  # 
#hj      k j j #       #ke jhkt  jee  # 
#        jk  k#         # k    j   t  # 
#k        j  #           #khk  r     j# 
#   tj  j te #           # j  r j j   # 
#e   je   jhk#           #        t j # 
#jj    j  h  #           #     k jj e # 
# j j   hj j #           # jkt kjjjr e# 
#j k    e    #           #       r   k# 
#jj  k    ek #           # hj  j rtj  # 
#   k j   hk h#         #     j  h j  # 
#   h trt  jrht#       #   et        k# 
#j  ehjj      j #######ett  kh kjj k  # 
 #   r  jj    ekk jk    th k   kkk h #  
 #hj       khe kj hr  jj   kk  r j   #  
  #r t    k j  k r  j  jk k hh    jj#   
  #  kjj  h k j       j rrr j  r j  #   
   #j kej  jj    t       h  j   hh #    
    #  he   e  tje j  tjhkjk kj   #     
    #j kt rjk    j j  ee    rkj   #     
     #   jjr e  j jkt j   e  j  j#      
      ##k  thhjj je   kj  kh   ##       
        # hje  j     jj kk t j#         
         ## k       h     e ##          
           ## e jje   kkhj##            
             #############              

7

Python ขนาด 263 ไบต์

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

อืม ... ถ้าฉันเป็นคนเดียวที่มีคำตอบฉันจะชนะจนกว่าคำตอบที่ดีกว่าจะปรากฏขึ้นอย่างหลีกเลี่ยงไม่ได้

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

from random import*
def D(O,I,S,P):
 a=range(-O,O+1);C=lambda x,y,z,n:(n-.5)**2<x*x+y*y<(z+.5)**2
 if I>=O:I=0
 for y in a:
  R=''
  for x in a:
   if C(x,y,O,O)+(C(x,y,I,I)&(I!=0)):R+='#'
   elif C(x,y,O,I)&(uniform(0,1)<P):R+=choice(s)
   else:R+=' '
  print(R)

สำหรับตัวอย่างด้านบนสิ่งนี้จะสร้างขึ้น

>>> D(10, 4, "^+*-", 0.1)
       #######       
     ##       ##     
    #         * #    
   #             #   
  #          + ^  #  
 # +               # 
 #   + +#####   -  # 
#      ##   ##    ^ #
#     ##     ##  *  #
#-    #       #     #
#     #       #  +  #
# +   #       #     #
#     ##     ##     #
#      ##   ##  *   #
 #+-    #####      # 
 #             - - # 
  #   -    -     +#  
   #      ^      #   
    # -    +    #    
     ## *     ##     
       #######       
>>> 

และ

>>> D(5, 2, ":^+*", 0.9)
   #####   
  #*^:* #  
 #^::*:^*# 
#* :###+*:#
#:*#   #+:#
#::#   #+ #
#+:#   #*:#
#^^:###::^#
 # + :*^ # 
  # *:+*#  
   #####   
>>> 

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

หากคุณต้องการที่จะใช้รหัสนี้ด้วยเหตุผลบางอย่างที่ไม่รู้จักกับฉันเพียงแค่เรียกใช้ใน IDLE และพิมพ์คำสั่ง

D(Outer Radius, Inner Radius, Sprinkles, Chance of Sprinkle)

ในรูปแบบที่อธิบายข้างต้น


2
ยินดีต้อนรับสู่ PPCG! นี่เป็นคำตอบแรกที่ดี แต่มีห้องพักมากมายสำหรับการปรับปรุง สำหรับผู้เริ่มต้นการลบช่องว่างที่ไม่จำเป็นและการย่อตัวแปรทั้งหมดให้เหลือเพียงตัวอักษรเดียวจะช่วยได้เช่นเดียวกับการลบการabsโทรออกเนื่องจากรัศมีรับประกันว่าจะไม่เป็นลบ ฉันยังแนะนำให้ตรวจสอบเคล็ดลับสำหรับการเล่นกอล์ฟใน Pythonสำหรับตัวชี้เพิ่มเติม ยินดีต้อนรับอีกครั้ง!
AdmBorkBork

2
นี่เป็นคำตอบแรกที่ดี!
แมว

1
เคล็ดลับ: เรียกใช้ฟังก์ชัน D และไม่ใช่โดนัทซึ่งจะช่วยประหยัด 4 ตัวอักษรN=False if I==0 or I>=O else Trueได้not (I==0 or I>=O)และฟังก์ชัน C อาจเป็นแลมบ์ดา แต่มันเป็นรายการแรกที่ดีจริงๆ!
Mega Man

1
คุณสามารถบันทึกการเยื้องได้โดยการย้ายหลาย ๆ คำสั่งไปยังบรรทัดเดียวกันด้วยอัฒภาค
Maltysen

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