Нормальні речення


16

Напишіть програму або функцію, яка, даючи вхідний рядок і стандартне відхилення σ, виводить цей рядок по звичайній кривій розподілу із середнім 0і стандартним відхиленням σ.

Крива нормального розподілу

yКоордината кожного символу cє:

введіть тут опис зображення

де σдаються в якості вхідних даних, і де xце xвісь координати c.

  • Символ у центрі рядка має 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 рядків: центральний символ друкується на рядку, 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
Я думаю, що в останньому тестовому випадку у верхньому рядку має бути 3 крапки, а не 1.
Аддісон

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

Величезна подяка Кевіну Лау за економію 18 байт!


1
Лямбди не потребують паронів: ->n,s{...це добре. Вам не потрібні дужки при призначенні декількох змінних: o,g,r,l=[],0,{}працює чудово. $/можна використовувати замість ?\n. Порядок операцій означає, що вам не доведеться ставити всі свої множення на рядок 5 в парен. putsавтоматично розгортає масиви та відокремлює їх новими рядками під час друку. n.gsub(/./){...вибиває n.each_char{...трохи, тому що ви можете вийняти |c|і поставити $&там, де була будь-яка згадка c. Створіть рядки хеш-значень (почніть з ||=""не ||=[]) і можете змінити c[...]*""значенняc[...]
Ink Value Ink
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.