Cửa hàng bánh rán ™


19

Thiếu tiền mặt, bạn đã đăng ký xây dựng bánh rán cho The Donut Shop ™, công ty bánh rán kỹ thuật số lớn nhất thế giới, chủ yếu là vì họ bán mọi kích cỡ của bánh rán có thể tưởng tượng được.

Bây giờ, do các tiêu chuẩn giao dịch ngày nay rất khó khăn, bạn cần viết một đoạn mã càng ngắn càng tốt để tạo ra các bánh rán này để mã nguồn tạo ra chúng có thể được đặt bên ngoài gói.

Thử thách

Cho 4 đầu vào, bán kính của vòng ngoài, bán kính của vòng trong, khả năng rắc và khả năng tế bào có rắc, tạo ra một chiếc bánh rán được bao phủ trong những rắc có bán kính bên trong và bên ngoài chính xác.

  • Đầu vào có thể được thực hiện theo cách bạn muốn (đối số cho hàm, stdin, đối số chương trình) và theo bất kỳ thứ tự nào.
    • Các rắc sẽ được đưa ra dưới dạng 1 ký tự cho mỗi loại rắc
    • ^+*-như rắc đầu vào sẽ là một danh sách của 4 sprinkles, ^, +, *,-
    • Cơ hội rắc sẽ được nhập dưới dạng giá trị dấu phẩy động giữa 0 và 1. ví dụ : 0.1,0.23
  • Bạn phải in đầu ra ra thiết bị xuất chuẩn hoặc tương đương.
  • Sprinkles không thể ở trên các cạnh của bánh rán.
  • Mỗi loại rắc phải có cơ hội như nhau trên mỗi tế bào.
  • Bán kính được tính theo đơn vị 1 ô.
  • Nếu bán kính bên trong bằng 0 HOẶC bán kính bên ngoài, thì chiếc bánh rán được cho là không có vòng.
  • Cả hai bán kính sẽ là số nguyên không âm.
  • Các cạnh bên trong và bên ngoài của bánh rán phải được thể hiện bằng cách sử dụng băm ( #)
  • Một thử nghiệm để xem liệu một điểm có nằm trong một vòng tròn hay không, cho một bán kính và tâm của vòng tròn là:

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

Ví dụ đầu vào với đầu ra

(bán kính ngoài, bán kính trong, rắc, cơ hội rắc)

  • 10, 4, "^ + * -", 0,1

         #########
        #         #
      ##  ++   *  *##
      #             #
     #       ^^ - *  #
    #      #####   ^  #
    #+    #     #     #
    #    #       #-   #
    #    #       #  * #
    #    #       #+   #
    #    #       #    #
    #^  +#       #    #
    #     #     #     #
    # *    #####      #
     #       +  -    #
      #        ^    #
      ##  ^  +     ##
        #       ^ #
         #########
    
  • 5, 2, ": ^ + *", 0,9

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

Đây là mã golf, câu trả lời ngắn nhất trong byte thắng


Nếu có một phân phối lấp lánh bằng nhau, hoặc phân phối không đồng đều cũng sẽ làm.
Kishan Kumar

Cần có một sự phân phối bằng nhau của rắc.
Màu xanh

Tôi không rõ ràng từ thông số kỹ thuật vị trí tương ứng với đường viền của các vòng tròn.
Dennis

@Dennis Tôi không muốn thay đổi nó và không đủ điều kiện cho câu trả lời duy nhất (đó cũng là một câu trả lời hay) nhưng ý tôi là đường viền là nơi vòng tròn gặp không phải vòng tròn (điểm nằm trong vòng tròn nhưng không phải tất cả hàng xóm)
Blue

Kết quả đầu ra ví dụ của bạn đã làm mất hiệu lực của nó khá nhiều, vì các hình dạng cho 10, 45, 2khá khác nhau. Tôi sẽ để lại một bình luận về câu trả lời, nhưng tôi nhận ra rằng tôi không thực sự hiểu đầu ra sẽ như thế nào đối với bất kỳ kích thước nào ngoại trừ các kích thước trong các ví dụ. Nếu bạn muốn thay đổi ý tưởng ban đầu của mình phù hợp với đầu ra từ câu trả lời, điều đó tùy thuộc vào bạn, nhưng thách thức nên xác định rõ cách vẽ đường viền theo cách nào.
Dennis

Câu trả lời:


2

MATLAB, 231 byte

Đây là một giải pháp 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)=' ';

Vài ví dụ:

>> 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 byte

Vì vậy, tôi đã thấy một thử thách không có câu trả lời nào trông tương đối dễ dàng nhưng cũng thú vị và tự nghĩ:

Hmm ... Nếu tôi là người duy nhất có câu trả lời, tôi sẽ chiến thắng cho đến khi câu trả lời tốt hơn chắc chắn xuất hiện.

Vì vậy, tôi đã ngồi xuống với Python trong vài phút và đưa ra một bản thảo thô, với sự giúp đỡ của các đề xuất của cộng đồng, tôi đã điều chỉnh để giảm kích thước của nó.

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)

Đối với các ví dụ trên, điều này tạo ra

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

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

Tôi rất nghi ngờ rằng đây là giải pháp ngắn nhất có thể, nhưng tôi nghĩ rằng nó hoạt động khá tốt đối với một nỗ lực tự học của thanh thiếu niên để giết thời gian. Vì nó được thiết kế nhỏ nhất có thể, tôi không bao gồm các bình luận và đã sử dụng các phím tắt trên mỗi tên biến và do đó, chương trình này dành cho khả năng sử dụng nhiều hơn là dễ đọc.

Nếu bạn muốn sử dụng mã này vì một số lý do mà tôi không biết, chỉ cần chạy nó trong IDLE và nhập lệnh

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

trong định dạng được mô tả ở trên.


2
Chào mừng đến với PPCG! Đây là một câu trả lời đầu tiên tốt, nhưng có rất nhiều chỗ để cải thiện. Đối với người mới bắt đầu, việc loại bỏ khoảng trắng không cần thiết và rút ngắn tất cả các biến thành một chữ cái sẽ giúp ích, cũng như xóa abscuộc gọi, vì bán kính được đảm bảo là không âm. Tôi cũng khuyên bạn nên kiểm tra Mẹo chơi gôn trong Python để biết thêm các gợi ý. Một lần nữa, chào mừng!
admBorkBork

2
Đây là một câu trả lời đầu tiên tốt đẹp!
mèo

1
Mẹo: Gọi hàm D và không phải Donut, điều này sẽ tiết kiệm 4 ký tự, N=False if I==0 or I>=O else Truecó thể not (I==0 or I>=O)và hàm C có thể là lambda. Nhưng đó là một mục đầu tiên thực sự tốt!
Mega Man

1
bạn có thể lưu vào thụt lề bằng cách di chuyển nhiều câu lệnh vào cùng một dòng bằng dấu chấm phẩy.
Maltysen

1
Ngoài ra, tôi không nghĩ rằng bạn sử dụng Pnhiều hơn một lần, vì vậy không có điểm nào là tiết kiệm *100trong một biến.
Maltysen
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.