Напечатайте непрерывную синусоидальную волну, прокручивая вертикально на терминале. Программа не должна завершаться и должна непрерывно прокручивать волну вниз (кроме случаев, когда она каким-то образом прерывается). Вы можете предположить, что переполнение не является проблемой (то есть вы можете использовать бесконечные циклы с увеличивающимися счетчиками или бесконечную рекурсию).
Волна должна удовлетворять следующим свойствам:
- Амплитуда = 20 символов (пиковая амплитуда)
- Период = от 60 до 65 строк (включительно)
- Вывод должен состоять только из пробелов, новой строки и
|
- После каждой строки вывода, пауза на 50 мс
Пример вывода:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Приведенный выше вывод должен продолжаться вечно, если не прервано иным образом, например, SIGINT или SIGKILL, или закрытие окна терминала, или вы выключаете свою машину, или Солнце проглатывает Землю и т. Д.
Самый короткий код выигрывает.
Заметка. Я знаю о подобной проблеме на волнах прокрутки дисплея, но это не совсем то же самое. В моей проблеме волну не нужно прокручивать "на месте" - просто выведите ее на терминал. Кроме того, это проблема ascii-art, поэтому не используйте Mathematica для ее построения.
источник
Ответы:
APL (35)
(Да, он умещается в 35 байтов, вот 1-байтовая кодировка APL )
Объяснение:
{
...}
1: вызвать функцию с 1 в начале1○⍵×.1
: достаточно близко для работы правительстваsin(⍵×π÷30)
. (1○
естьsin
).-21+⌈20
: нормализуйте до диапазона1..40
и отрицайте'|'↑⍨
: взять последниеN
символы из строки'|'
(что приводит к строке пробелов с символом|
в конце⎕←
: дисплей⌈⎕DL.05
: подождите 50 мс и вернитесь1
. (⎕DL
возвращает количество времени, которое оно фактически ожидало, которое должно быть близко0.05
, округляя это значение, дает1
).∇⍵+
: добавьте это число (1
)⍵
и снова запустите функцию.источник
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
C,
7473706967 персонажей67-символьное решение со множеством хороших идей от @ugoren и других:
Решение из 69 символов с циклом while вместо рекурсии:
Приближается к территории Perl. :)
источник
5E4
вместо50000
.usleep()
прототипа компилятора , вам придется явно привести 5E4.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. Полученный тип по-прежнему int, поэтому он является допустимым аргументом ширины поля.Mathematica
121 104 80 6764источник
x=20*sin(pi*y/30)+20
или чего-то подобного.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";Pause@.05,{n,18!}]
1 == 1
чтобы0 < 1
уменьшить 1 символ.Perl, 48 (68)
Спящая версия GNU: 48
Кроссплатформенность: 68
Удалено использование модуля Time :: HiRes с помощью функции сна сна. Сокращенный прирост по примеру Ruby. Сокращены с помощью $ "и $ 0, видя подсказки от работы Primo. Спасибо за подсказки Primo.
источник
test.pl
и запустилperl ./test.pl
, однако время ожидания не соответствует спецификации. Также амплитуда волны слишком мала. (Эта амплитуда относится к длине между пиком и положением равновесия.)man sleep
→unsigned int sleep(unsigned int seconds);
. Это не будет ошибкой, но фактический интервал сна равен нулю. Некоторые предложения , чтобы сделать ваше короче: изменение$d
в$_
, а затем использовать(25+20*sin)
, и изменить\n
для буквального перевода строки.man 1 sleep
GNU / Linux bash говорит нам, чтоUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (или 60) байта
Далее используется специфичная для Windows команда оболочки:
Следующее использует GNU / Linux-специфическую команду оболочки:
Оба на 64 байта.
Обратите внимание, что это не синусоидальная волна, а квадратичная интерполяция. Заговор против фактического греха:
При требуемой детализации они визуально неразличимы.
Если эстетика не так важна, я предлагаю 60-байтовую альтернативу с длиной периода 62, максимальной амплитудой ~ 20,02 и небольшой асимметрией:
источник
Руби 56
источник
p
добавит двойные кавычки вокруг каждой строки и изменит «рисунок».Befunge 98 -
103100Приветствует программу, которая делает это на языке без тригонометрических возможностей; первая программа на самом деле. Вторая строка - просто данные; символ, соответствующий значению греха ascii, добавлен к пробелу.
РЕДАКТИРОВАТЬ: я спас 3 символа, не вычитая пространство; синусоида переводится на 32 единицы вправо (что действительно).
У Befunge также нет команды сна или чего-то подобного. Было бы неплохо найти отпечаток пальца, но я не смог его найти, поэтому
ff*:*8*
нажимает8*225**2
(405000
) иkz
запускает noop много раз (ну, это много раз + 1). В командной строке Windows с pyfunge это составляет около 50 миллисекунд, так что я говорю, что я в порядке. Примечание: если кто-то знает хороший отпечаток для этого, пожалуйста, дайте мне знать.Последняя часть кода просто проверяет, прошел ли счетчик (для строки данных) данные, если это так, то счетчик сбрасывается в 0.
Я использовал это для генерации данных.
Серия Тейлор
Хотя эта версия составляет 105 символов, я просто должен был включить ее:
Я пытался сократить свою программу и решил взглянуть на ряд Тейлора для косинуса (синус сложнее рассчитать). Я изменил
x
на,pi * x / 30
чтобы соответствовать запрашиваемому периоду, а затем умножил на,20
чтобы соответствовать амплитуде. Я сделал некоторые упрощения (скорректированные факторы для отмены, без значительного изменения значения функции). Затем я реализовал это. К сожалению, это не более короткая реализация.проверяет, становятся ли значения ряда Тейлора неточными (о
x = 15
). Если они есть, то я вычисляю ряд Тейлораx - 30
вместоx
.моя реализация ряда Тейлора в
x = 0
, когдаx
это значение в стеке.отменяет значение ряда Тейлора, если ряд Тейлора нуждается в корректировке.
сделать волну косинуса положительной; в противном случае печать не будет работать.
печатает волну
временное ожидание 50 миллисекунд, затем увеличение
x
Если
x
больше 45, измените его на -14 (опять же, коррекция ошибок серии Тейлора).источник
Python,
108,93,90,89, 88Теперь с бесконечной прокруткой :)
Редактировать: хорошо, 90. Достаточно?
Редактировать: Редактировать: нет, 89.
Редактировать: Редактировать: Редактировать: 88 благодаря Boothby .
источник
a=0.
->a=0
приводит вас к 88PHP, 59 символов
источник
echo ...;
вместоfwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
это просто сокращение для"|\n"
.C64 BASIC, 64 символа PETSCII
На PAL C64,
For i=0 to 2:next i
циклы в течение ок. 0,05 секунды, поэтому время задержки соблюдается.источник
Javascript
887678 персонажейОсновано на коде Кендалла Фрея.
источник
i
, поэтому он печатает прямую линию вместо волны.C - 86 + 3 символа
Спасибо Шион и Джош за редактирование
я; основная (к) {для (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 символаисточник
i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
j=0
:i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}
. Это основывается на предположении, что программа вызывается с 0 аргументами.Ti-Basic, 33 байта
Существуют следующие предостережения :
Из-за ограничения экрана 16x8, эта синусоида имеет только амплитуду 7 (период 60 все еще поддерживается)
Из-за отсутствия простого способа доступа к
|
символу,!
используется вместоИз-за отсутствия точного системного таймера задержка не реализована. Однако скорость бега выглядит примерно правильной.
источник
JavaScript - 88
Я уверен, что кто-то может придумать что-то действительно умное.
источник
J -
103,58,57, 54Спасибо классным ребятам из IRC
В словах справа налево это выглядит так: начиная с 0 бесконечно делайте: sin, добавьте 1, умножьте на 20, floor, добавьте 1 (таким образом, он становится массивом из 2 элементов), скопируйте два байта '|' соответственно распечатайте, подождите 0,05 с и добавьте 0,1
Вместо бесконечного цикла мы можем использовать рекурсию, она сохранит 2 символа, но также выдаст ошибку стека после некоторого числа итераций
Где
$:
рекурсивный вызов.источник
(+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
хотя кажется, что он длится дольше, пока не достигнет минимумаХаскелл - 75
К сожалению, я не смог заставить программу сделать паузу в 50 мс, не удвоив счетчик символов, поэтому она просто заполняет консоль, но производит синусоидальную волну.
Вот полный код с паузой (138 символов с символами новой строки):
источник
20+20*sin x
вместо того, чтобы претендовать.Perl 6: 46 символов
Создайте бесконечный ленивый Range с помощью
0,0.1 ... *
цикла.say
возвращает,Bool::True
который нумеруется как 1 при умножении, так что я могу сохранить его в одном выражении.источник
sleep
и.05
должны быть отделены. Но мне интересно, если пространство междуsay
и' '
является обязательным?say' '
One, которую можно использовать,say(' ')
но в этом случае это на 1 символ больше ...fugly Javascript - 77
и если мы сделаем это в Firefox - 73
и если мы противны - 67
источник
Scala,
92,89, 87источник
(20+20*math.sin(i*.1))
уменьшает его на 1 символ, предполагая, что это правильный синтаксис (у меня нет опыта работы со Scala)Питон 3, 103
Глупый чертов импорт ...
Вместо «сна» эта реализация размалывает процессор, потому что python облегчает получение процессорных часов с плавающей запятой, чем настенных. Этот подход не превзойдет фриролов , но это весело, поэтому я оставляю это.
источник
C #
[152] Персонажи
Я не смог получить ответ «Существующий C #» на «Выполнить» и не смог понизить голос, потому что у меня недостаточно репутации
он пропустил пару
{
и пропустил)
после декларации For Loop.Я полагаю, что разница во взгляде на волну при ее запуске обусловлена тем, как мы пытаемся отобразить эту волну.
если мы не будем считать пространство имен и объявление метода, то для рабочей версии это будет [104] символов
источник
VB
[236][178]не знаю, как вы будете считать вкладки, я просто взял счет из Notepadd ++, прежде чем вставить сюда. переводы строки являются обязательными, вероятно, почему никто не любит использовать его для игры в гольф кода.
источник
C #
Волшебная линия [91] Персонажи
Рабочая программа ниже. [148] Персонажи
источник
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);}}
Threading.Thread.Sleep(50)
я что-то не так делаю?Bash + BC (чтобы сделать математику), 80
источник
TI-BASIC, 30 байтов
Небольшое улучшение размера по сравнению с другим ответом, за счет некоторой точности. Обратите внимание, что TI-Basic технически имеет | персонаж, но вы должны передать его через компьютер или использовать программу сборки для доступа к нему.
источник
.03π
может быть.1
, что еще в пределах необходимого интервала.Юлия - 68
Изменить: благодаря ML и туз.
Ну, это не может конкурировать с APL, но вот моя попытка.
Выход:
источник
.05
вместо0.05
вsleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
равно20sin(.1i)
MATLAB, 81 байт
Я злоупотребил фактом, который
i
всегда инициализируется в MATLAB, а это означало, что я мог поместить операторfprintf
вwhile
оператор без предварительной инициализацииi
. Это означает, что программа сначала выводит пустую строку, но я думаю, что это не запрещено в спецификации.Кроме того, он злоупотребляет тем фактом, что Matlab будет игнорировать большинство управляющих символов ASCII, печатая пробел вместо NULL (также для первой пустой строки).
источник
F # -
90797776Вот решение с использованием рекурсии
Это может быть улучшено дальше.
источник
AutoHotkey 176
Запустите скрипт. Он открывает Блокнот и печатает символы. Нажмите Esc в любое время, чтобы выйти.
источник
Clojure, 121
Укороченная версия:
Красивая версия:
Период 64.
Введите это
lein repl
или сохраните в файлеsin.clj
и запустите с помощьюlein exec sin.clj
(требуется плагин lein-exec).источник