Oraciones normales

16

Escriba un programa o función que, dada una cadena de entrada y una desviación estándar σ, produzca esa cadena a lo largo de la curva de distribución normal con media 0y desviación estándar σ.

Curva de distribución normal

La ycoordenada de cada personaje ces:

ingrese la descripción de la imagen aquí

donde σse da como entrada, y donde xes la xcoordenada del eje de c.

  • El carácter en el centro de la cadena tiene x = 0. Si la longitud de la cadena es par, cualquiera de los dos caracteres del medio se puede elegir como centro.
  • Los caracteres están separados por pasos de 0.1(por ejemplo, el carácter a la izquierda del centro que tiene x = -0.1, el que está a la derecha del centro tiene x = 0.1, etc.).

Imprimir la cadena

  • Las líneas, como los caracteres, están separadas por pasos de 0.1.
  • Cada carácter se imprime en la línea con el yvalor que está más cerca de su propio yvalor (si el valor es precisamente entre los valores de dos líneas, elegir el que tenga el mayor valor (al igual que cómo roundlo general regresa 1.0a 0.5)).
  • Por ejemplo, si la ycoordenada del valor central (es decir, el valor máximo) es 0.78y la ycoordenada del primer carácter es 0.2, entonces habrá 9 líneas: el carácter central se imprime en línea 0y el primer carácter se imprime en línea 8.

Entradas y salidas

  • Puede tomar ambas entradas (la cadena y σ) como argumentos del programa, a través de STDINargumentos de función o cualquier cosa similar en su idioma.
  • La cadena solo contendrá ASCIIcaracteres imprimibles . La cadena puede estar vacía.
  • σ > 0.
  • Puede imprimir el resultado STDOUTen un archivo o devolverlo desde una función ( siempre que sea una cadena y no diga una lista de cadenas para cada línea).
  • Una nueva línea final es aceptable.
  • Los espacios finales son aceptables siempre que no hagan que la línea exceda la última línea de longitud (por lo que no se acepta espacio final en la última línea).

Casos de prueba

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

Puntuación

Este es el ,

                 nsw                 
                a   er               
              t                      
             s         i             
            e           n            
           t                         
         or               by         
       sh                   te       
so the                        s wins.
Fatalizar
fuente
Relacionados .
Fatalize
1
Creo que el último caso de prueba debería tener 3 puntos en la fila superior, no 1.
addison
@addison No tengo mi implementación de referencia en esta computadora, pero no sé por qué Mego obtiene un resultado diferente. El resultado que obtiene con su código parece muy "bloqueado". Ignora ese caso de prueba por el momento, supongo.
Fatalize
1
@TheBikingViking Dejaré pasar eso, está bien.
Fatalize

Respuestas:

2

Python 3 con 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='')

Una función que toma datos a través del argumento de desviación estándar sy cadena t, e imprime el resultado en STDOUT.

Cómo funciona

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

Pruébalo en Ideone

TheBikingViking
fuente
2

Rubí: 273254 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}

¡Muchas gracias a Kevin Lau por guardar 18 bytes!

Addison
fuente
1
Las lambdas no necesitan parens: ->n,s{...está bien. No necesita corchetes al asignar múltiples variables: o,g,r,l=[],0,{}funciona bien. $/se puede usar en lugar de ?\n. El orden de las operaciones significa que no tiene que poner todas sus multiplicaciones en la línea 5 en parens. putsdespliega automáticamente las matrices y las separa con nuevas líneas al imprimir. n.gsub(/./){...supera n.each_char{...un poco porque puedes sacar el |c|y poner $&donde estaba cualquier mención de c. Haga sus cadenas de valores hash (comience con ||=""not ||=[]) y puede cambiar c[...]*""ac[...]
Value Ink