Друк синусоїдальної хвилі (вертикально)


42

Друкуйте безперервну синусоїдальну хвилю, що прокручується вертикально на терміналі. Програма не повинна припинятися і повинна постійно прокручувати хвилю вниз (за винятком тих випадків, поки вона якось не перерветься). Ви можете припустити, що переповнення не є проблемою (тобто ви можете використовувати нескінченні петлі із збільшенням лічильників або нескінченну рекурсію).

Хвиля повинна задовольняти наступним властивостям:

  • Амплітуда = 20 знаків (пікова амплітуда)
  • Період = 60 до 65 рядків (включно)
  • Вихід повинен складатися лише з пробілів, нової лінії та |
  • Після кожного рядка виведення пауз на 50 мс

Вибірка зразка:

                    |
                      |
                        |
                          |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                       |
                     |
                   |
                 |
               |
             |
            |
          |
        |
       |
     |
    |
   |
  |
 |
 |
 |
 |
 |
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                              |
                                |
                                  |
                                   |
                                    |
                                      |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                       |
                     |
                   |
                 |
               |
             |
           |
          |
        |
       |
     |
    |
   |
  |
 |
 |
 |
 |
 |
 |
 |
  |
   |
    |
     |
       |
        |
          |
            |
             |
               |
                 |
                   |

Вищенаведений вихід повинен тривати назавжди, якщо інше не перервано, наприклад, SIGINT або SIGKILL, або закриваючи вікно терміналу, або ви вимкнете машину, або Сонце проковтне Землю тощо.

Найкоротший код виграє.

Примітка. Мені відомо про подібну проблему на дисплеї прокручувальних хвиль, але це не зовсім те саме. У моїй проблемі хвиля не прокручується «на місці» - просто виводить її на термінал. Крім того, це проблема мистецтва ascii-art, тому не використовуйте Mathematica для її побудови.


1
Пікова амплітуда, амплітуда піку до вершини або амплітуда кореневого квадрата?
DavidC

Пікова амплітуда.
ace_HongKongIndependence

1
Чи добре намалювати хвилю з просто | s та без пробілів?
Желатин

1
Усі відповіді поки недійсні. Вони також зупиняються на SIGKILL не лише для SIGINT.
Макс Рійд

1
@Max Ried штрафую, я зміню його на "має продовжуватися назавжди, якщо інше не перервано".
ace_HongKongIndependence

Відповіді:


12

APL (35)

(Так, він вписується в 35 байт, ось 1-байтове кодування APL )

{∇⍵+⌈⎕DL.05⊣⎕←'|'↑⍨-21+⌈20×1○⍵×.1}1

Пояснення:

  • {... }1: виклик функції з 1 на початку
  • 1○⍵×.1: достатньо близько для роботи уряду sin(⍵×π÷30). ( 1○є sin).
  • -21+⌈20: нормалізуються до діапазону 1..40і заперечують
  • '|'↑⍨: візьміть останні Nсимволи з рядка '|'(в результаті виходить рядок пробілів з а |в кінці
  • ⎕←: дисплей
  • ⌈⎕DL.05: зачекайте 50 мс і поверніться 1. ( ⎕DLповертає кількість часу, який він фактично чекав, який буде близько 0.05, округлення, яке дає значення 1).
  • ∇⍵+: додати це число ( 1) та запустити функцію ще раз.

2
Дарн ... Я думав, що тригонометричні функції плюс затримка часу
позбавлять

2
Ось 33 чарівні:{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
Тобіа

3
@ace LOL Слід перевірити APL, це не мова новинки. Він дуже старий і використовується у великих системах десятиліттями. Це досить унікально, порівняно з чим-небудь іншим. Символи IMHO роблять набагато зрозумілішими, що похідні лише для ASCII (J)
Tobia

22

C, 74 73 70 69 67 символів

67 символьних рішень з багатьма хорошими ідеями від @ugoren та інших:

i;main(j){main(poll(printf("%*c|\n",j=21+sin(i++*.1)*20,0),0,50));}

69 символьних рішень з циклом while замість рекурсії:

i;main(j){while(printf("%*c|\n",j=21+sin(i++*.1)*20,0))poll(0,0,50);}

Наближаючись до території Perl. :)


1
На це надихнув власний відповідь @ ace @.
треамур

2
Я думаю, ви могли б використовувати 5E4замість цього 50000.
musiphil

2
Я думаю, ви можете використовувати * .1 замість / 10.
моала

1
@musiphil, я також думав про використання 5E4, але виявляється, що це не працює: не показуючи usleep()прототип компілятора , вам доведеться явно виписати 5E4.
треамур

2
Ви можете вирізати більше двох символів, переміщаючи присвоювання J в Printf, як це: printf("%*s\n",j=21+sin(i++*.1)*20,"|"). Отриманий тип все ще є int, тому це дійсний аргумент ширини поля.
Ст

12

Математика 121 104 80 67 64

n=1;While[0<1,Spacer[70 Sin[n Pi/32]+70]~Print~"|";Pause@.05; n++]

синус


Питання говорить не використовувати математику для побудови її. це відрізняється від цього якось?
Малахій

13
@Malachi Так. Для його обчислення використовується математика, як і будь-яка інша відповідь. Використання математики для побудови графіка означало б математику для побудови x=20*sin(pi*y/30)+20чи щось подібне.
Джастін

добре, я розумію, що ви говорите дякую за роз'яснення
Малахій

1
А ось і 58 Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";Pause@.05,{n,18!}]
чарова

1
Я не користувач Mathematica, але я думаю , що ви можете змінити , 1 == 1щоб 0 < 1зменшити 1 символ.
КПК

11

Perl, 48 (68)

Версія сну GNU: 48

print$"x(25+20*sin).'|
';$_+=.1;`sleep .05`;do$0

Поперечна платформа: 68

use Time::HiRes"sleep";print$"x(25+20*sin).'|
';$_+=.1;sleep.05;do$0

Видалено використання модуля Time :: HiRes, використовуючи функцію сну оболонки. Скорочений приріст відповідно до прикладу Рубі. Скорочене використання $ "і $ 0 бачення підказки з роботи Primo. Дякую за підказки Primo.


Я зберег це як файл test.plі запустився perl ./test.pl, проте час очікування не відповідає специфікації. Також амплітуда хвилі занадто мала. (Ця амплітуда стосується довжини між піком і положенням рівноваги.)
ace_HongKongIndependence

Я думаю, якби я змінив приріст з .105 на .1, я бив рубін на 56 символів!
KevinColyer

@primo - мій сон у шкаралупі в рази коротший, ніж на 1 секунду ...
KevinColyer

man sleepunsigned int sleep(unsigned int seconds);. Він не помилиться, але фактичний інтервал сну дорівнює нулю. Деякі пропозиції, щоб скоротити ваше: змінити $dна $_, а потім використовувати (25+20*sin)та змінити на \nбуквальний новий рядок.
прим

2
@primo man 1 sleepна базі оболонки GNU / Linux повідомляє нам, щоUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
ace_HongKongIndependence

11

Perl - 64 (або 60) байт

Далі використовується команда оболонки для Windows:

`sleep/m50`,print$"x(20.5-$_*(32-abs)/12.8),'|
'for-32..31;do$0

Далі використовується команда оболонки для GNU / Linux:

`sleep .05`,print$"x(20.5-$_*(32-abs)/12.8),'|
'for-32..31;do$0

Обидва по 64 байти.

  • Період - 64.
  • Максимальна амплітуда - рівно 20.
  • Крива ідеально симетрична.
  • Кожен період однаковий.
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |

Зауважте, що це не зовсім синусоїдальна хвиля, а скоріше квадратична інтерполяція. Здійснено проти фактичного гріха:

На необхідну деталізацію вони візуально не відрізняються.

Якщо естетика не є такою важливою, я пропоную альтернативу 60 байт , довжина періоду 62, максимальна амплітуда ~ 20,02 і незначна асиметрія:

`sleep/m50`,print$"x(20-$_*(31-abs)/12),'|
'for-31..30;do$0

Це не синусоїдальна хвиля; це просто параболи (якщо я правильно прочитав ваш код). (Якщо ви можете представити це деякою синусоїдальною хвилею, я хотів би побачити цю функцію).
Джастін

Синус - це формула, якщо ти повториш формулу, це все-таки Синусоїдальна хвиля. і це, певно, варіант Sine певним чином.
Малахій

8

Рубін 56

i=0
loop{puts" "*(20*Math.sin(i+=0.1)+20)+?|;sleep 0.05}

Чи дозволяється заміна ставок на p?
Відрізаний

1
@Slicedpan Я думаю, що не стану, оскільки це завдання щось намалювати. pдодасть подвійні лапки навколо кожного рядка та змінить "малюнок".
daniero

7

Befunge 98 - 103 100

:1g:02p' \k:02gk,'|,a,$ff*:*8*kz1+:'<\`*
468:<=?ABDEFGGGHGGGFEDBA?=<:86420.,+)'&$#"!!! !!!"#$&')+,.02

Привітати програму, яка робить це, мовою без тригонометричних можливостей; фактично перша програма. Другий рядок - це просто дані; символ, відповідний значенню ascii гріха, доданий до символу пробілу.

EDIT: Я врятував 3 символи, не віднімаючи пробіл; синусоїда перекладається 32 одиниці праворуч (що є дійсним).

Befunge також не має команди сну або чогось подібного. Було б непогано знайти відбиток пальців, але я не зміг його знайти, тому ff*:*8*натискає 8*225**2( 405000) і kzзапускає петлю, що багато разів (ну, це багато разів + 1). У командному рядку Windows з pyfunge це виявляється приблизно 50 мілісекунд, тому я кажу, що я добре. Примітка: якщо хтось знає хороший відбиток для цього, будь ласка, дайте мені знати.

Остання частина коду просто перевіряє, чи лічильник (для рядка даних) минув дані, якщо він є, лічильник скидається на 0.

Я використовував це для отримання даних.


Серія Тейлора

Хоча ця версія 105 символів, я просто повинен був включити її:

:::f`!4*jf2*-:::*:*9*\:*aa*:*:01p*-01g9*/a2*+\$\f`!4*j01-*b2*+:01p' \k:01gk,$'|,a,ff*:*8*kz1+:f3*`!3*j$e-

Я намагався скоротити свою програму, і вирішив переглянути серію Тейлора для косинусу (синус важче підрахувати). Я змінив, xщоб pi * x / 30відповідати запитуваному тут періоду, а потім помножив 20на амплітуду. Я зробив деякі спрощення (коригував коефіцієнти для скасування, не сильно змінюючи значення функції). Потім я це реалізував. На жаль, це не коротша реалізація.

:f`!4*jf2*-

перевіряє, чи стають значення рядів Тейлора неточними (приблизно x = 15). Якщо вони є, то я обчислюю серію Тейлора x - 30замість x.

:::*:*9*\:*aa*:*:01p*-01g9*/a2*+

- це моя реалізація серії Taylor at x = 0, коли xце значення на стеці.

\$\f`!4*j01-* 

заперечує значення серії Тейлор, якщо серія Тейлора потребує коригування.

b2*+

зробити косинусову хвилю позитивною; інакше друк не працюватиме.

:01p' \k:01gk,$'|,a,

друкує хвилю

ff*:*8*kz1+

примусово чекають 50 мілісекунд, потім збільшуються x

:f3*`!3*j$e-

Якщо xбільше 45, змініть його на -14 (знову ж, коригування помилок серії Тейлор).


Це саме та відповідь, яку я з нетерпінням чекаю, сподіваюсь, ви зможете
пограти в

1
Там! Я успішно зменшив довжину коду на -5 символів! І ще є місце для вдосконалення!
Джастін

@Quincunx моє рішення perl також не використовує жодних вбудованих функцій триггеру;)
primo

6

Пітон, 108,93,90,89, 88

import math,time
a=0
while 1:print" "*int(20+20*math.sin(a))+"|";time.sleep(.05);a+=.1

Тепер з нескінченною прокруткою :)

Редагувати: добре, 90. Досить?

Правка: Редагувати: ні, 89.

Редагувати: Змінити: Змінити: 88 завдяки кабінці .


Вибачте, якщо я не уточнив це питання - ваша програма не повинна припинятись і повинна постійно прокручувати хвилю вниз (за винятком SIGINT)
ace_HongKongIndependence

1
a=0.-> a=0приїжджає до 88
виставка

5

PHP, 59 символів

<?for(;;usleep(5e4))echo str_pad('',22+20*sin($a+=.1)).~ƒõ;

1
Ви можете зберегти кілька байтів, використовуючи echo ...;замість fwrite(STDOUT,...);.
примо

Це має сенс при будь-якому дзвінку з командного рядка. 10 символів збережено - спасибі примо.
Алекс Барретт

1
58:<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
прим

Дуже хороша. Я не буду редагувати свою відповідь на ці зміни, ви повинні розмістити як власну.
Алекс Барретт

1
@ace це потрібно зберегти за допомогою кодування ansi. ideone автоматично перетворює все в utf-8, який ламається. ~ƒõце просто стенограма для "|\n".
прим

4

C64 BASIC, 64 символи PETSCII

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

На PAL C64 For i=0 to 2:next iциклічно триває прибл. 0,05 секунди, тому час затримки дотримується.


3

Javascript 88 76 78 символів

setInterval('console.log(Array(Math.sin(i++/10)*20+21|0).join(" ")+"|")',i=50)

На основі коду Кендалл Фрей.


Ви ніколи не ініціалізуєте i, тому він друкує пряму лінію замість хвилі.
gilly3

Моя помилка ... Це, мабуть, спрацювало, тому що я запустив сценарій Кендалла вже на своїй консолі, тому я був ініціалізований вже для мене.
joeytje50

3

C - 86 + 3 символи

Дякую Шиона і Джошу за редагування

i;main(j){for(;j++<21+sin(i*.1)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}

i; main (j) {for (j = 0; j ++ <20 + sin (i / 10.) * 20;) putchar (32); put ("|"); usleep (50000); i ++; main () ;}

float i; main (j) {for (j = 0; j ++ <20 + sin (i) * 20;) putchar (32); put ("|"); usleep (50000); i + =. 1; main ( );}

Складений з -lmпрапором, я вважаю, що мені потрібно додати 3 символи


1
Чи спрацює, якби ви зробили я int і просто поділили його на 10,0 (або 9,9, щоб зберегти знак?) Під час заклику до sin ()? i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
shiona

Ви можете зменшити розмір до 76 символів, використовуючи printf () для заміни циклу for:printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
treamur

1
Хм ... я відчував би себе справді винним, якби я використовував цю ідею у своїй відповіді, особливо коли це моє власне запитання ... Чи розглядаєте ви, як опублікувати відповідь?
ace_HongKongIndependence

Добре, зроблю. Дякую. :)
treamur

1
Ви можете збрити більше двох символів , якщо ви видалите j=0: i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}. Це спирається на припущення, що програма викликається з 0 аргументами.
Джош

3

Ti-Basic, 33 байти

While 1:Output(8,int(7sin(X)+8),"!":Disp "":π/30+X→X:End

Існують такі застереження :

  1. Через обмеження екрану 16x8 ця синусоїда має лише амплітуду 7 (період 60 продовжує зберігатися)

  2. Через відсутність простого способу доступу до |картки !використовується замість цього

  3. Через відсутність точного системного таймера затримка не реалізована. Однак швидкість запуску виявляється приблизно правильною.


1
Так, оскільки TI-BASIC рахується в одно- / двобайтових жетонах, це насправді 33 байти (а не "56 символів"), так що насправді він повинен був виграти виклик!
МІ Райт

За винятком амплітудної речі ...
lirtosiast

Ну так, але ходити по байтах це добре.
MI MI Райт

2

JavaScript - 88

setInterval(function(){console.log(Array(Math.sin(i++/10)*20+21|0).join(" ")+"|")},i=50)

Я впевнений, що хтось може придумати щось, що насправді розумно.


2

J - 103,58,57, 54

Завдяки чудовим хлопцям з IRC

(0.1&+[6!:3@]&0.05[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0

У словах справа наліво написано: починаючи з 0 нескінченних разів робити: гріх, додай 1, помножи на 20, підлогу, додай 1 (так він стає масивом з 2 елементів), скопіюй два байти '|' відповідно, роздрукуйте його, зачекайте 0,05 і додайте 0,1

Замість нескінченного циклу ми можемо використовувати рекурсію, це дозволить зберегти 2 символи, але також призведе до помилки стека після деякої кількості ітерацій

($:+&0.1[6!:3@]&0.05[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0  

Де $:рекурсивний дзвінок.


Не хотіли б додати трохи пояснень, щоб люди, незнайомі з синтаксисом J (як я), також могли зрозуміти вашу відповідь?
ace_HongKongIndependence

Можна скоротити це до 50 символів, возився зі структурою поїзда: (+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0. На цей раз версія рекурсії зберігає лише 1 знак, $:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0хоча, здається, триває довше, перш ніж знизити його.
Алгоритм

2

Хаскелл - 75

main=putStr$concat["|\n"++take(floor$20+20*sin x)(repeat ' ')|x<-[0,0.1..]]

На жаль, я не міг змусити програму призупиняти 50 мс, не подвоюючи кількість лічильників, тому вона просто затоплює консоль, але це робить синусоїду.


Ось повний код з паузами (138 символів з новими рядками):

import GHC.Conc
import Control.Monad
main=mapM_(\a->putStr a>>threadDelay 50000)(["|\n"++take(floor$20+20*sin x)(repeat ' ')|x<-[0,0.1..]])

2
Пауза була однією з вимог. Чи можете ви також розмістити код із паузою?
Джастін

Гаразд, я розмістив це. Я хочу, щоб Haskell дозволив вам призупинити код без імпорту.
Зак

Під амплітудою я маю на увазі амплітуду піку, тобто вдвічі більше амплітуди вашої поточної програми. Ви можете змінити його, 20+20*sin xа не кваліфікувати.
ace_HongKongIndependence

О, звичайно. Напевно, я неправильно трактував цю частину питання.
Зак

2

Перл 6: 46 символів

sleep .05*say ' 'x(25+20*.sin),'|'for 0,.1...*

Створіть нескінченний лінивий діапазон, використовуючи 0,0.1 ... *, петлю над цим. sayповертає число, Bool::Trueяке визначається як 1 у множенні, таким чином я можу зберегти його в одному операторі.


Я бачу, чому sleepі .05треба їх розлучати. Але мені цікаво, чи проміжок між ними sayі ' 'обов'язковий?
Маттіас

Так: s Це дає помилку "2 терміни підряд" для say' 'One можна використовувати, say(' ')але це 1 додатковий
знак

1
@Matthias: У Perl 6 листопадам або потрібно брати аргументи, мати пробіл після них або використовувати дужки. Це не мова, розроблена для кодового гольфу, на відміну від Perl 5 (але вона містить багато приємних вбудованих функцій, тому її можна використовувати).
Конрад Боровський

@xfix Дякую за пояснення. Мені подобається мова, але я ще не вивчив її ретельно, тому що досі не можу її використовувати в робочому проекті. Однак я завжди планую написати кілька сценаріїв Perl 6. @ Ayiko, я вдячний за твої Perl 6 повідомлень :-)
Маттіас

2

нечіткий Javascript - 77

i=setInterval("console.log(Array(Math.sin(i+=.1)*20+20|0).join(' ')+'|')",50)

а якщо ми це робимо у Firefox - 73

i=setInterval("console.log(' '.repeat(Math.sin(i+=.1)*20+20|0)+'|');",50)

а якщо нам неприємно - 67

i=setInterval("throw(' '.repeat(Math.sin(i+=.1)*20+20|0)+'|');",50)

1

Scala, 92,89, 87

def f(i:Int){println(" "*(20+20*math.sin(i*.1)).toInt+"|");Thread sleep 50;f(i+1)};f(1)

(20+20*math.sin(i*.1))зменшує його на 1 char, якщо припустити, що це синтаксис (у мене немає досвіду роботи зі Scala)
ace_HongKongIndependence

Дякую, але я щойно це виявив :)
ValarDohaeris

1

Пітон 3, 103

Дурний фрік-імпорт ...

import time,math
t=0
while 1:t+=(.05+t<time.clock())and(print(' '*int(20+20*math.cos(t*1.9))+'|')or.05)

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


1

C #

[152] Персонажі

namespace System{class P{static void Main(){for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}}}}

Я не міг отримати Існуючу відповідь C # на Run, і я не зміг дати голос, оскільки мені не вистачає Репутації

він був відсутній пару {і пропав )після декларації For Loop.

Я вважаю, що відхилення у зовнішньому вигляді хвилі при її запуску відбувається через те, як ми намагаємося відобразити цю хвилю.


якщо ми не рахуємо простір імен та декларацію методів, то це буде [104] символів для робочої версії

for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}

Інша відповідь C # працює на gmcs. Спочатку це не вдається компілювати, але я думаю, що це відбувається тому, що у вихідному коді є якийсь недрукувальний символ. Після повторного введення його в порожній файл, компіляція успішна.
ace_HongKongIndependence

Компілятори можуть бути вибагливими, так?
Малахій

1

VB [236] [178]

не впевнений, як ви будете рахувати вкладки, я щойно взяв підрахунок із Notepadd ++ перед тим, як тут вставити. нові рядки є обов'язковими, ймовірно, тому ніхто не любить використовувати його для коду в гольф.

Module Module1
Sub Main()
Dim i
While True
Console.WriteLine("{0:" & (40 + 20 * Math.Sin(i = i + 0.1)) & "}", "|")
Threading.Thread.Sleep(50)
End While
End Sub
End Module

1

C #

Чарівна лінія [91] Персонажі

for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);

Робоча програма нижче. [148] Персонажі

namespace System{class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Threading.Thread.Sleep(50);}}}

Вибачте, якщо я не уточнив це питання - ваша програма не повинна припинятись і повинна постійно прокручувати хвилю вниз (за винятком SIGINT). Крім того, додайте кількість символів.
ace_HongKongIndependence

Вибачте, забув про цей шматочок. Виправлено зараз.
Джон ClearZ

Я думаю, ви можете втратити "Thread.Sleep" s і змінити "float" з var :) 117 знаків. - Вибачте, я не побачив часу очікування .. 133 символів зараз. using System;class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);}}
Медені Байкал

1
Я не можу змусити його скласти у VS2010, Threading.Thread.Sleep(50)чи я щось роблю не так?
Малахій

1
Мені вдалося запустити його, але мені довелося додати кілька брекетів і напівколонок, і це виглядає не так, як кожен період
Малахій

1

Bash + bc (робити математику), 80

$ for((;;i++)){ printf "%$(bc -l<<<"a=20*s($i/10);scale=0;a/1+20")s|
";sleep .05;}
                |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                               |
                                |
                                 |
                                  |
                                   |
                                   |
                                   |
                                   |
                                   |
                                   |

1

TI-BASIC, 30 байт

Невелике поліпшення розміру порівняно з іншою відповіддю ціною певної точності. Зауважте, що TI-Basic технічно має | символу, але вам доведеться перенести його через комп'ютер або скористатися програмою складання для доступу до нього.

While 1
Output(8,int(8+7sin(Ans)),":
Disp "
.03π+Ans
End

Вуха, не бачив, скільки років це виклик! Збирався спробувати пограти більше в гольф (що, безумовно, можливо), але це дійсно не варто ...
MI Wright

До речі, .03πможе бути .1, що все-таки в межах необхідного інтервалу.
lirtosiast

Приємний улов, дякую! Чи бачите ви будь-який спосіб, як я міг би переграти команду виводу? Крім того, оскільки у мене є CSE, я міг би довести це до потрібної амплітуди (26-графічний екран) ціною кількох байт.
MI MI Райт

Ні, команда виводу виглядає чудово - занадто погано, щоб Disp потребував цитати. Насправді амплітуда повинна становити 20 знаків, що вимагає ширини екрана 39. Отже, вона працюватиме лише на екрані графіка, і немає короткого способу цього зробити.
lirtosiast

1

Юлія - ​​68 років

Редагувати: завдяки ML та тузі.

i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end

Ну, вона не може змагатися проти APL, але ось моя спроба.

Вихід:

                    |
                      |
                        |
                          |
                            |
                              |
                               |
                                 |
                                  |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                              |
                             |
                           |
                         |
                       |
                     |
                   |
                 |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
|
|
|
|
|
 |
 |
  |
   |
     |
      |
       |
         |
           |
             |
              |
                |
                  |
                    |
                      |
                        |
                          |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                 |
                                |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                 |
               |
             |
           |
         |
       |
      |
     |
   |
  |
  |
 |
|
|
|
|
|
 |
  |
  |
    |
     |
      |
        |
         |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
           |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
  |
   |
    |
     |
      |
        |
          |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                              |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                             |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
          |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
 |
 |
  |
   |
    |
     |
       |
        |
          |
            |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                      |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                      |
                                      |
                                     |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                       |
                     |
                   |

1
Я не знаю Юлю, але можна використовувати .05замість 0.05в sleep?
ace_HongKongIndependence

Насправді так! Спасибі
КПК

Скоротіть його до 68 символів : i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end——— sin(i/10)*20дорівнює20sin(.1i)
ML

Я не знаю Джулії, але ти міг би скористатися циклом, що повторює всі натуральні числа?
lirtosiast

1

MATLAB, 81 байт

t=0;while(fprintf('%s\n',i))i=[];t=t+1;i(fix(21+20*sind(t*6)))='|';pause(.05);end

Я зловживав той факт , що iзавжди ініціалізується в MATLAB, а це означало , що я міг би поставити fprintfв whileзаяві без ініціалізації iпершого. Це означає, що програма спочатку видає порожній рядок, але я думаю, що це не заборонено в специфікації.

Крім того, він зловживає тим, що Matlab ігнорує більшість керуючих символів ASCII, друкуючи пробіл замість NULL (також для першого порожнього рядка).


"Я зловживав тим, що я завжди ініціалізується в MATLAB, це означало, що я можу поставити fprintf у операторі while, не ініціалізуючи його спочатку." Дійсно розумний! +1!
Стюі Гріффін

0

F # - 90 79 77 76

Ось рішення з використанням рекурсії

let rec f x=printfn"%*c"(int(20.*sin x)+21)'|';Thread.Sleep 50;f(x+0.1)
f 0.

Можливо, це може бути вдосконалено далі.


Не знаючи нічого про F #, я припускаю, що Thread.Sleep очікує значення в мс, тому ви можете позбутися одного з 0 і зробити Thread.Sleep 50. :)
ValarDohaeris

@ValarDohaeris Ти маєш рацію. Я неправильно прочитав вимоги.
pswg

0

AutoHotkey 176

SetKeyDelay,-1
run Notepad.exe
WinWaitActive, ahk_class Notepad
p:=0
loop
{
sleep 50
p+=Mod(Floor(A_index/40),2)?-1:1,t:=""
loop % p
t .= " "
sendinput % t "|`n"
}
esc::Exitapp

Запустіть сценарій. Він відкриває Блокнот і друкує символи. Натисніть Esc будь-коли, щоб вийти.


0

Clojure, 121

Коротка версія:

(loop[a 0](println(clojure.string/join(repeat(int(+ 20 (* 20 (Math/sin a)))) " ")) \|)(Thread/sleep 50)(recur(+ a 0.1)))

Гарна версія:

(loop [a 0]
  (println (clojure.string/join (repeat (int (+ 20 (* 20 (Math/sin a)))) " ")) \|)    
  (Thread/sleep 50)
  (recur(+ a 0.1)))

Період - 64.

Введіть це lein replу файл чи збережіть його sin.cljта запустіть із ним lein exec sin.clj(потрібен плагін lein-exec).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.