Câu bình thường


16

Viết chương trình hoặc hàm, đưa ra một chuỗi đầu vào và độ lệch chuẩn σ, đưa ra chuỗi đó dọc theo đường cong phân phối bình thường với 0độ lệch trung bình và độ lệch chuẩn σ.

Đường cong phân phối bình thường

Các yphối hợp của mỗi nhân vật clà:

nhập mô tả hình ảnh ở đây

Ở đâu σ được cho là đầu vào, và ở đâu xxphối hợp trục c.

  • Các ký tự ở trung tâm của chuỗi có x = 0. Nếu độ dài của chuỗi là chẵn, một trong hai ký tự giữa có thể được chọn làm trung tâm.
  • Các ký tự được phân tách bằng các bước của 0.1 (ví dụ: ký tự ở bên trái của trung tâm người ta có x = -0.1, một ký tự ở bên phải của giữa có x = 0.1, v.v.).

In chuỗi

  • Các dòng, giống như các ký tự, được phân tách bằng các bước của 0.1.
  • Mỗi ký tự được in trên dòng có ygiá trị gần nhất với ygiá trị của chính nó (nếu giá trị nằm chính xác giữa các giá trị của hai dòng, hãy chọn một giá trị có giá trị lớn nhất (giống như cáchround thường lợi nhuận 1.0cho 0.5)).
  • Ví dụ: nếu ytọa độ của giá trị trung tâm (nghĩa là giá trị tối đa) 0.78ytọa độ của ký tự đầu tiên 0.2, thì sẽ có 9 dòng: ký tự trung tâm được in trên dòng 0và ký tự đầu tiên được in trên dòng8 .

Đầu vào và đầu ra

  • Bạn có thể lấy cả hai đầu vào (chuỗi và σ) làm đối số chương trình, thông qua STDIN, đối số hàm hoặc bất cứ thứ gì tương tự trong ngôn ngữ của bạn.
  • Chuỗi sẽ chỉ chứa các ASCIIký tự có thể in . Chuỗi có thể trống.
  • σ > 0.
  • Bạn có thể in đầu ra ra STDOUT, trong một tệp hoặc trả lại từ một hàm ( miễn là nó là một chuỗi và không nói danh sách các chuỗi cho mỗi dòng).
  • Một dòng mới trailing được chấp nhận.
  • Không gian lưu trữ được chấp nhận miễn là chúng không làm cho dòng vượt quá dòng cuối cùng (vì vậy không có khoảng trống nào được chấp nhận trên dòng cuối cùng).

Các trường hợp thử nghiệm

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

          .          
         . .         

        .   .        

       .     .       


      .       .      

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

Chấm điểm

Đây là ,

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



1
Tôi nghĩ rằng trường hợp thử nghiệm cuối cùng nên có 3 dấu chấm ở hàng trên cùng, không phải 1.
addison

@addison Tôi không có triển khai tham chiếu của mình trên máy tính này nhưng tôi không biết tại sao Mego lại nhận được kết quả khác. Kết quả anh ta thu được với mã của mình có vẻ rất "khối". Bỏ qua trường hợp thử nghiệm cho thời điểm tôi đoán.
Gây tử vong

1
@TheBikingViking Tôi sẽ để nó qua đi, thế là tốt.
Gây tử vong

Câu trả lời:


2

Python 3 với 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='')

Một hàm lấy đầu vào thông qua đối số của độ lệch chuẩn svà chuỗi tvà in kết quả ra STDOUT.

Làm thế nào nó hoạt động

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

Hãy thử nó trên Ideone


2

Ruby: 273 254 byte

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

Rất cảm ơn Kevin Lau vì đã tiết kiệm 18 byte!


1
Lambdas không cần parens: ->n,s{...vẫn ổn. Bạn không cần dấu ngoặc khi gán nhiều biến: o,g,r,l=[],0,{}hoạt động tốt. $/có thể được sử dụng thay thế ?\n. Thứ tự các hoạt động có nghĩa là bạn không phải đặt tất cả các bội số của mình lên dòng 5 trong parens. putstự động mở ra các mảng và phân tách chúng bằng các dòng mới khi in. n.gsub(/./){...vượt qua n.each_char{...một chút bởi vì bạn có thể lấy ra |c|và đặt $&bất kỳ đề cập nào c. Tạo chuỗi giá trị băm của bạn (bắt đầu bằng ||=""không ||=[]) và bạn có thể thay đổi c[...]*""thànhc[...]
Ink Ink
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.