Frases normais

16

Escreva um programa ou função que, dada uma sequência de entrada e um desvio padrão σ, produza essa sequência ao longo da curva de distribuição normal com média 0e desvio padrão σ.

Curva de distribuição normal

A ycoordenada de cada caractere cé:

insira a descrição da imagem aqui

onde σé dado como entrada e onde xé a xcoordenada do eixo de c.

  • O caractere no centro da string possui x = 0. Se o comprimento da string for par, qualquer um dos dois caracteres do meio poderá ser escolhido como o centro.
  • Os caracteres são separados por etapas de 0.1(por exemplo, o caractere à esquerda do centro x = -0.1, o da direita, o meio x = 0.1, etc.).

Imprimindo a sequência

  • Linhas, como caracteres, são separadas por etapas de 0.1.
  • Cada personagem é impresso na linha com o yvalor que é mais próximo ao seu próprio yvalor (se o valor for precisamente entre os valores das duas linhas, escolha aquele com o maior valor (da mesma forma como roundnormalmente retorna 1.0para 0.5)).
  • Por exemplo, se a ycoordenada do valor central (ou seja, o valor máximo) for 0.78e a ycoordenada do primeiro caractere 0.2, haverá 9 linhas: o caractere central sendo impresso na linha 0e o primeiro caractere impresso na linha 8.

Entradas e saídas

  • Você pode usar as duas entradas (a string e σ) como argumentos do programa, através de STDINargumentos de função ou qualquer coisa semelhante em seu idioma.
  • A sequência conterá apenas ASCIIcaracteres imprimíveis . A cadeia pode estar vazia.
  • σ > 0.
  • Você pode imprimir a saída STDOUTem um arquivo ou retorná-la de uma função ( desde que seja uma sequência e não diga uma lista de sequências para cada linha).
  • Uma nova linha à direita é aceitável.
  • Os espaços à direita são aceitáveis ​​desde que a linha não exceda a última linha de comprimento (portanto, nenhum espaço à direita é aceitável na última linha).

Casos de teste

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

Pontuação

Isso é ,

                 nsw                 
                a   er               
              t                      
             s         i             
            e           n            
           t                         
         or               by         
       sh                   te       
so the                        s wins.
Fatalizar
fonte
Relacionado .
Fatalize
1
Eu acho que o último caso de teste deve ter 3 pontos na linha de cima, não 1.
Addison
@addison Não tenho minha implementação de referência neste computador, mas não sei por que o Mego obtém um resultado diferente. O resultado que ele obtém com seu código parece muito "irregular". Ignore esse caso de teste no momento, eu acho.
Fatalize
1
@TheBikingViking Vou deixar isso passar, tudo bem.
Fatalize

Respostas:

2

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

Uma função que recebe entrada via argumento de desvio padrão se string te imprime o resultado em STDOUT.

Como 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

Experimente no Ideone

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

Um enorme obrigado a Kevin Lau por salvar 18 bytes!

Addison
fonte
1
Lambdas não precisam de parênteses: tudo ->n,s{...bem. Você não precisa de colchetes ao atribuir várias variáveis: o,g,r,l=[],0,{}funciona muito bem. $/pode ser usado no lugar de ?\n. Ordem das operações significa que você não precisa colocar todas as suas multiplicações na linha 5 em parênteses. putsdesdobra automaticamente matrizes e as separa com novas linhas durante a impressão. n.gsub(/./){...bate n.each_char{...um pouco porque você pode tirar o |c|e colocar $&onde qualquer menção cfoi. Faça seus valores de hash cordas (começar com ||=""não ||=[]) e você pode mudar c[...]*""ac[...]
Valor Ink