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


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

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в переменной.
Малтысен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.