ประโยคปกติ


16

เขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับสายเข้าและค่าเบี่ยงเบนมาตรฐานσผลผลิตที่สตริงตามเส้นโค้งการแจกแจงแบบปกติที่มีค่าเฉลี่ยส่วนเบี่ยงเบนมาตรฐาน0σ

เส้นโค้งการแจกแจงปกติ

yพิกัดของตัวละครแต่ละตัวcคือ:

ป้อนคำอธิบายรูปภาพที่นี่

ที่σจะได้รับเป็น input และสถานที่ที่xเป็นแกนประสานงานของxc

  • อักขระที่อยู่ตรงกลางของสตริงมี x = 0ตัวละครในใจกลางของสตริงมีหากความยาวของสตริงเป็นเลขคู่สามารถเลือกอักขระกลางสองตัวใดตัวหนึ่งเป็นกึ่งกลาง
  • ตัวละครจะถูกคั่นด้วยขั้นตอนของ0.1(เช่นตัวละครทางด้านซ้ายของศูนย์หนึ่งมีx = -0.1ตัวละครหนึ่งทางด้านขวาของกลางมีx = 0.1ฯลฯ )

การพิมพ์สตริง

  • 0.1สายเช่นตัวอักษรจะถูกคั่นด้วยขั้นตอนของ
  • ตัวละครแต่ละตัวจะพิมพ์อยู่บนบรรทัดที่มีyค่าที่ใกล้เคียงกับของตัวเองyค่า (ถ้ามีค่าเป็นแม่นยำในระหว่างค่าของทั้งสองสายให้เลือกอย่างใดอย่างหนึ่งที่มีค่าที่ใหญ่ที่สุด (เช่นเดียวกับวิธีการที่roundมักจะให้ผลตอบแทน1.0สำหรับ0.5))
  • ตัวอย่างเช่นถ้าyพิกัดของค่ากลาง (เช่นค่าสูงสุด) เป็น0.78และyพิกัดของตัวอักษรตัวแรกเป็น0.2แล้วจะมี 9 สาย: ตัวศูนย์ถูกพิมพ์บนเส้นและตัวอักษรตัวแรกถูกพิมพ์ในบรรทัด08

อินพุตและเอาต์พุต

  • คุณสามารถรับทั้งอินพุต (สตริงและσ) เป็นอาร์กิวเมนต์ของโปรแกรม, ผ่าน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
ฉันคิดว่ากรณีทดสอบสุดท้ายควรมี 3 จุดในแถวบนไม่ใช่ 1
addison

@addison ฉันไม่มีการใช้งานอ้างอิงของฉันในคอมพิวเตอร์เครื่องนี้ แต่ฉันไม่รู้ว่าทำไม Mego ถึงได้ผลลัพธ์ที่แตกต่าง ผลลัพธ์ที่เขาได้รับจากรหัสดูเหมือนว่า "บล็อก" มาก ไม่สนใจกรณีทดสอบในตอนที่ฉันเดา
ทำให้เสียชีวิต

1
@TheBikingViking ฉันจะปล่อยให้ผ่านนั่นเป็นเรื่องปกติ
ทำให้เสียชีวิต

คำตอบ:


2

Python 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

ทับทิม: 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}

ขอบคุณมากสำหรับKevin Lau ที่ช่วยประหยัด 18 ไบต์!


1
แลมบ์ดาไม่จำเป็นต้องมีการเลียนแบบ: ->n,s{...ไม่เป็นไร คุณไม่จำเป็นต้องใช้วงเล็บในการกำหนดตัวแปรหลายตัว: ใช้o,g,r,l=[],0,{}งานได้ดี สามารถนำมาใช้ในสถานที่ของ$/ ?\nลำดับการดำเนินการหมายความว่าคุณไม่จำเป็นต้องใส่ทวีคูณของคุณทั้งหมดในบรรทัดที่ 5 ใน parens putsเปิดอาร์เรย์โดยอัตโนมัติและแยกออกเป็นบรรทัดใหม่เมื่อพิมพ์ n.gsub(/./){...เต้นออกไปn.each_char{...เล็กน้อยเพราะคุณสามารถถอด|c|และใส่ส่วน$&ที่ถูกกล่าวถึงcได้ ทำให้สตริงค่าแฮชของคุณ (เริ่มด้วย||=""ไม่ใช่||=[]) และคุณสามารถเปลี่ยนc[...]*""เป็นc[...]
Value Ink
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.