Frasi normali


16

Scrivi un programma o una funzione che, dati una stringa di input e una deviazione standard σ, emetta quella stringa lungo la normale curva di distribuzione con media 0e deviazione standard σ.

Curva di distribuzione normale

Le ycoordinate di ciascun personaggio csono:

inserisci qui la descrizione dell'immagine

dove σviene fornito come input e dov'è xla xcoordinata dell'asse di c.

  • Il carattere al centro della stringa ha x = 0. Se la lunghezza della stringa è pari, uno dei due caratteri centrali può essere scelto come centro.
  • I personaggi sono separati da gradini di 0.1(ad esempio il personaggio a sinistra del centro uno ha x = -0.1, quello a destra del centro uno x = 0.1, ecc.).

Stampa la stringa

  • Le linee, come i caratteri, sono separate da passaggi di 0.1.
  • Ogni personaggio è stampata sulla linea con il yvalore che più si avvicina al proprio yvalore (se il valore è proprio tra i valori di due linee, scegliere quello con il valore più grande (proprio come come rounddi solito ritorna 1.0per 0.5)).
  • Ad esempio, se la ycoordinata del valore centrale (ovvero il valore massimo) è 0.78e la ycoordinata del primo carattere è 0.2, allora ci saranno 9 linee: il carattere centrale stampato sulla linea 0e il primo carattere stampato sulla linea 8.

Ingressi e uscite

  • Puoi prendere entrambi gli input (la stringa e σ) come argomenti del programma, tramite STDINargomenti di funzione o qualcosa di simile nella tua lingua.
  • La stringa conterrà solo ASCIIcaratteri stampabili . La stringa può essere vuota.
  • σ > 0.
  • È possibile stampare l'output in STDOUT, in un file o restituirlo da una funzione ( purché sia una stringa e non dire un elenco di stringhe per ogni riga).
  • Una nuova riga finale è accettabile.
  • Gli spazi finali sono accettabili purché non superino la lunghezza dell'ultima riga (quindi non è accettabile spazio finale sull'ultima riga).

Casi test

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

punteggio

Questo è ,

                 nsw                 
                a   er               
              t                      
             s         i             
            e           n            
           t                         
         or               by         
       sh                   te       
so the                        s wins.



1
Penso che l'ultimo caso di test dovrebbe avere 3 punti nella riga superiore, non 1.
Addison

@addison Non ho l'implementazione di riferimento su questo computer ma non so perché Mego ottenga un risultato diverso. Il risultato che ottiene con il suo codice sembra molto "bloccato". Ignora quel caso di prova per il momento immagino.
Fatalizza l'

1
@TheBikingViking Lascerò che passi, va bene.
Fatalizza il

Risposte:


2

Python 3 con SciPy , 239 233 byte

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 funzione che accetta input tramite argomento di deviazione standard se stringa te stampa il risultato su STDOUT.

Come funziona

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

Provalo su Ideone


2

Rubino: 273254 byte

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

Un enorme grazie a Kevin Lau per aver salvato 18 byte!


1
Le lambda non hanno bisogno di genitori: ->n,s{...va bene. Non hai bisogno di parentesi quando assegni più variabili: o,g,r,l=[],0,{}funziona bene. $/può essere usato al posto di ?\n. Ordine delle operazioni significa che non devi mettere tutti i moltiplicatori sulla riga 5 in parentesi. putssviluppa automaticamente le matrici e le separa con nuove righe durante la stampa. n.gsub(/./){...batte n.each_char{...un po 'perché puoi togliere |c|e mettere $&dove cera menzionato . Crea le stringhe dei valori hash (inizia con ||=""not ||=[]) e puoi passare c[...]*""ac[...]
Value Ink
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.