甜甜圈店™


19

缺乏现金,您已注册为世界上最大的数字甜甜圈公司The Donut Shop™建造甜甜圈,主要是因为它们出售各种可以想象到的甜甜圈。

现在,鉴于当今的交易标准非常严格,您需要编写尽可能短的代码来创建这些甜甜圈,以便将创建它们的源代码放在数据包的外部。

挑战

在给定4个输入的情况下,外圈的半径,内圈的半径,可能的洒落以及单元格出现洒落的机会,输出覆盖在这些洒落中的甜甜圈,该甜甜圈具有正确的内半径和外半径。

  • 输入可以按照您希望的方式(函数的自变量,stdin,程序自变量)以任意顺序获取。
    • 每种类型的洒水将以1个字符的形式给出
    • ^+*-如洒输入将是4个洒列表,^+*-
    • 洒的可能性将被输入为0和1之间例如浮点值:0.10.23
  • 您必须将输出打印到标准输出或等效输出。
  • 洒在甜甜圈的边缘不能。
  • 每种类型的洒水都必须有同等的机会出现在每个单元格上。
  • 半径以1单元为单位给出。
  • 如果内半径等于0或外半径,则表示甜甜圈没有环。
  • 两个半径都是非负整数。
  • 甜甜圈的内边缘和外边缘必须使用哈希(#)表示
  • 给定半径和圆心是一个点是否在圆中的测试:

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

输入与输出示例

(外半径,内半径,洒水,洒水几率)

  • 10,4,“ ^ + *-”,0.1

         #########
        #         #
      ##  ++   *  *##
      #             #
     #       ^^ - *  #
    #      #####   ^  #
    #+    #     #     #
    #    #       #-   #
    #    #       #  * #
    #    #       #+   #
    #    #       #    #
    #^  +#       #    #
    #     #     #     #
    # *    #####      #
     #       +  -    #
      #        ^    #
      ##  ^  +     ##
        #       ^ #
         #########
    
  • 5,2,“:^ + *”,0.9

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

这是代码高尔夫,以字节为单位的最短答案


如果有均匀的火花分布,或者不均匀的分布也可以。
Kishan Kumar

洒水应该均匀分布。
蓝色

从规格上我不清楚,哪个位置对应于圆的边界。
丹尼斯

@Dennis我不想更改它并取消唯一答案的资格(这也是一个不错的答案),但我的意思是使边界成为圆与非圆相交的地方(点在圆中,但并非所有邻居都在)
Blue

你的榜样输出几乎使其无效已经,因为形状的10, 45, 2是相当不同的。我打算对答案发表评论,但我意识到我并没有真正理解除示例中的任何尺寸外输出的外观。如果您想改变您的原始想法,使其与答案的输​​出相匹配,这取决于您,但是挑战应该明确定义如何绘制边界。
丹尼斯

Answers:


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个字节

因此,我看到了一个没有答案的挑战,看上去比较容易,但也很有趣,并自言自语:

嗯...如果我是唯一一个有答案的人,我将赢得胜利,直到不可避免地出现一个更好的答案。

因此,我在Python上坐了几分钟,并提出了一个粗略的草案,在社区的建议的帮助下,我一直在进行调整以减小它的大小。

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可以是一个lambda。但这是一个非常好的入门!
Mega Man

1
您可以通过使用分号将多个语句移到同一行上来节省缩进。
Maltysen

1
另外,我认为您使用的P次数不止一次,因此*100将变量保存在其中毫无意义。
Maltysen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.