Магазин пончиків ™


19

Не вистачаючи грошей, ви підписалися на створення пончиків для The Donut Shop ™, найбільшої в світі цифрової пончикової компанії, головним чином тому, що вони продають будь-який розмір пончика, який можна уявити.

Тепер, враховуючи, що стандарти торгівлі на сьогоднішній день дуже жорсткі, потрібно створити фрагмент коду якомога коротше, щоб створити ці пончики, щоб вихідний код, який їх створив, міг бути розміщений на зовнішній стороні пакету.

Виклик

З урахуванням 4 входів, радіуса зовнішнього кільця, радіуса внутрішнього кільця, можливих бризок і шансу осередку посипати, вивести пончик, накритий цими насадками, який має правильний внутрішній і зовнішній радіуси.

  • Вхід може бути сприйнятий за вашим бажанням (аргументи функції, stdin, аргументи програми) та в будь-якому порядку.
    • Бризки подаватимуться у вигляді 1 символу на тип посипання
    • ^+*-в якості вхідних даних посипте буде список з 4 -х обприскувань, ^, +, *,-
    • Імовірність обприскування буде введена в якості значення з плаваючою точкою між 0 і 1. Наприклад: 0.1,0.23
  • Ви повинні роздрукувати вихід у stdout або еквівалент.
  • Бризки не можуть бути по краях пончика.
  • Кожен тип посипання повинен мати однаково ймовірний шанс опинитися на кожній клітині.
  • Радіуси наведені в 1-елементних одиницях.
  • Якщо внутрішній радіус дорівнює або АБО зовнішній радіус, як кажуть, у пончика немає кільця.
  • Обидва радіуси будуть невід’ємними цілими числами.
  • Внутрішні та зовнішні краї пончика повинні бути представлені хешами ( #)
  • Тест на предмет того, чи є точка у колі, заданий радіус, а центр кола:

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

Приклад введення з виходом

(зовнішній радіус, внутрішній радіус, посипання, можливість посипання)

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

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

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

Це кодовий гольф, найкоротша відповідь у байтах виграє


Якщо буде рівномірний розподіл блискіток, або нерівномірне розподіл також буде.
Кішань Кумар

Повинен бути рівний розподіл бризок.
Блакитний

Мені незрозуміло з специфікації, які позиції відповідають меж кіл.
Денніс

@Dennis Я б краще не змінив його та дискваліфікував єдину відповідь (це теж приємна відповідь), але я мав на увазі кордон, де буде коло, яке зустрічається без кола (точка знаходиться в колі, але не всі сусіди є)
Blue

Ваш приклад виведення вже майже приводить його в недійсність, оскільки форми для них 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

Пітон, 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 може бути лямбда. Але це справді хороший перший запис!
Мега Ман

1
ви можете заощадити на відступі, перемістивши кілька висловлювань на одну лінію з крапками з комою.
Малтісен

1
Крім того, я не думаю, що ви використовуєте Pбільше одного разу, тому немає сенсу зберігати *100змінну.
Мальтісен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.