Normalne zdania

16

Napisz program lub funkcję, która przy danym ciągu wejściowym i standardowym odchyleniu σwyprowadza ten ciąg wzdłuż krzywej rozkładu normalnego ze średnią 0i odchyleniem standardowym σ.

Krzywa rozkładu normalnego

yWspółrzędna każdego znaku cjest:

wprowadź opis zdjęcia tutaj

gdzie σpodano jako dane wejściowe, a gdzie xjest xwspółrzędna osi c.

  • Znak na środku łańcucha ma x = 0. Jeśli długość łańcucha jest równa, jako środek można wybrać jeden z dwóch środkowych znaków.
  • Znaki są oddzielane krokami 0.1(np. Znak na lewo od środkowego ma x = -0.1, znak na prawo od środkowego x = 0.1itp.).

Drukowanie ciągu

  • Linie, podobnie jak znaki, są oddzielone krokami 0.1.
  • Każda postać jest drukowany na linii z ywartości, która jest najbliżej własnej ywartości (jeśli wartość jest dokładnie między wartościami dwóch linii, należy wybrać jedną z największych wartości (podobnie jak jak roundzwykle wraca 1.0do 0.5)).
  • Na przykład, jeśli ywspółrzędna wartości środkowej (tj. Wartości maksymalnej) jest, 0.78a ywspółrzędna pierwszego znaku to 0.2, to będzie 9 linii: środkowy znak jest drukowany w linii, 0a pierwszy znak jest drukowany w linii 8.

Wejścia i wyjścia

  • Możesz przyjmować oba dane wejściowe (ciąg znaków i σ) jako argumenty programu, argumenty STDINfunkcji lub cokolwiek podobnego w swoim języku.
  • Ciąg będzie zawierał tylko znaki do wydrukowania ASCII. Ciąg może być pusty.
  • σ > 0.
  • Możesz wydrukować dane wyjściowe do STDOUT, w pliku lub zwrócić je z funkcji ( o ile jest to ciąg znaków i nie wypowiadać listy ciągów dla każdej linii).
  • Końcowa nowa linia jest dopuszczalna.
  • Końcowe spacje są dopuszczalne, o ile nie powodują, że linia przekracza długość ostatniej linii (więc końcowe kreski nie są dopuszczalne).

Przypadki testowe

σ    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  .....................

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

Punktacja

To jest ,

                 nsw                 
                a   er               
              t                      
             s         i             
            e           n            
           t                         
         or               by         
       sh                   te       
so the                        s wins.
Fatalizować
źródło
Związane .
Fatalize
1
Myślę, że ostatni przypadek testowy powinien mieć 3 kropki w górnym rzędzie, a nie 1.
addison
@ addison Nie mam mojej referencyjnej implementacji na tym komputerze, ale nie wiem, dlaczego Mego ma inny wynik. Wynik, który uzyskuje ze swoim kodem, wydaje się bardzo „blokowy”. Zignoruj ​​ten przypadek testowy na razie.
Fatalize
1
@ TheBikingViking Przepuszczę to, w porządku.
Fatalize

Odpowiedzi:

2

Python 3 z SciPy , 239 233 bajtów

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

Funkcja, która pobiera dane wejściowe za pomocą argumentu odchylenia standardowego si łańcucha ti wypisuje wynik do STDOUT.

Jak to działa

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

Wypróbuj na Ideone

TheBikingViking
źródło
2

Rubin: 273 254 bajtów

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

Ogromne podziękowania dla Kevina Laua za uratowanie 18 bajtów!

addison
źródło
1
Jagnięta nie potrzebują parens: ->n,s{...jest w porządku. Nie potrzebujesz nawiasów podczas przypisywania wielu zmiennych: o,g,r,l=[],0,{}działa dobrze. $/może być używany zamiast ?\n. Kolejność operacji oznacza, że ​​nie musisz umieszczać wszystkich swoich mnożników w linii 5 w parens. putsautomatycznie rozwija tablice i oddziela je znakami nowej linii podczas drukowania. n.gsub(/./){...bije n.each_char{...nieco, ponieważ możesz wyjąć |c|i umieścić $&tam, gdzie była jakakolwiek wzmianka c. Utwórz ciąg wartości hash (zacznij od ||=""nie ||=[]), a możesz zmienić c[...]*""nac[...]
Value Ink