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

19

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

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

Вызов

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

  • Входные данные могут быть приняты по вашему усмотрению (аргументы функции, стандартный ввод, программные аргументы) и в любом порядке.
    • Брызги будут даны в виде 1 символа для каждого типа брызг
    • ^+*-в качестве входных данных посыпьте будет список из 4 -х опрыскиваний, ^, +, *,-
    • Вероятность опрыскивания будет введена в качестве значения с плавающей точкой между 0 и 1. Например: 0.1,0.23
  • Вы должны распечатать вывод на стандартный вывод или эквивалентный.
  • Брызги не могут быть по краям пончика.
  • Каждый тип разбрызгивания должен иметь одинаковую вероятность попадания в каждую клетку.
  • Радиусы даны в единицах с 1 ячейкой.
  • Если внутренний радиус равен 0 ИЛИ внешнему радиусу, говорят, что пончик не имеет кольца.
  • Оба радиуса будут неотрицательными целыми числами.
  • Внутренние и внешние края пончика должны быть представлены с помощью хэшей ( #)
  • Тест, чтобы увидеть, находится ли точка в круге, учитывая радиус и центр круга:

    (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##            
             #############              
PieCot
источник
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, а не Donut, это экономит 4 символа, N=False if I==0 or I>=O else Trueможет быть, not (I==0 or I>=O)а функция C может быть лямбда-выражением. Но это действительно хорошая первая запись!
Mega Man
1
Вы можете сэкономить на отступе, переместив несколько операторов в одну строку с точкой с запятой.
Малтысен
1
Кроме того, я не думаю, что вы используете Pболее одного раза, поэтому нет смысла сохранять *100в переменной.
Малтысен