Синусоидальный текст


30

Цель: написать программу или функцию, которая печатает входную строку в форме синусоиды.

Синусоида ASCII

Вот один период синусоиды:

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

Обратите внимание, что в каждом столбце есть ровно одна точка.

  • Каждый символ во входной строке заменит точку в форме выше, слева направо.
  • Пробелы во входных данных должны выводиться как обычные символы вместо точки.
  • Начальный символ соответствует крайней левой точке на рисунке выше.
  • Это только один период, входные данные могут быть длиннее, чем количество точек выше.

вход

  • Входные данные - это строки ASCII, которые содержат только символы между десятичным ASCII 32 (пробел) и десятичным ASCII 126 (тильда ~).
  • Входные данные всегда будут только одной строкой (без разрывов строки).
  • Входные данные могут быть получены через STDIN, параметры функции, аргументы командной строки или что-либо подобное.

Выход

  • Вывод должен быть напечатан точно так же, как в тестовых случаях.
  • Конечные пробелы в строках допускаются, если длина строки с этими конечными пробелами не превышает длину самой длинной строки (той, в которой указан последний символ).
  • Не допускается ведущая / ведомая линия.

Контрольные примеры

  • Входные данные: .................................................

Выход:

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         
  • Входные данные: Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Выход:

         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   
  • Входные данные: Short text.

Выход:

         t.
      tex  
    t      
   r       
  o        
 h         
S          
  • Входные данные: The quick brown fox jumps over the lazy dog

Выход:

          brown                            
      ick       fox                        
    qu              j                      
                     u                     
  e                   m                    
 h                     p                   
T                       s                  

                          o                
                           v               
                            er             
                               th       dog
                                 e lazy    

счет

Это , поэтому выигрывает самая короткая программа или функция в байтах.


Это то, о чем я думал
Beta Decay

О, я вижу, это действительно несколько похоже.
Фатализировать

Кстати, ваша волна не совсем синусоидальная. (Естественно, я пытался использовать sinфункцию, чтобы воспроизвести ее, но позиции немного отклонились.)
Дэвид З,

@DavidZ Меня это не удивляет, я положил глаз на форму ASCII. Можете ли вы получить что-то синусоидальное без какого-либо «пробела» в столбцах (то есть ровно одна точка на столбце)?
Фатализировать

4
Я потратил пару минут на то, чтобы развлечь себя, перемещая полосу прокрутки на выходе тестового примера 2 вперед и назад очень быстро.
mbomb007

Ответы:


7

Pyth, 59 байтов (57 символов)

Xjb.sC.>V+R*12\ Xz\ C9*+-L12K+JsM._+6jC\཈2tP_JKlz]*dlzC9d

Демонстрация.

Внутри закодирована двоичная таблица поиска , которая имеет значение 3912. Она преобразуется в двоичную, давая [1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]. Это рассматривается как разница между последовательными высотами. Путем добавления 6, формирования всех префиксов и сопоставления каждого с его суммой генерируется первая четверть волны.

sM._+6jC\཈2оценивается [6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]как описано выше. Затем код объединяется на обратной стороне этой строки, образуя первую половину волны, а затем вычитает ее из 12, чтобы получить всю волну.

Затем мы формируем строки каждого входного символа, за которым следуют 12 пробелов. Эта линия поворачивается вправо с помощью параметра высоты волны, соответствующего этому местоположению, а затем линии транспонируются и соединяются на новых строках.

Затем мы убираем начальные и конечные пустые строки. Однако мы не можем убрать начальные или конечные пустые строки, в которых есть пробелы от ввода. Это реализуется путем замены пробелов во входных данных на tabs ( C9), которые не могут быть во входных данных, удаления пустых строк и превращения вкладок обратно в пробелы.


@FryAmTheEggman Исправлено, стоимостью 16 байт.
Исаак

12

Python 2, 156 байт

l=map(int,"654322111%08d1122345"%1);l+=[12-c for c in l]
def f(t):
 h=len(t);o=bytearray(' '*h+'\n')*13;i=0
 for c in t:o[i-~h*l[i%48]]=c;i+=1
 print o[:-1]

объяснение

  • Весь код просто создает блок пробелов ( o) и заменяет нужные пробелы буквами ввода t.

  • Переменная lхранит список смещений сверху. Так что nсимвол tдолжен быть на линии l[n].

  • Bytearray oслужит изменяемой строкой, так как строки являются неизменяемыми в python.

  • -~hто же самое, h+1но экономит место, потому что мне не нужны скобки.


7

Ява, 219 209 199 байт

void p(char[]s){int r=6,c;String t="";for(;r>-7;r--,t+='\n')for(c=0;c<s.length;c++)t+=(s(c%48)==r?s[c]:' ');System.out.println(t);}int s(int a){return a<4?a:a<6?4:a<9?5:a<15?6:a<24?s(24-a):-s(a-24);}

Я все еще новичок здесь, и надеюсь, что это соответствует правилам для введения подфункции (когда подсчитываются байты этой функции, конечно). Если нет, я постараюсь преобразовать sinфункцию в какой-нибудь умный поиск в массиве ...

public class SinusText
{
    public static void main(String[] args)
    {
        SinusText s = new SinusText();
        s.p(".................................................".toCharArray());
        s.p("Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.".toCharArray());
        s.p("Short text.".toCharArray());
        s.p("The quick brown fox jumps over the lazy dog".toCharArray());
    }
    void p(char[]s){int r=6,c;String t="";for(;r>-7;r--,t+='\n')for(c=0;c<s.length;c++)t+=(s(c%48)==r?s[c]:' ');System.out.println(t);}int s(int a){return a<4?a:a<6?4:a<9?5:a<15?6:a<24?s(24-a):-s(a-24);}
}

1
Для некоторых задач на основе строк это также экономит, если вы принимаете ввод как char[]. Здесь было бы избавиться от ()на lengthи ликвидации , charAt()а также. Если я правильно читаю, вы также можете использовать print()вместо того, println()чтобы сохранить еще пару.
Geobits

@Geobits Это те степени свободы, о которых я не знал. Описание задачи говорит о «String», поэтому я подумал, что это должно быть «THE» строковое представление соответствующего языка. ...
Marco13

Да, я спрашивал об этом в мета некоторое время назад. Вот ссылка для справки: meta.codegolf.stackexchange.com/q/2214/14215
Geobits

Спасибо, тогда 209 (Может быть, я постараюсь выжать еще несколько байтов позже. Функция «sin» все еще выглядит слишком многословно ...)
Marco13

1
Хм, не большое улучшение, но вы можете сократить 10, выполнив модуль 48 целиком. Измените конец на ...a<24?s(24-a):-s(a-24);и назовите его s(c%48).
Geobits

4

Perl, 222 байта

$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n

Требуется -Eдля say, сохраняет позиции как целые числа, приведенные к двоичным числам, и переворачивание массива, вероятно, не очень эффективно в байтовом выражении. Кроме того, я уверен, что есть много способов сэкономить, поэтому я буду продолжать тыкать и подталкивать.

Пример вывода:

$perl -E '$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n' <<< '.................................................'
         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         

$perl -E '$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n' <<< 'Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It'\''s 100% free, no registration required.'
         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   

3

JavaScript, 251 243 224 220 217

Реально простая реализация: он использует строку символов для представления y-позиции каждого символа в волне (смещение a, которое является кодом ASCII 97). Затем он перебирает все возможные строки; если значение y текущей строки совпадает с положением y на волне, он записывает символ из строки. В конце также есть очистка для удаления строки, если она оказалась совершенно пустой.

Обратите внимание, что вывод будет отображаться некорректно в alert()окне, если он не использует моноширинный шрифт, вы можете изменить его, console.log()чтобы убедиться, что вывод верен.

s=prompt(o=[])
for(y=i=0;y<13;++y){o[i]=""
for(x=0;x<s.length;++x)o[i]+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
if(o[i++].trim().length<1)o.splice(--i,1)}
alert(o.join("\n"))

EDIT1: ++и --существует.

EDIT2: удаление пустых строк теперь выполняется в том же цикле, что и остальные, сохраняя 17 символов. Эти скобки тоже не нужны, для дополнительных 2 символов.

EDIT3: не нужно объявлять форму сигнала как переменную, сохраняя 4 символа.

РЕДАКТИРОВАТЬ 4: Как отметил Dom Hastings в комментариях, количество байтов включало возврат каретки, а также символ новой строки, обновлял количество байтов для всех ревизий, чтобы исключить возврат каретки.

РЕДАКТИРОВАТЬ5: Сохранено 3 байта любезно предоставлено Dom Hastings. Я не реализовал это o.spliceисправление, так как при этом не удаляются пустые строки (по крайней мере, с моей стороны).


1
Хорошо сделано! В нескольких местах вы можете сохранить еще пару байтов: Заменить: if(o[i++].trim().length<1)o.splice(--i,1)на o.splice(i-(t=!o[i++].match(/\s/)),t), для -4, s=prompt() o=[]на:, s=prompt(o=[])-1 и for(y=0,i=0;y<13;++y){o[i]=""на for(y=i=0;y<13;++y){o[i]="", -2. Вероятно, возможно объединить ваши циклы for, чтобы сэкономить больше ... И последнее. Стоит также отметить, что у меня есть только 220 для вашего текущего количества байтов, так что ваши 225 могут быть окнами, \r\nа не только тем, \nкоторый я могу игнорировать. (пожалуйста, поправьте меня, если я ошибаюсь) ...
Дом Гастингс

Хороший улов на возврат каретки! В следующий раз я не буду так сильно доверять Notepad ++ :)
Шон Лэтэм

Я думаю, что он уменьшен до 166. Может ли кто-нибудь еще проверить? Я изменил поведение массива на журнал во всей программе. Я использовал короткое замыкание вместо оператора if и избавился от скобок, поместив журнал в конце первого цикла for. for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
Вартан

используя ложный ноль для замены == вычитанием, 165 символов for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Вартан

У меня проблемы с вставкой из моего комментария, поэтому вот пастин bit.ly/1VQgGXw 217-> 166 = 76%
Вартан

3

Matlab, 133 , 130 байт

Один лайнер:

s=input('');y=ceil(5.6*sin(0:pi/24:pi-.1).^.9);l=[-y y]+7;n=numel(s);t=repmat(' ',13,n);for k=1:n;t(l(mod(k-1,48)+1),k)=s(k);end;t

И расширенная версия:

function f(s)
    y=ceil(5.6*sin(0:pi/24:pi-.1).^.9);l=[-y y]+7;  %// calculate the line number for each column position
    n=numel(s);                                     %// number of character in input
    t=repmat(' ',13,n);                             %// Create a blank canvas of whitespace characters
    for k=1:n
        t(l(mod(k-1,48)+1),k)=s(k);                 %// place each input character where it should be
    end
    t                                               %// force the output display

Один вкладыш принимает данные из консоли ( stdin) и составляет 130 байтов. Расширенная версия заменяет ввод консоли определением функции (+1 байт), но ее гораздо удобнее использовать для теста в цикле:


Описание:

Индекс строки каждого символа рассчитывается на половину периода, затем отражается и объединяется для получения полного периода.
Мы создаем пустой фон символа пробела (той же длины, что и входная строка. Мы помещаем каждый символ в соответствии с его положением в соответствующей строке. Если длина входной строки превышает один период, modоператор (по модулю) переносит это, поэтому мы не t выйти за границы при запросе номера строки.


Прецедент:

Сохраните версию функции под textsine.mвашим путем, затем запустите:

s = {'.................................................';...
    'Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It''s 100% free, no registration required.';...
    'Short text.';...
    'The quick brown fox jumps over the lazy dog'};

for txtcase=1:4
    textsine(s{txtcase,1})
end

будет выводить:

t =

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


t =

         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   


t =

         t.
      tex  
    t      
   r       
  o        
 h         
S          








t =

          brown                            
      ick       fox                        
    qu              j                      
                     u                     
  e                   m                    
 h                     p                   
T                       s                  

                          o                
                           v               
                            er             
                               th       dog
                                 e lazy    

если вы хотите , чтобы проверить версию один лайнер с участием stdin, ваш вход должен быть введен как один сингл string, так что вы должны были бы вложить свой вклад между 'символами. Пример:

'Short text.'   %//   valid input
Short text.     %// INVALID input

Спасибо, Luis Mendoчто побрили 3 байта ;-)


@LuisMendo, спасибо за 3 сохраненных байта :-). Я объяснил, как ввести правильную строку, чтобы простой s=input('');все равно работал.
Хоки

2

Scala 377 символов

первый срез вероятно, можно получить лучшую формулу для перевода xнаy

(s:String)⇒s.zipWithIndex.map(t⇒(t._1,t._2,t._2%48 match{
case i if i<5⇒6-i
case 5|19⇒2
case 6|7|8|16|17|18⇒1
case i if i<16⇒0
case i if i<29⇒i%20+2
case 29|43⇒10
case 30|31|32|40|41|42⇒11
case i if i<40⇒12
case i if i>43⇒10-i%44
})).groupBy(_._3).toSeq.map{case(y,xs)⇒(""→0/:xs.sortBy(_._2)){case((p,l),(c,x,_))⇒(p+" "*(x-l-1)+c)→x}._1→y}.sortBy(_._2).map(_._1).mkString("\n")

1

Common Lisp, 205 байт

(lambda(s &aux p v o)(dotimes(r 13)(setf o 0 p v v(round(*(/ 24 pi)(+(asin(-(/ r 6)1))pi))))(when p(map()(lambda(c)(princ(if(some(lambda(k)(<= p(mod k 48)(1- v)))`(,o,(- 23 o)))c" "))(incf o))s)(terpri))))

тесты

Смотрите http://pastebin.com/raw.php?i=zZ520FTU

замечания

Выведите вывод построчно, вычисляя индексы в строках, которые должны быть напечатаны, используя функцию обратного синуса asin. Выходные данные не полностью соответствуют ожидаемым входным данным в вопросе, но, поскольку OP признает, что выходные данные примера не являются истинными синусами, я думаю, это нормально. По крайней мере, для каждого столбца всегда записывается только один символ.


1

Python 2, 172 байта

Это не так хорошо, как ответ Алекса Л. , но это довольно близко. Принимает данные из стандартного ввода и лучше всего работает в .pyфайле.

l=map(int,bin(9960000)[2:]);l+=[-c for c in l];s=6;o=[];i=9
for c in raw_input():b=[' ']*13;b[s]=c;o+=[b];s+=l[i%48];i+=1
print''.join(sum(zip(*o+['\n'*13])[::-1],())[:-1])

Я решил построить результат транспонирования (каждый столбец является строкой), а затем транспонировать результат, так как в Python транспонирование матрицы map(*m).

  • l: Бинарное представление 9960000(после отключения "0b"от bin) - 100101111111101001000000. Это «шаг» синусоидальной волны каждого столбца, начиная с самого последнего символа самой нижней точки. Я копирую этот список, отменяю каждое число и прикрепляю его к концу, чтобы сформировать то, что фактически является производной функции.
  • s: Это переменная, которая отслеживает, в какую строку (столбец в транспонировании) вставляется следующий символ.
  • o: Конечный вывод, транспонированный
  • i: Отслеживает период синусоиды. Начинается с 9, так lкак немного сдвинут.

В forцикле я создаю список из 13 пробелов (я использовал байт-массивы, но в списках символов оказывается более короткое выражение для печати), а затем заменяю этот sсимвол входным символом. Добавить bв конец o, добавить соответствующий шаг sи увеличить i.

Я надеялся, что это printзаявление будет таким же простым \n'.join(*zip(o)), но не повезло. zip(*o+['\n'*13])[::-1]добавляет столбец новых строк, а затем переворачивает и транспонирует все это (без реверса, синусоида переворачивается вверх ногами), sum(...,())объединяет кортежи в один кортеж символов, а затем ''.join(...)объединяет символы и печатает его.

Другими вещами, которые я пробовал, было создание массива из 12 символов и вставка нового символа в соответствующее место, а также замена l+=[-c for c in l];какой-то математикой с неким умножением 1и -1результатом индексации l, но я ничего не мог придумать в конечном итоге был короче.


0

Mathematica, 131 байт

i=[input string];c=Characters@i;l=Length@c;StringJoin@Riffle[StringJoin@@@SparseArray[Table[{7-Round[6 Sin[.13(x-1)]],x},{x,l}]->c,{13,l}," "],"\n"]

Это 131 символов, включая три для i=foo;. Это казалось разумным способом принять участие; Я мог бы положить это прямо в определение cи сохранить несколько штрихов, но это кажется несправедливым.

Это довольно просто - почти даже читабельно. Он разбивает строку на список символов, а затем помещает эти символы в разреженный массив в позициях, определенных из Table(любая точка в массиве, для которой не задан символ, по умолчанию является пробелом). Строки собираются отдельно, а между ними появляются новые строки. Последний StringJoin сшивает все это.

NB: Как и некоторые другие решения, это может на самом деле не быть действительным, потому что это дает настоящую синусоиду, а не (красивый) пример ручной работы.

тесты:

(*i=Programming Puzzles...*)
         ng Puzz                                          on and                                          iasts                                           tration          
       mi       le                                     sti       a                                      us      and                                     is        r        
     am           s                                   e           ns                                  th            c                                 eg           eq      
    r               &                               qu              we                              en               o                               r               u     
  og                  C                                               r                                               d                            o                  ir   
 r                     o                          a                                               e                    e                          n                     e  
P                       d                       s                       si                       l                       g                                               d 
                         e                     i                          t                    zz                         o                     ,                         .
                           G                                               e                  u                            lf                 ee                           
                            o               ge                               f               p                               e               r                             
                             lf           an                                  or           g                                  rs            f                              
                                St      ch                                       p      min                                     .        0%                                
                                  ack Ex                                          rogram                                          It's 10                                  
(*i=.... ...*)
         .......                                 
       ..       ..                               
     ..           ..                             
    .               .                            
  ..                 ..                          
 .                     .                         
.                       .                       .
                         ..                    . 
                           .                  .  
                            .               ..   
                             ..           ..     
                               ...      ..       
                                  ......         
(*i= Short text.*)
         t.
       ex  
      t    
    t      
  or       
 h         
S          





(*i=The quick...*)              
          brown                            
       ck       fo                         
     ui           x                        
    q               j                      
  e                  um                    
 h                     p                   
T                       s                  
                          o                
                           v               
                            e              
                             r            g
                               the      do 
                                   lazy    
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.