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


30

Мета: Написати програму або функцію, яка друкує вхідний рядок у синусоїдальній формі.

Синусоїда ASCII

Ось один період синусоїди:

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

Зауважте, що на кожному стовпчику є рівно одна крапка.

  • Кожен символ у рядок введення замінить крапку у формі зверху, зліва направо.
  • Пробіли на вході повинні бути виведені, як звичайні символи, замість крапки.
  • Початковий символ відповідає самій лівій крапці на малюнку вище.
  • Це лише один період, введення може бути довше, ніж кількість крапок вище.

Вхідні дані

  • Вхідні дані - це рядки ASCII, які містять лише символи між ASCII десятковим 32 (пробіл) і ASCII десятковим 126 (Tilde ~).
  • Введення завжди буде лише одним рядком (відсутність розривів рядків).
  • Входи можна приймати за допомогою 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    

Оцінка балів

Це , тому виграє найкоротша програма або функція в байтах.


Це те, про що я думав
бета-розпад

О, я бачу, це дійсно дещо схоже.
Фаталізувати

До речі, ваша хвиля не зовсім синусоїдальна. (Природно, я спробував використовувати sinфункцію, щоб відтворити її, але позиції трохи відключені.)
David Z

@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 пробілів. Ця лінія повертається праворуч за параметром висоти хвилі, відповідним цьому розташуванню, а потім лінії переміщуються та з'єднуються на нових лініях.

Потім ми знімаємо провідні та відмінні пусті рядки. Однак ми не можемо відкреслити провідні чи відмінні порожні рядки, у яких є пробіли від введення. Це реалізується шляхом заміни пробілів на вході на вкладки ( C9), які не можуть бути у вході, знімаючи порожні рядки та повертаючи вкладки назад у пробіли.


@FryAmTheEggman Fixed, ціною 16 байт.
isaacg

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

  • Байт-масив oслужить змінною струною, оскільки рядки незмінні в пітоні.

  • -~hце те саме, h+1але економить місце, тому що мені не потрібні дужки.


7

Java, 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 Це ті ступені свободи, про які я не знав. Опис завдання говорить про "String", тому я подумав, що це повинно бути "THE" String-репрезентацією відповідної мови. ...
Marco13

Так, я запитав про це на мета деякий час назад. Ось посилання для довідки: meta.codegolf.stackexchange.com/q/2214/14215
Geobits

Дякую, це 209 тоді. (Можливо, я спробую пізніше витіснити ще кілька байт. Функція "гріх" все ще виглядає занадто багатослівною ...)
Marco13

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

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 символи.

EDIT4: Як в коментарях зазначив Дом Гастінгс, кількість байтів включала повернення каретки, а також символ нового рядка, оновила кількість байтів для всіх ревізій, щоб виключити повернення вагона.

EDIT5: Збережено 3 байти з люб’язності Дому Гастінгса. Я не застосував 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. Можливо, можливо також комбінувати свої петлі, щоб заощадити більше ... Останнє, варто також відзначити, що у мене є лише 220 для вашого поточного рахунку байтів, тому ваші 225 можуть бути вікнами \r\nзамість того, \nякі я припускаю, що ви можете ігнорувати. (будь ласка, виправте мене, якщо я помиляюся) ...
Дом Гастінгс

Гарний вилов на повернення вагона! Наступного разу я не буду дуже довіряти Блокноту ++ :)
Шон Латхем,

Я думаю, що я скоротив її до 166. Чи може хтось ще перевірити? Я змінив поведінку масиву на журнал у всій програмі. Я використав коротке замикання замість оператора if, і позбувся дужок, поставивши журнал в кінці першого для циклу. 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

Матлаб, 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

Лист звичайний, 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. Вихідні дані не відповідають точно очікуваним вхідним запитанням, але оскільки ОП визнає, що приклади виходів не є справжніми синусом, я думаю, це нормально. Принаймні, для кожного стовпця завжди пишеться лише один символ.


1

Пітон 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 пробілів (я використовував bytearrays, але у списків символів виявляється коротший оператор друку), а потім замінюю sth символ на вхідний символ. Додайте 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

Математика, 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.