Нормальные предложения


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

@addison У меня нет эталонной реализации на этом компьютере, но я не знаю, почему у Mego get другой результат. Результат, который он получает с помощью своего кода, кажется очень «блочным». Игнорируйте этот контрольный пример на данный момент, я думаю.
Фатализировать

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было. Создайте строки хеш-значений (начните с ||=""not ||=[]), и вы можете изменить их c[...]*""наc[...]
Value Ink
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.