보통 문장


16

입력 문자열과 표준 편차가 주어지면 σ평균 0및 표준 편차 와 함께 정규 분포 곡선을 따라 해당 문자열을 출력 하는 프로그램이나 함수를 작성하십시오 σ.

정규 분포 곡선

y각 문자 의 좌표 c는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

여기서, σ입력으로서 부여되고, 여기서 x는 IS x축 좌표 c.

  • 문자열 중앙의 문자는 x = 0입니다. 문자열의 길이가 짝수이면 두 개의 중간 문자 중 하나를 중앙으로 선택할 수 있습니다.
  • 문자는 다음 단계에 의해 분리된다 0.1(예를 들면 중앙 하나 왼쪽의 문자 가지고 x = -0.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

@ addison이 컴퓨터에 참조 구현이 없지만 Mego가 다른 결과를 얻는 이유를 모르겠습니다. 그가 자신의 코드로 얻은 결과는 매우 "차단 적"인 것 같습니다. 내가 생각하는 순간 테스트 케이스를 무시하십시오.
Fatalize

1
@TheBikingViking 나는 그 패스를 드리겠습니다, 괜찮습니다.
Fatalize

답변:


2

파이썬 3 SciPy , 239 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및 문자열의 인수를 통해 입력을 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

루비 : 273254 바이트

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