Kalimat normal

16

Tulis program atau fungsi yang, diberi string input dan deviasi standar σ, mengeluarkan string tersebut sepanjang kurva distribusi normal dengan mean 0dan deviasi standar σ.

Kurva distribusi normal

The ykoordinat masing-masing karakter cadalah:

masukkan deskripsi gambar di sini

dimana σdiberikan sebagai masukan, dan di mana xadalah xsumbu koordinat c.

  • Karakter di tengah-tengah string memiliki x = 0. Jika panjang string genap, salah satu dari dua karakter tengah dapat dipilih sebagai pusat.
  • Karakter dipisahkan oleh langkah-langkah dari 0.1(misalnya karakter di sebelah kiri dari tengah yang dimiliki x = -0.1, yang di sebelah kanan yang di tengah x = 0.1, dll.).

Mencetak string

  • Garis, seperti karakter, dipisahkan oleh langkah-langkah 0.1.
  • Setiap karakter dicetak pada garis dengan ynilai yang paling dekat dengan nilainya sendiri y(jika nilainya tepat di antara nilai dua garis, pilih satu dengan nilai terbesar (seperti bagaimana roundbiasanya kembali 1.0untuk 0.5)).
  • Misalnya, jika ykoordinat nilai tengah (yaitu nilai maksimum) adalah 0.78dan ykoordinat karakter pertama adalah 0.2, maka akan ada 9 baris: karakter tengah dicetak pada garis 0dan karakter pertama dicetak pada garis 8.

Masukan dan keluaran

  • Anda dapat mengambil kedua input (string dan σ) sebagai argumen program, melalui STDIN, argumen fungsi atau yang serupa dalam bahasa Anda.
  • String hanya akan berisi ASCIIkarakter yang dapat dicetak . Tali dapat kosong.
  • σ > 0.
  • Anda dapat mencetak output ke STDOUT, dalam file, atau mengembalikannya dari suatu fungsi ( selama itu adalah string dan tidak mengatakan daftar string untuk setiap baris).
  • Baris baru yang tertinggal dapat diterima.
  • Ruang trailing dapat diterima selama tidak membuat garis melebihi panjang garis terakhir (sehingga tidak ada ruang trailing yang dapat diterima pada baris terakhir).

Uji kasus

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

Mencetak gol

Ini adalah ,

                 nsw                 
                a   er               
              t                      
             s         i             
            e           n            
           t                         
         or               by         
       sh                   te       
so the                        s wins.
Fatalisasi
sumber
Terkait Terkait
Martin Ender
Terkait .
Fatalkan
1
Saya pikir test case terakhir harus memiliki 3 titik di baris atas, bukan 1.
addison
@addison Saya tidak memiliki implementasi referensi saya di komputer ini, tetapi saya tidak tahu mengapa Mego mendapatkan hasil yang berbeda. Hasil yang diperolehnya dengan kode itu tampak sangat "ganjil". Abaikan saja test case untuk saat ini kurasa.
Fatalkan
1
@ TheBikingViking Saya akan membiarkan itu berlalu, tidak apa-apa.
Fatalkan

Jawaban:

2

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

Sebuah fungsi yang mengambil input melalui argumen standar deviasi sdan string t, dan mencetak hasilnya ke STDOUT.

Bagaimana itu bekerja

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

Cobalah di Ideone

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

Terima kasih banyak kepada Kevin Lau karena telah menghemat 18 byte!

addison
sumber
1
Lambdas tidak perlu orangtua: ->n,s{...baik-baik saja. Anda tidak perlu tanda kurung saat menetapkan beberapa variabel: o,g,r,l=[],0,{}berfungsi dengan baik. $/dapat digunakan di tempat ?\n. Urutan operasi berarti Anda tidak harus meletakkan semua kelipatan Anda pada baris 5 di parens. putssecara otomatis membuka array dan memisahkannya dengan baris baru saat mencetak. n.gsub(/./){...berdetak n.each_char{...sedikit karena Anda dapat mengambil |c|dan meletakkan di $&mana disebutkan c. Buat string nilai hash Anda (mulai dengan ||=""tidak ||=[]) dan Anda dapat mengubah c[...]*""kec[...]
Value Ink