도넛 샵 ™ 같습니다. (x-center)**2+(y-center)**2 < radius**2 출력이있는 입력 예 (외경, 내경,

현금이 부족하여 세계에서 가장 큰 디지털 도넛 회사 인 Donut Shop ™의 도넛을 만들려고 서명했습니다. 대부분 도넛을 상상할 수있는 모든 크기로 판매하기 때문입니다.

이제는 오늘날 거래 표준이 매우 까다로워서 이러한 도넛을 만들려면 가능한 한 짧은 코드를 작성하여이를 생성 한 소스 코드를 패킷 외부에 배치해야합니다.

도전

4 개의 입력, 외부 링의 반경, 내부 링의 반경, 가능한 스프링 클 및 셀이 스프링 클을 가질 가능성이 주어지면 올바른 내외부 반경을 갖는 스프링 클에 덮인 도넛을 출력합니다.

  • 원하는 방식 (함수, 표준 입력, 프로그램 인수에 대한 인수) 및 순서에 상관없이 입력을받을 수 있습니다.
    • 뿌리는 뿌리 유형 당 1 문자의 형태로 제공됩니다
    • ^+*-뿌린 입력 4 뿌리의리스트되는 바와 같이, ^, +, *,-
    • 뿌릴 확률은 0과 1 사이의 부동 소수점 값으로 입력됩니다. 예 : 0.1,0.23
  • 출력을 stdout 또는 이와 동등한 것으로 인쇄해야합니다.
  • 뿌리는 도넛의 가장자리에있을 수 없습니다.
  • 각 유형의 뿌린 물은 각 세포에있을 가능성이 동일해야합니다.
  • 반지름은 1 셀 단위로 제공됩니다.
  • 내부 반경이 0 또는 외부 반경과 같으면 도넛에 링이 없다고합니다.
  • 두 반지름은 음이 아닌 정수입니다.
  • 도넛의 내부 및 외부 모서리는 해시 ( #)를 사용하여 표시해야합니다.
  • 반지름과 원의 중심이 주어지면 점이 원 안에 있는지 확인하는 테스트는 다음과 같습니다.

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

출력이있는 입력 예

(외경, 내경, 뿌리, 뿌릴 확률)

  • 10, 4, “^ + *-“, 0.1

         #########
        #         #
      ##  ++   *  *##
      #             #
     #       ^^ - *  #
    #      #####   ^  #
    #+    #     #     #
    #    #       #-   #
    #    #       #  * #
    #    #       #+   #
    #    #       #    #
    #^  +#       #    #
    #     #     #     #
    # *    #####      #
     #       +  -    #
      #        ^    #
      ##  ^  +     ##
        #       ^ #
         #########
    
  • 5, 2, “: ^ + *”, 0.9

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

이것은 코드 골프입니다. 바이트 단위의 최단 답변



답변

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


답변

파이썬, 263 바이트

그래서 나는 비교적 쉬운 것처럼 보이지만 흥미롭고 자신에게 생각한 대답이없는 도전을 보았습니다.

흠 … 내가 대답 할 수있는 유일한 사람이라면, 더 나은 대답이 필연적으로 나타날 때까지 이길 것입니다.

그래서 몇 분 동안 파이썬과 함께 앉아 커뮤니티의 제안에 따라 크기를 줄이기 위해 거친 초안을 만들었습니다.

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)

위에서 설명한 형식으로.


답변