Фон
Лето в Северном полушарии уже позади, и многие из нас скучают по солнцу, пляжам, волнам океана ... Задача состоит в том, чтобы взбодрить их, напомнив им о море.
Соревнование
Вот море:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
Море состоит из 5 раз по этой волновой схеме:
**
****
*****
** **
** **
* *****
Обратите внимание, что длина шаблона составляет 16 символов, а длина моря в 5 раз превышает 80 символов.
Который вы можете распечатать в терминале с помощью этой командной строки:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Или этот:
perl -e 'print " "x12, "*"x2, " "x2, "\n", " "x8, "*"x4, " "x4, "\n", " "x5, "*"x5, " "x6, "\n", " "x3, "*"x2, " "x3, "*"x2, " "x6, "\n", " "x1, "*"x2, " "x6, "*"x2, " "x5, "\n", "*"x1, " "x10, "*"x5, "\n"'
(Второй должен облегчить вам получение точного шаблона)
Ваша задача - отобразить море в терминале и создать видимость, как волны движутся вправо: ему нужно сдвигаться вправо со скоростью 1 символ каждые 100 мс (= 10 раз каждые секунды). Ни один символ не должен быть напечатан после 80-го столбца, но когда исчезнет крайняя правая волна, слева появится новая.
Вот пример вывода:
время = 0,0 с
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
время = 0,1 с
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
время = 0,2 с
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
время = 0.3с
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
время = 0,4 с
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Конечно, каждый выход должен заменить предыдущий.
Вы можете запустить этот код в терминале Unix, чтобы увидеть, как он должен выглядеть с анимацией:
perl -M5.010 -MTime::HiRes=sleep -E '@arr=([($")x12,($n="*")x2,($")x3],[($")x8,($n)x4,($")x4],[($")x5,($n)x5,($")x6],[($")x3,($n)x2,($")x3,($n)x2,($")x6],[($")x1,($n)x2,($")x6,($n)x2,($")x5],[($n)x1,($")x10,($n)x5]);while(++$j){for$i(0..5){for$k(0..15) {$out[$i][16*$_+$k]=$arr[$i][($k-$j)%16]for 0..4}}say"\e[H",$/,join$/,map{join"",@$_}@out;sleep 0.1}'
(Обратите внимание, что этот код не очень удачный: я просто сделал его достаточно компактным, чтобы его было удобно запускать в терминале.)
Критерий победы
Это Codegolf, поэтому выигрывает самый короткий код в байтах.
Ответы:
MATL ,
4140 байтПример выполнения:
Или попробуйте в MATL Online! (фактическая скорость может зависеть от нагрузки на сервер).
Как это устроено
источник
JavaScript (ES6) + HTML,
151143 + 10 =161153 байтаисточник
a
?a
содержит волновой паттерн в двоичном коде и вращается на каждом кадре. Таким образом, он не может быть жестко закодирован: его нужно хранить в переменной.HTML + CSS, 70 +
181175 = 245 байтИспользует
text-shadow
,rtl
текст и CSS ключевых кадров анимации.источник
C #
450444425417 байт399 без,
using System.Linq;
но я уверен, что будет обманывать ...Редактировать: 25 байтов сохранено благодаря @Cyoce
Golfed:
Ungolfed:
источник
(a)=>
. Иwhile(true)
может бытьfor(;;)
s
лямбды, я думаю, вы можете удалить{}
иreturn
\r
изstring.Join
(по крайней мере, в Windows это работает, хотя с Mono это не проверялось). Вы также можете сэкономить 1 байт, поместивp++
вfor
цикл, подобный этомуfor(;;p++)
if (p==16)...
), вы также можете поместить ее в заголовок цикла for следующим образомfor(;;p=++p%16)
. Сохраните еще 1 байт, объявивp
в цикле (for(int p=0;;p=++p%16)
)V
989773 байтаСпасибо @ nmjcman101 за сохранение 24 байта!
Это содержит много непечатаемых, так что вот xxd hexdump:
редактировать
Используется
y$
вместо<C-v>$y
Много изменений
{
и}
для сохранения нескольких байтовò
вместо регистров для создания бесконечного цикла (по некоторым причинам я должен включитьò
в конце, чтобы он работал)*
внизуМини-Разъяснение
Я использую
<alt-n>
для создания копий строк. Например,<alt-5>*
(это выглядит такµ5
) делает5
копии*
в режиме вставки. Я обнаружил, что это короче, чем копирование строки и использование регулярных выражений для выполнения необходимых замен. После создания одной волны я вставляю ее, чтобы создать другие волны. Наконец, я рекурсивно использую цикл,ò
чтобы создать бесконечный цикл (с задержкой100ms
).Gif
Большая часть кода посвящена созданию волны, поэтому я все еще пытаюсь сыграть в эту игру. Обратите внимание, что этот код не будет работать на TIO, поскольку TIO выводит выходные данные только после того, как код завершит выполнение. Итак, вот gif (извините за низкое качество, мне пришлось использовать веб-сайт для преобразования
.mov
в a.gif
, а также,>_
который продолжает появляться справа - это значок терминала на док-станции моего Mac):источник
5j
(в контексте$<C-V>5j
) может быть просто}
, аp
после после|
должен быть,P
который будет фиксировать статические*
в левом нижнем углу.qm[CODE]@mq@m
в конце простоò[CODE]
. Код междуò
будет зацикливаться до прерывания (аналогично вашему макросу), а в конце программыò
неявно закрывается.Пакетный, 424 байта
Некоторые строки имеют завершающие пробелы. Требуется стандартный 80-колоночный терминал. Время не очень точное, но это лучшее, что вы можете сделать в пакетном режиме.
источник
Ракетка
395374373367364351 байтИспользует внешнюю библиотеку для очистки экрана.
Редактировать: Сохранено 21 байт, не определяя
w
и не вставляя функцию.Edit2: 1 байт сохранен путем удаления пробела.
Edit3: Сохраненный 6 байт путем переименования
loop
вp
, благодаря @rnso!Edit4: положить подстроку в let, сохраняющую 3 байта.
Edit5: Удалить
#lang racket
, который не нужен в интерпретаторе.Гольф: 351 байт
Прокрутка (не ясно): 272 байта
Ungolfed:
источник
simplescreenrecorder
сavconv
для преобразования MP4 в GIF.rotmul
вw
качестве параметра.PowerShell 3.0,
183182173 байтаТребуется PS 3.0 для операторов двоичного сдвига. Уменьшено до 173 байт с помощью AdmBorkBork !
источник
.PadLeft
, переместите$o
объявление в[convert]
вызов и удалите кавычки вокруг чисел в-replace
операциях. Получает вас до 175 -for(){0..5|%{("{0:D16}"-f+[Convert]::ToString(([uint16]$o=$w[$_]),2))*5-replace0,' '-replace1,'*'
+
в"{0:D16}"-f+[Convert]
? Это не работает без этого, но я не могу понять, что это делает.[convert]::ToString()
Возвращает строку. В+
силах литая Ани[int]
так что-f
подхватывает правильный тип параметра дляD16
для работы.+'1'
как действительную арифметическую операцию без первого слагаемого, приводитstring
кint
результату и возвращает его? Великий Скотт!Bash + coreutils,
172148 байт24 байта сохранено благодаря @zeppelin , большое спасибо
Первая строка распаковывает следующую схему из 6 последовательных волн:
Затем цикл пропускает окно шириной 80 байт по этому шаблону.
источник
*> <> ,
251250251 байт (не конкурирует)Примечание:
"H;0["
должен иметь ascii27
после[
.Попробуй это здесь! (установите задержку на 0 мс)
Я не могу поверить, что в итоге мне это удалось. Это использует
I
иD
инструкцию, которая увеличивает или уменьшает выбранный стек. Это демонстрирует, что, вероятно, возможно сделать это в чистом> <> (минус сне) или конкурентном *> <> ответе, хотя, вероятно, сделать это намного сложнее.Версия онлайн-переводчика отличается просто для очистки вывода с помощью возврата каретки.
Это не конкурирующее , так как
I
,D
,C
иR
инструкция моложе вызова. Это, вероятно, можно обойтись без этих инструкций, но это будет очень трудно / долго.Изменить: мне действительно удалось удалить байт, но я также заметил, что я измерил размер неправильно, поэтому я на самом деле получил байт.
Я сделаю все возможное, чтобы сломать шаги и объяснить, что здесь происходит ...
объяснение
Содержание
инициализация
Здесь мы строим 6 линий, которые строят волны. Нам нужно повторить каждую строку 5 раз, чтобы быть правильной длины.
Мы начнем с 6 из них, по одному на каждую линию волны:
И мы входим в основной цикл после инициализации через
09.
.Копировать текущий стек 4 раза
Это простая функция, которая просто берет текущий стек и копирует его 4 раза. Таким образом, «а» станет «ааааа».
Копировать стек
Это копирует текущий стек, добавляя копию в текущий стек.
Настроить
Собираемся пропустить начальную
<
строку и инвертировать первую строку, чтобы она сталаl:&0v
такой, какой она должна быть выполнена после<
изменения направления IP.С этого момента длина будет упоминаться как
n
и0
какi
.петля
уборка
Основной цикл
Здесь код работает вечно, постоянно перерисовывая волны в промежутках между 100 мс.
Настроить
петля
источник
PHP, 128 байт
Не может анимировать более одной строки, но она прокручивается.
Добавьте
,0
в массив пустую строку между итерациями. Беги с-r
.источник
Mathematica, 213 байтов
Я не вижу никакого способа игры в волновой паттерн в Mathematica, кроме как начать со списка строк для каждой строки. Инициализирую
i
быть0
и запланировать задачу , чтобы увеличить его каждые0.1
секунды. ЯDynamic
показываю результат следующего:StringRepeat
каждая строка 5 раз.Characters
.RotateRight
каждый список персонажейi
.Grid
.источник
C (unix),
231191 байтЭто будет работать только в среде Unix. Кроме того, прошу прощения за тот факт, что sleep принимает только целые числа ... поэтому он фактически задерживает 1 секунду между кадрами.
Безголовая версия:
Гольф версия:
источник
Javascript (ES6),
152147145 байтисточник
setInterval(a=>{...},100,6)
, и еще 4 сf+=" *"[[...][a]&1<<(i+x)%16]
.Perl 6,
140138137123120 байтСтарые решения:
источник
Python 3,
240239230 байт-1 байт благодаря @redstarcoder
-9 байт благодаря @PascalvKooten
источник
print("\x1b[0;H")
у меня тоже работает за -1 байт.' **'
на' '*13+'**'
и вы можете иметь 1 символьный отступ в то время, не нужно, чтобы это было 4 символа.Ракетка 295 байтов
Ungolfed:
Тестирование:
Выход:
(Это GIF-файл медленнее, чем фактический вывод).
источник
Python 2,
207202 байтаОбычно я разработчик на C #, так что это может быть еще не полностью ...
источник
C #, 327 байт
Более или менее портированная версия моего решения на Python ...
источник
Perl, 110 байт
Требуется
-E
без каких-либо дополнительных затрат. Это содержит непечатаемые символы.Создайте вышеуказанные данные, используя приведенную ниже обратимую hexdump. Запустите
xxd -d > sea.pl
в Linux или совместимом терминале, вставьте ниже и нажмите Ctrl+ d, затем запуститеperl -E "$(cat sea.pl)"
.использование
Для легкого копирования / вставки, пожалуйста, используйте ниже:
объяснение
Довольно простое решение, которое вначале хранит волну в виде строки, которая имеет
unpack
двоичную форму, каждая секция дублируется,0
s преобразуются в пробелы, а1
s преобразуются в*
s. Теперь у нас есть вся строка, поэтому мы вводимredo
цикл, который печатает всю строку, затем мы ждем 0,1 секунды и для каждой строки в строке мы перемещаем последний символ в начало строки.источник
Mathematica 171 байт
Сама волна - это данные, поэтому я храню сжатую версию всей волны в своем коде. Я могу хранить одну волну гораздо более компактно,
\fð߀ᣀ恠耟
используя ее двоичное представление, но слишком большое количество символов для распаковки слишком велико *.Вот код:
Вот код, который я использовал для создания сжатой версии волновых данных:
Вот код, который я бы предпочел использовать для хранения сжатых повторяющихся двоичных данных, таких как эта волна:
Как вы можете видеть, накладные расходы на преобразование сжатых данных обратно в строку слишком дороги для этой конкретной проблемы, хотя одну волну можно сохранить таким образом с 7 символами UTF и 15 байтами.
Вот код для определения последовательности символов UTF для хранения одной волны (s, как указано выше).
источник
Рубин
269217189185 байт-28 байт благодаря @manatwork
-5 байт благодаря @ropata
Обычный
Golfed
источник
do … end
→{ … }
и удалить символы новой строки после{
и до}
; удалить пробел междуsystem
и его параметром; удалить,
последний элемент литерала массива after;.each
→.map
и удалите пробел между ним и его кодовым блоком; удалить пространство передputs
;0..80
→0,80
(это также ошибка, когда вы выражаете строку длиной 81 символ);p=p+1==16?0: p+1
→p=-~p%16
.do … end
→{ … }
, по-прежнему необходимоloop
ключевое слово. Это самое короткое, что я получаю: pastebin.com/cg3gxnm4b=' '
(5 пробелов) вверху, затем изменив выражение вывода на' '*12+'** ', ' '*8+'**** ',b+'***** '+b,' ** ** '+b,' ** **'+b,'*'+b+b+'*****'
... (но SE не показывает повторяющиеся пробелы в этом комментарии!)HTML + JS + jQuery, 10 + 233 = 243 байта
JavaScript просто сдвигает каждую строку на 1 и меняет текст каждые 100 мс.
источник