Der Donut Shop ™

19

Da Sie kein Geld mehr haben, haben Sie sich dazu angemeldet, Donuts für The Donut Shop ™ zu bauen, das größte digitale Donut-Unternehmen der Welt, hauptsächlich, weil es Donuts jeder erdenklichen Größe verkauft.

Angesichts der Tatsache, dass Handelsstandards heutzutage sehr schwierig sind, müssen Sie einen Code schreiben, der so kurz wie möglich ist, um diese Donuts zu erstellen, damit der Quellcode, der sie erstellt hat, außerhalb des Pakets platziert werden kann.

Herausforderung

Bei 4 Eingaben, Radius des Außenrings, Radius des Innenrings, den möglichen Streuseln und der Wahrscheinlichkeit, dass eine Zelle streut, wird ein Ring ausgegeben, der mit den Streuseln bedeckt ist, die die richtigen Innen- und Außenradien aufweisen.

  • Die Eingabe kann nach Belieben (Argumente zu einer Funktion, stdin, Programmargumente) und in beliebiger Reihenfolge erfolgen.
    • Die Streusel werden in Form von 1 Zeichen pro Streuselart angegeben
    • ^+*-als bestreuen Eingabe wäre eine Liste von 4 besprüht sein, ^, +, *,-
    • : Die Wahrscheinlichkeit eines Streuen wird als ein Gleitkommawert zwischen 0 und 1 zum Beispiel eingegeben werden 0.1,0.23
  • Sie müssen die Ausgabe als Standardausgabe oder gleichwertig ausdrucken.
  • Streusel dürfen nicht an den Rändern des Donuts sein.
  • Jede Art von Streuung muss die gleiche Wahrscheinlichkeit haben, in jeder Zelle zu sein.
  • Die Radien sind in 1-Zellen-Einheiten angegeben.
  • Wenn der innere Radius entweder 0 ODER der äußere Radius ist, hat der Ring keinen Ring.
  • Beide Radien sind nicht negative ganze Zahlen.
  • Die inneren und äußeren Ränder des Donuts müssen mit Hashes ( #) dargestellt werden
  • Ein Test, um zu sehen, ob sich ein Punkt in einem Kreis befindet, wenn ein Radius und der Mittelpunkt des Kreises gegeben sind:

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

Beispiel Eingabe mit Ausgabe

(Außenradius, Innenradius, Streusel, Streuwahrscheinlichkeit)

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

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

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

Dies ist Codegolf, die kürzeste Antwort in Bytes gewinnt

Blau
quelle
Sollte es eine gleichmäßige Verteilung der Scheine geben, reicht auch eine ungleichmäßige Verteilung aus.
Kishan Kumar
Die Streusel sollten gleichmäßig verteilt sein.
Blue
Aus der Spezifikation ist mir nicht klar, welche Positionen den Rändern der Kreise entsprechen.
Dennis
@Dennis Ich würde es lieber nicht ändern und die einzige Antwort disqualifizieren (das ist auch eine nette Antwort), aber ich wollte, dass ein Rand dort ist, wo ein Kreis nicht mit einem Kreis zusammentrifft (Punkt ist im Kreis, aber nicht alle Nachbarn sind es)
Blau
Ihre Beispielausgabe macht sie bereits ziemlich ungültig, da die Formen für 10, 4und 5, 2ziemlich unterschiedlich sind. Ich wollte einen Kommentar zu der Antwort hinterlassen, aber mir wurde klar, dass ich nicht wirklich verstand, wie die Ausgabe für alle Dimensionen aussehen sollte, außer für die in den Beispielen. Wenn Sie Ihre ursprüngliche Idee an die Ausgabe der Antwort anpassen möchten, liegt es an Ihnen, aber die Herausforderung sollte klar definieren, wie die Grenzen in beide Richtungen gezogen werden sollen.
Dennis

Antworten:

2

MATLAB, 231 Bytes

Hier eine Matlab-Lösung:

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

Einige Beispiele:

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

Python, 263 Bytes

So sah ich eine Herausforderung ohne Antworten, die relativ einfach, aber auch interessant aussah und dachte für mich:

Hmm ... Wenn ich der einzige bin, der eine Antwort hat, werde ich gewinnen, bis unweigerlich eine bessere Antwort auftaucht.

Also habe ich mich ein paar Minuten mit Python zusammengesetzt und mir einen groben Entwurf überlegt, den ich mithilfe der Vorschläge der Community optimiert habe, um seine Größe zu reduzieren.

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)

Für die obigen Beispiele wird dies erstellt

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

und

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

Ich bezweifle sehr, dass dies die kürzestmögliche Lösung ist, aber ich denke, es hat ziemlich gut geklappt, wenn ein autodidaktischer Teenager versucht hat, die Zeit totzuschlagen. Da dies so klein wie möglich ist, habe ich keine Kommentare eingefügt und Verknüpfungen zu jedem Variablennamen verwendet. Daher dient dieses Programm eher der Benutzerfreundlichkeit als der Lesbarkeit.

Wenn Sie diesen Code aus einem mir unbekannten Grund verwenden möchten, führen Sie ihn einfach in IDLE aus und geben Sie den Befehl ein

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

im oben beschriebenen Format.

Anonym No Lifer
quelle
2
Willkommen bei PPCG! Dies ist eine gute erste Antwort, aber es gibt viel Raum für Verbesserungen. Für den Anfang hilft es, unnötige Leerzeichen zu entfernen und alle Variablen auf einzelne Buchstaben zu kürzen, und den absAufruf zu entfernen , da die Radien garantiert nicht negativ sind. Ich empfehle auch, die Tipps zum Golfen in Python zu Rate zu ziehen, um zusätzliche Hinweise zu erhalten. Nochmals herzlich willkommen!
AdmBorkBork
2
Das ist eine schöne erste Antwort!
Katze
1
Tipp: Rufen Sie die D - Funktion und nicht Donut, das spart 4 Zeichen, N=False if I==0 or I>=O else Truekönnte sein , not (I==0 or I>=O)und die Funktion C eine Lambda sein könnte. Aber es ist ein wirklich guter erster Eintrag!
Mega Man
1
Sie können Einrückungen einsparen, indem Sie mehrere Anweisungen mit Semikolons in dieselbe Zeile verschieben.
Maltysen
1
Außerdem glaube ich nicht, dass Sie verwenden P mehr als einmal verwenden, so gibt es keinen Grund, das *100in einer Variablen zu speichern .
Maltysen