Toko Donat ™

19

Karena kekurangan uang, Anda telah mendaftar untuk membuat donat untuk The Donut Shop ™, perusahaan donat digital terbesar di dunia, terutama karena mereka menjual setiap ukuran donat yang bisa dibayangkan.

Sekarang, mengingat standar perdagangan saat ini sangat sulit, Anda perlu menulis sepotong kode sesingkat mungkin untuk membuat donat ini sehingga kode sumber yang membuatnya dapat diletakkan di luar paket.

Tantangan

Diberikan 4 input, jari-jari cincin luar, jari-jari cincin bagian dalam, kemungkinan taburan dan kemungkinan sel memiliki taburan, mengeluarkan donat yang tercakup dalam taburan yang memiliki jari-jari dalam dan luar yang benar.

  • Input dapat diambil sesuai keinginan Anda (argumen untuk suatu fungsi, stdin, argumen program) dan dalam urutan apa pun.
    • Taburan akan diberikan dalam bentuk 1 karakter per jenis taburan
    • ^+*-sebagai masukan taburi akan menjadi daftar dari 4 taburan, ^, +, *,-
    • Kesempatan Taburkan akan dimasukkan sebagai nilai floating point antara 0 dan 1. misalnya: 0.1,0.23
  • Anda harus mencetak output ke stdout atau setara.
  • Taburan tidak bisa berada di tepi donat.
  • Setiap jenis taburan harus memiliki peluang yang sama untuk berada di setiap sel.
  • Jari-jari diberikan dalam satuan 1 sel.
  • Jika jari-jari dalam sama dengan 0 ATAU jari-jari luar, donat dikatakan tidak memiliki dering.
  • Kedua jari-jari akan bilangan bulat non-negatif.
  • Tepi dalam dan luar donat harus diwakili menggunakan hashes ( #)
  • Tes untuk melihat apakah suatu titik dalam lingkaran, diberi jari-jari dan pusat lingkaran adalah:

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

Contoh input dengan output

(jari-jari luar, jari-jari dalam, taburan, kemungkinan taburan)

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

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

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

Ini adalah kode golf, jawaban terpendek dalam byte menang

Biru
sumber
Haruskah ada distribusi cahaya yang sama, atau distribusi yang tidak seragam juga akan dilakukan.
Kishan Kumar
Seharusnya ada distribusi pemercikan yang merata.
Biru
Tidak jelas bagi saya dari spec yang posisinya sesuai dengan batas lingkaran.
Dennis
@ Dennis Saya lebih suka tidak mengubahnya dan mendiskualifikasi satu-satunya jawaban (itu jawaban yang bagus juga) tapi saya bermaksud untuk perbatasan menjadi tempat lingkaran bertemu non-lingkaran (titik dalam lingkaran tetapi tidak semua tetangga)
Biru
Output contoh Anda sudah cukup banyak membatalkannya, karena bentuk untuk 10, 4dan 5, 2sangat berbeda. Saya akan meninggalkan komentar pada jawabannya, tetapi saya menyadari bahwa saya tidak benar-benar mengerti bagaimana output seharusnya terlihat untuk dimensi apa pun kecuali yang ada dalam contoh. Jika Anda ingin mengubah ide orisinal Anda cocok dengan output dari jawaban, itu terserah Anda, tetapi tantangannya harus jelas menentukan cara menggambar perbatasan dengan cara baik.
Dennis

Jawaban:

2

MATLAB, 231 byte

Di sini solusi 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)=' ';

Beberapa contoh:

>> 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##            
             #############              
PieCot
sumber
7

Python, 263 byte

Jadi saya melihat tantangan tanpa jawaban yang terlihat relatif mudah tetapi juga menarik dan berpikir dalam hati:

Hmm ... Jika saya satu-satunya dengan jawaban, saya akan menang sampai jawaban yang lebih baik muncul.

Jadi saya duduk dengan Python selama beberapa menit dan muncul dengan konsep kasar yang, dengan bantuan saran komunitas, saya telah mengutak-atik untuk mengurangi ukurannya.

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)

Untuk contoh di atas, ini menciptakan

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

dan

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

Saya sangat ragu bahwa ini adalah solusi terpendek yang mungkin, tetapi saya pikir itu bekerja dengan cukup baik untuk upaya remaja otodidak untuk menghabiskan waktu. Karena ini dirancang untuk sekecil mungkin, saya belum memasukkan komentar dan telah mengambil jalan pintas pada setiap nama variabel dan dengan demikian, program ini lebih untuk kegunaan daripada keterbacaan.

Jika Anda ingin menggunakan kode ini untuk beberapa alasan tanpa sepengetahuan saya, jalankan saja di IDLE dan ketik perintah

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

dalam format yang dijelaskan di atas.

Anonim Tanpa Lifer
sumber
2
Selamat datang di PPCG! Ini adalah jawaban pertama yang bagus, tetapi ada banyak ruang untuk perbaikan. Sebagai permulaan, menghapus spasi yang tidak perlu dan memperpendek semua variabel menjadi satu huruf akan membantu, serta menghapus abspanggilan, karena jari-jari dijamin tidak negatif. Saya juga merekomendasikan memeriksa Tips untuk bermain golf di Python untuk petunjuk tambahan. Sekali lagi, selamat datang!
AdmBorkBork
2
Ini jawaban pertama yang bagus!
kucing
1
Tip: Panggil fungsi D dan bukan Donut, ini menghemat 4 karakter, N=False if I==0 or I>=O else Truebisa jadi not (I==0 or I>=O)dan fungsi C bisa menjadi lambda. Tapi itu entri pertama yang sangat bagus!
Mega Man
1
Anda dapat menghemat lekukan dengan memindahkan beberapa pernyataan ke baris yang sama dengan titik koma.
Maltysen
1
Selain itu, saya tidak berpikir Anda menggunakan Plebih dari sekali, jadi tidak ada gunanya menyimpan *100dalam variabel.
Maltysen