ドーナツショップ™


19

現金が不足しているため、世界最大のデジタルドーナツ企業であるThe Donut Shop™にドーナツを構築するためにサインアップしました。

現在、取引基準が非常に厳しいことを考えると、これらのドーナツを作成するために可能な限り短いコードを作成して、それらを作成したソースコードがパケットの外側に配置できるようにする必要があります。

チャレンジ

4つの入力、外側のリングの半径、内側のリングの半径、可能なスプリンクル、およびセルにスプリンクルが発生する可能性がある場合、正しい内側および外側の半径を持つスプリンクルで覆われたドーナツを出力します。

  • 入力は、希望する方法(関数の引数、標準入力、プログラム引数)および任意の順序で取得できます。
    • スプリンクルは、スプリンクルタイプごとに1文字の形で与えられます
    • ^+*-スプリンクル入力は、4つのスプリンクルのリストであるように^+*-
    • 振りかける可能性は、0〜1の浮動小数点値として入力されます。例:0.10.23
  • 出力をstdoutまたは同等のものに出力する必要があります。
  • ドーナツの端に振りかけることはできません。
  • スプリンクルの各タイプは、各セルに等しく存在する可能性がなければなりません。
  • 半径は1セル単位で与えられます。
  • 内側の半径が0または外側の半径のいずれかに等しい場合、ドーナツにはリングがないと言われます。
  • 両方の半径は負でない整数になります。
  • ドーナツの内側と外側のエッジは、ハッシュ(#)を使用して表す必要があります
  • 半径と円の中心を指定して、点が円内にあるかどうかを確認するテストは次のとおりです。

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

出力付きの入力例

(外半径、内半径、振りかける、振りかける可能性)

  • 10、4、「^ + *-」、0.1

         #########
        #         #
      ##  ++   *  *##
      #             #
     #       ^^ - *  #
    #      #####   ^  #
    #+    #     #     #
    #    #       #-   #
    #    #       #  * #
    #    #       #+   #
    #    #       #    #
    #^  +#       #    #
    #     #     #     #
    # *    #####      #
     #       +  -    #
      #        ^    #
      ##  ^  +     ##
        #       ^ #
         #########
    
  • 5、2、「:^ + *」、0.9

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

これはコードゴルフで、バイト単位の最短回答が勝ちです


きらめきの均等な分布がある場合、または不均一な分布もあります。
のKishanクマール

スプリンクルが均等に分配されるはずです。
ブルー

どの位置が円の境界に対応するかは、仕様から私には明らかではありません。
デニス

私はむしろそれを変更し、唯一の答えを失格(それはあまりにも素敵な答えだ)が、円は(ポイントが円の中にあるすべてではない隣人である)非円に会ったところ、私はあることをボーダーのためのものではないと思います@Dennis
ブルー

サンプルの出力では、との形状がかなり異なるため10, 4、すでに無効になってい5, 2ます。答えにコメントを残そうとしていましたが、例のディメンション以外のディメンションについては、出力がどのように見えるかを実際には理解していないことに気付きました。元のアイデアを答えからの出力に合わせて変更したい場合、それはあなた次第ですが、課題はどちらの方法でも境界線を描く方法を明確に定義する必要があります。
デニス

回答:


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)
   #####   
  #*^:* #  
 #^::*:^*# 
#* :###+*:#
#:*#   #+:#
#::#   #+ #
#+:#   #*:#
#^^:###::^#
 # + :*^ # 
  # *:+*#  
   #####   
>>> 

これが可能な限り最短の解決策であるかどうかは非常に疑わしいが、独学の10代の人が時間をつぶそうとする試みにはかなりうまくいったと思う。これは可能な限り小さくなるように設計されているため、コメントを含めず、すべての変数名にショートカットを追加しました。

私が知らない何らかの理由でこのコードを使用したい場合は、IDLEで実行してコマンドを入力してください

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

上記の形式で。


2
PPCGへようこそ!これは良い最初の答えですが、改善の余地はたくさんあります。まず、不要な空白を削除し、すべての変数を1文字に短縮するabsと、半径が負でないことが保証されるため、呼び出しを削除するのに役立ちます。また、追加のポインターについては、Pythonでのゴルフのヒントを確認することをお勧めします。再び、ようこそ!
AdmBorkBork

2
これはいい最初の答えです!

1
ヒント:ドーナツではなく関数Dを呼び出すと、4文字節約N=False if I==0 or I>=O else Truenot (I==0 or I>=O)れ、関数Cはラムダになります。しかし、それは本当に良い最初のエントリーです!
メガマン

1
複数のステートメントをセミコロンで同じ行に移動することにより、インデントを節約できます。
マルティセン

1
さらに、P複数回使用するとは思わないので*100、変数に保存しても意味がありません。
マルティセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.