Normal cümleler


16

Bir girdi dizesi ve standart sapma verildiğinde σ, bu dizeyi ortalama 0ve standart sapmayla normal dağılım eğrisi boyunca çıkaran bir program veya işlev yazın σ.

Normal dağılım eğrisi

yHer karakter koordinatı colduğu:

resim açıklamasını buraya girin

nerede σgirdi xolarak ve xeksen koordinatı nerede verilir c.

  • Dizenin ortasındaki karakterde x = 0. Dizenin uzunluğu eşitse, iki orta karakterden biri merkez olarak seçilebilir.
  • Karakterler, adımlarla ayrılır 0.1(örn. Ortadaki soldaki karakter x = -0.1, ortadaki sağdaki karakter x = 0.1vb.).

Dizeyi yazdırma

  • Çizgiler, karakterler gibi, adımlarıyla ayrılır 0.1.
  • Her karakter doğrultusunda yazılıdır ykendi en yakın değere ydeğer (değer iki çizgi değerleri arasında tam ise, sadece nasıl gibi büyük değere (olanı seçmek roundgenellikle döner 1.0için 0.5)).
  • Örneğin y, orta değerin koordinatı (yani maksimum değer) 0.78ve yilk karakterin koordinatı ise 0.2, 9 satır olacaktır: ortadaki karakter on line 0ve ilk karakter on line yazdırılır 8.

Girdiler ve çıktılar

  • Her iki girdiyi (dize ve σ) STDINişlev bağımsız değişkenleri veya kendi dilinizde benzer herhangi bir şey aracılığıyla program bağımsız değişkenleri olarak alabilirsiniz .
  • Dize yalnızca yazdırılabilir ASCIIkarakterler içerecektir . Dize boş olabilir.
  • σ > 0.
  • Çıktıyı STDOUTbir dosyaya yazdırabilir veya bir işlevden döndürebilirsiniz ( bir dize olduğu ve her satır için bir dize listesi söylemediği sürece ).
  • Yeni bir çizgi kabul edilebilir.
  • Sondaki boşluklar, çizginin uzunluğun son çizgiyi aşmadığı sürece kabul edilebilir (bu nedenle son satırda bir sondaki boşluk kabul edilemez).

Test senaryoları

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

puanlama

Bu ,

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



1
Bence son test vakası 1 değil, üst sırada 3 nokta olmalıdır
addison

@addison Bu bilgisayarda referans uygulamam yok ama Mego'nun neden farklı bir sonuç aldığını bilmiyorum. Koduyla elde ettiği sonuç çok "bloklu" görünüyor. Sanırım o test senaryosunu görmezden gel.
16'da ölümcül

1
@TheBikingViking Geçmesine izin vereceğim, sorun değil.
16'da ölümcül

Yanıtlar:


2

Python 3 ile SciPy , 239 233 bayt

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

Standart sapma sve dize argümanıyla girdiyi alan tve sonucu STDOUT'a basan bir işlev .

Nasıl çalışır

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

Ideone üzerinde deneyin


2

Yakut: 273254 Bayt

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

18 byte tasarruf ettiği için Kevin Lau'a çok teşekkürler !


1
Lambdas'ın ebeveynlere ihtiyacı yok: ->n,s{...sorun yok. Birden çok değişken atarken parantez gerekmez: o,g,r,l=[],0,{}gayet iyi çalışıyor. $/yerine kullanılabilir ?\n. İşlem sırası, tüm çarpmalarınızı satır 5'teki satırlara koymak zorunda olmadığınız anlamına gelir. putsotomatik olarak dizileri açar ve yazdırma sırasında bunları yeni satırlarla ayırır. biraz n.gsub(/./){...dışarı atıyor n.each_char{...çünkü sen-ebilmek almak |c|ve $&herhangi bir söz olduğu yere koymak c. Senin karma değerleri dizeleri (başlamak Make ||=""değil ||=[]) ve değiştirebileceğiniz c[...]*""içinc[...]
Değer Ink
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.