通常の文章


16

入力文字列と標準偏差を指定してσ、平均0と標準偏差の正規分布曲線に沿ってその文字列を出力するプログラムまたは関数を作成しますσ

正規分布曲線

y各文字の座標cは次のとおりです。

ここに画像の説明を入力してください

ここで、σ入力として与えられ、ここxれるx軸座標c

  • 文字列の中央の文字にはがありx = 0ます。文字列の長さが偶数の場合、中央の2つの文字のいずれかを中心として選択できます。
  • 文字は、以下の工程によって分離されている0.1(例えば、中央1の左側の文字があるx = -0.1、中央の1の右側に1持っているx = 0.1、など)。

文字列を印刷する

  • 文字のような行は、のステップで区切られます0.1
  • 各文字は、との行に印刷されy、独自に最も近い値y(値が正確に二行の値の間にある場合、(どれだけのような最大値とのいずれかを選択して値をround返す通常1.0のために0.5))。
  • たとえばy、中心値(つまり最大値)0.78y座標がで、最初の文字の座標がである場合、0.29行になります。中心文字が行に印刷され0、最初の文字が行に印刷されます8

入力と出力

  • 両方の入力(文字列とσ)をプログラム引数STDIN、関数引数、または言語の類似物として使用できます。
  • 文字列には印刷可能なASCII文字のみが含まれます。文字列は空にすることができます。
  • σ > 0
  • あなたはへの出力を印刷することができるSTDOUTファイルに、または(関数からそれを返す限り、各ラインのための文字列のリストを、それが文字列ではないと言います)。
  • 末尾の改行は許容されます。
  • 行の長さが最後の行を超えない限り、末尾のスペースを使用できます(したがって、最後の行に末尾のスペースは使用できません)。

テストケース

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

得点

これは

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



1
私は最後のテストケースでは、先頭行には、いない1. 3点を持つべきだと思う
アディソン

@addisonこのコンピューターに参照実装はありませんが、Megoが異なる結果になる理由はわかりません。彼が自分のコードで得た結果は非常に「むらがある」ように見えます。現時点では、そのテストケースは無視してください。
16

1
@TheBikingVikingそれを許可します、それは結構です。
16

回答:


2

Python 3、SciPy239 233バイト

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

標準偏差sとstringの引数を介して入力を受け取りt、結果をSTDOUTに出力する関数。

使い方

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でお試しください


2

Ruby:273 254バイト

->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バイトを節約してくれたKevin Lauに大いに感謝します!


1
ラムダは括弧を必要としません:->n,s{...結構です。複数の変数を割り当てるときに角かっこは必要ありませんo,g,r,l=[],0,{}。正常に動作します。$/の代わりに使用できます?\n。操作の順序は、括弧内のすべての乗算を行5に配置する必要がないことを意味します。puts印刷時に配列を自動的に展開し、改行で区切ります。あなたはそれを取り出して、言及があった場所に置くことができるので、少しn.gsub(/./){...打ち負かしn.each_char{...ます。あなたのハッシュ値の文字列(から始まるようにしますないが)、あなたは変更することができますに|c|$&c||=""||=[]c[...]*""c[...]
バリューインク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.