Распечатать синусоидальную волну (по вертикали)


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
Вот 33 символа один:{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
Tobia

3
@ace LOL. Вы должны проверить APL, это не новинка. Он очень старый и использовался в больших системах десятилетиями. Это довольно уникальный, по сравнению с чем-либо еще. ИМХО символы делают его намного более читабельным, чем производные только для 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.
Treamur

2
Я думаю, что вы могли бы использовать 5E4вместо 50000.
Musiphil

2
Я думаю, что вы могли бы использовать * .1 вместо / 10.
Моала

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

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

12

Mathematica 121 104 80 67 64

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

синус


Вопрос говорит не использовать Mathematica для ее построения. это как-то отличается от этого?
Малахия

13
@ Малачи Да. Для этого используется mathematica, как и любой другой ответ. Использование mathematica для построения графика будет означать использование Mathematica для построения графика 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 с помощью функции сна сна. Сокращенный прирост по примеру Ruby. Сокращены с помощью $ "и $ 0, видя подсказки от работы Primo. Спасибо за подсказки Primo.


Я сохранил это как файл test.plи запустил perl ./test.pl, однако время ожидания не соответствует спецификации. Также амплитуда волны слишком мала. (Эта амплитуда относится к длине между пиком и положением равновесия.)
ace_HongKongIndependence

Я думаю, если бы я изменил приращение с .105 до 0,1, я бы побил рубин на 56 символов!
KevinColyer

@primo - мой сон сна делает время короче, чем 1 секунда ...
KevinColyer

man sleepunsigned int sleep(unsigned int seconds);. Это не будет ошибкой, но фактический интервал сна равен нулю. Некоторые предложения , чтобы сделать ваше короче: изменение $dв $_, а затем использовать (25+20*sin), и изменить \nдля буквального перевода строки.
Прим

2
@primo в оболочке man 1 sleepGNU / Linux bash говорит нам, что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

Это не синусоидальная волна; это просто параболы (если я правильно прочитал ваш код). (Если вы можете представить это с помощью некоторой синусоидальной волны, я бы хотел увидеть функцию).
Джастин

Синус - это формула, если вы повторяете формулу, это все еще синусоидальная волна. и это, вероятно, вариант Синуса в некотором роде.
Малахи

8

Руби 56

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

Допускается ли замена пут на p?
Slicedpan

1
@Slicedpan Я думаю, что не буду, так как это задача что-то нарисовать. pдобавит двойные кавычки вокруг каждой строки и изменит «рисунок».
Даньеро

7

Befunge 98 - 103 100

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

Приветствует программу, которая делает это на языке без тригонометрических возможностей; первая программа на самом деле. Вторая строка - просто данные; символ, соответствующий значению греха ascii, добавлен к пробелу.

РЕДАКТИРОВАТЬ: я спас 3 символа, не вычитая пространство; синусоида переводится на 32 единицы вправо (что действительно).

У Befunge также нет команды сна или чего-то подобного. Было бы неплохо найти отпечаток пальца, но я не смог его найти, поэтому ff*:*8*нажимает 8*225**2( 405000) и kzзапускает noop много раз (ну, это много раз + 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*+

моя реализация ряда Тейлора в 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

Python, 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 благодаря Boothby .


Извините, если я не прояснил вопрос - ваша программа не должна завершаться и должна непрерывно прокручиваться вниз по волне (кроме как до SIGINT)
ace_HongKongIndependence

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

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));
primo

Очень хорошо. Я не буду редактировать свой ответ с этими изменениями, вы должны публиковать как свои собственные.
Алекс Барретт

1
@ace это должно быть сохранено с кодировкой ANSI. ideone автоматически конвертирует все в utf-8, что ломается. ~ƒõэто просто сокращение для "|\n".
primo

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);}

я; основная (к) {для (J = 0; j ++ <20 + sin (I / 10) * 20;.) putchar (32); ставит ( "|"); USleep (50000); я ++; главное () ;}

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

Скомпилированный с -lmфлагом, я предполагаю, что мне нужно добавить 3 символа


1
Будет ли это работать, если вы сделаете i 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();}
Шион

Вы можете уменьшить размер до 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

Ну да, но с байтами это нормально.
МИ Райт

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 бесконечно делайте: sin, добавьте 1, умножьте на 20, floor, добавьте 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

Perl 6: 46 символов

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

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


Я понимаю, почему sleepи .05должны быть отделены. Но мне интересно, если пространство между sayи ' 'является обязательным?
Матиас

Да: s Это дает ошибку «2 слагаемых подряд» для say' 'One, которую можно использовать, say(' ')но в этом случае это на 1 символ больше ...
Ayiko

1
@Matthias: в Perl 6 listops либо не принимают аргументы, либо пробел после них, либо используют круглые скобки. Это не язык, разработанный для кода гольфа, в отличие от Perl 5 (но он содержит много хороших встроенных функций, поэтому его можно использовать).
Конрад Боровски

@xfix Спасибо за объяснение. Мне нравится язык, но я еще не изучил его полностью, потому что я все еще не могу использовать его в рабочем проекте. Тем не менее, я всегда планирую написать несколько скриптов на Perl 6. @ Ayiko, я ценю твои сообщения на Perl 6 :-)
Matthias

2

fugly 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 символ, предполагая, что это правильный синтаксис (у меня нет опыта работы со 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 #» на «Выполнить» и не смог понизить голос, потому что у меня недостаточно репутации

он пропустил пару {и пропустил )после декларации 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

Извините, забыл об этом. Исправлено сейчас.
John ClearZ

Я думаю, что вы можете потерять "Thread.Sleep" и изменить "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

Вау, не видел сколько лет этому испытанию! Я собирался попробовать это больше в гольф (что, безусловно, возможно), но это действительно того не стоит ...
М.И. Райт

Кстати, .03πможет быть .1, что еще в пределах необходимого интервала.
lirtosiast

Хороший улов, спасибо! Ты видишь, как я мог бы сыграть в команду на выход? Кроме того, так как у меня есть CSE, я мог бы получить это к правильной амплитуде (экран с 26 символами) за счет нескольких байтов.
МИ Райт

Нет, команда вывода выглядит нормально - очень плохо, что 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

На самом деле да! Спасибо
CCP

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

Я не знаю Джулию, но не могли бы вы использовать цикл for для всех натуральных чисел?
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.