Normale Sätze

16

Schreiben Sie ein Programm oder eine Funktion, die bei gegebener Eingabezeichenfolge und Standardabweichung σdiese Zeichenfolge entlang der Normalverteilungskurve mit Mittelwert 0und Standardabweichung ausgibt σ.

Normalverteilungskurve

Die yKoordinate jedes Zeichens cist:

Bildbeschreibung hier eingeben

wo σwird als Eingabe angegeben und wo xist die xAchsenkoordinate von c.

  • Das Zeichen in der Mitte der Zeichenfolge hat x = 0. Wenn die Länge der Zeichenfolge gerade ist, kann eines der beiden mittleren Zeichen als Mittelpunkt gewählt werden.
  • Zeichen werden durch Schritte von getrennt 0.1(z. B. das Zeichen links von der Mitte x = -0.1, das rechts von der Mitte x = 0.1usw.).

String drucken

  • Zeilen werden wie Zeichen durch die Schritte von getrennt 0.1.
  • Jedes Zeichen wird in der Zeile mit dem yWert gedruckt, der seinem eigenen yWert am nächsten kommt (wenn der Wert genau zwischen den Werten von zwei Zeilen liegt, wählen Sie den Wert mit dem größten Wert aus (so wie es roundnormalerweise 1.0für gilt 0.5)).
  • Wenn beispielsweise die yKoordinate des Mittenwerts (dh der Maximalwert) 0.78und die yKoordinate des ersten Zeichens ist 0.2, werden 9 Zeilen angezeigt: das Mittenzeichen wird in der Zeile gedruckt 0und das erste Zeichen wird in der Zeile gedruckt 8.

Eingänge und Ausgänge

  • Sie können beide Eingaben (die Zeichenfolge und σ) als Programmargumente, Durchgangsargumente STDIN, Funktionsargumente oder ähnliches in Ihrer Sprache verwenden.
  • Die Zeichenfolge enthält nur druckbare ASCIIZeichen. Die Zeichenfolge kann leer sein.
  • σ > 0.
  • Sie können die Ausgabe STDOUTin eine Datei drucken oder von einer Funktion zurückgeben ( sofern es sich um eine Zeichenfolge handelt und nicht um eine Liste von Zeichenfolgen für jede Zeile).
  • Eine abschließende neue Zeile ist akzeptabel.
  • Abschließende Leerzeichen sind zulässig, solange die Zeile nicht länger als die letzte Zeile ist (daher ist in der letzten Zeile kein abschließendes Leerzeichen zulässig).

Testfälle

σ    String

0.5  Hello, World!

     , W     
   lo   or   
  l       l  
 e         d 
H           !



0.5  This is a perfectly normal sentence

                tly                
              ec    n              
             f       o             
            r         r            
           e           m           
          p             a          
        a                l         
      s                    se      
This i                       ntence



1.5  Programming Puzzles & Code Golf is a question and answer site for programming puzzle enthusiasts and code golfers.

                                                d answer site for p                                               
                                      uestion an                   rogramming                                     
                      Code Golf is a q                                        puzzle enthusia                     
Programming Puzzles &                                                                        sts and code golfers.



0.3  .....................

          .          
         . .         

        .   .        

       .     .       


      .       .      

     .         .     
    .           .    
   .             .   
...               ...

Wertung

Das ist ,

                 nsw                 
                a   er               
              t                      
             s         i             
            e           n            
           t                         
         or               by         
       sh                   te       
so the                        s wins.
Tödlich
quelle
Verwandte .
Fatalize
1
Ich denke der letzte Testfall sollte 3 Punkte in der obersten Reihe haben, nicht 1.
addison
@addison Ich habe meine Referenzimplementierung nicht auf diesem Computer, aber ich weiß nicht, warum Mego ein anderes Ergebnis erzielt. Das Ergebnis, das er mit seinem Code erzielt, scheint sehr "blockig" zu sein. Ignoriere diesen Testfall für den Moment, denke ich.
Fatalize
1
@TheBikingViking Ich lasse das passieren, das ist in Ordnung.
Fatalize

Antworten:

2

Python 3 mit SciPy , 239 233 Bytes

from scipy import stats,around,arange
def f(s,t):
 l=len(t);p=[];y=around(stats.norm.pdf((arange(l)-l//2)*.1,scale=s),1)*10
 for i in range(l):p+=[[' ']*(max(y)-y[i])];p[i]+=[t[i]]+[' ']*(y[i]-y[0])
 for j in zip(*p):print(*j,sep='')

Eine Funktion, die Eingaben über Argumente für Standardabweichung sund Zeichenfolge takzeptiert und das Ergebnis an STDOUT ausgibt.

Wie es funktioniert

from scipy import stats,around,arange  Import the statistics, rounding and range functions
                                       from SciPy
def f(s,t):                            Function with input standard deviation s and string
                                       t
l=len(t);p=[]                          Define the much-used length of t as l and initialise
                                       the print values list p
arange(l)                              Generate a list of integer x values in [0,l)...
...-l//2*.1                            ...and scale such that 0 is at the middle character
                                       and the x-step is 0.1
stats.norm.pdf(...,scale=s)            Generate a list containing the y values for each x
                                       value by calling the normal probability
                                       density function scaled with s...
y=around(...,1)                        ...round all values to 1 decimal place...
...*10                                 ...and multiply by 10 to give the vertical index of
                                       each character
for i in range(l):...                  For all characters in t...
p+=[[' ']*(max(y)-y[i])]               ..add the number of lines below the character as
                                       spaces...
p[i]+=[t[i]]+[' ']*(y[i]-y[0])         ...add the character and the number of lines above
                                       the character as spaces

This leaves p containing a list for each desired output line, but transposed.

for j in zip(*p):...                   For every output line in the transpose of p...
print(*j,sep='')                       ...print the output line

Probieren Sie es auf Ideone

TheBikingViking
quelle
2

Ruby: 273 254 Bytes

->n,s{j,o,g,r,l=-(n.size/2),[],0,{}
n.gsub(/./){(r[((2*Math::PI)**-0.5*10*Math.exp(-(j/1e1)**2/2/s/s)/s).round]||="")<<$&
j+=1}
r.sort.map{|y, c|o<<(l ?$/*(y-l-1):"")+(" "*g)+(c[0,(h=c.size)/2])+(" "*(n.size-g*2-h))+(c[h/2,h])
g+=h/2
l=y}
puts o.reverse}

Ein großes Dankeschön an Kevin Lau für die Einsparung von 18 Bytes!

addison
quelle
1
Lambdas brauchen keine Eltern: ->n,s{...ist in Ordnung. Sie brauchen keine Klammern, wenn Sie mehrere Variablen zuweisen: o,g,r,l=[],0,{}funktioniert einwandfrei. $/kann anstelle von verwendet werden ?\n. Die Reihenfolge der Operationen bedeutet, dass Sie nicht alle Multiplikationen in Zeile 5 in parens eintragen müssen. putsFaltet Arrays automatisch auseinander und trennt sie beim Drucken mit Zeilenumbrüchen. n.gsub(/./){...schlägt n.each_char{...ein bisschen aus, weil man das rausnehmen kann |c|und $&dort ablegen kann, wo es erwähnt cwurde. Machen Sie Ihre Hash-Werte-Zeichenketten (beginnen Sie mit ||=""nicht ||=[]) und Sie können c[...]*""zuc[...]
Value Ink