Задание:
Для .txt
файла с кадрами в формате ASCII, каждый из которых разделен символом \n
(см. Этот пример, если вам неясно), выведите движущееся изображение с кадром с 1 кадром в секунду.
Обратите внимание, что \n
на последнем кадре есть трейлинг .
Размеры каждого кадра будут:
- X <80
- У <20
Правила
- Предыдущий кадр должен быть очищен перед отображением следующего, поэтому простая печать каждого кадра на терминале не является правильным ответом.
- Новое Вы можете получить имя файла по своему усмотрению, либо из его сохранения в переменной, либо из sys-аргументов.
- Новые изображения должны повторяться бесконечно
- Это код гольф: выигрывает самая маленькая программа.
пример
вход
0 0
0 0
00000
0 0
0 0
00000
0
00000
0
00000
0 0
0 0
0
0
0
Выход
Un-golfed
import curses, time
stdscr = curses.initscr()
Frames = file.read(file('Frames.txt')).split('\n')
while True:
y = 0
for i in range(len(Frames)):
stdscr.addstr(y,0,Frames[i])
stdscr.refresh()
y += 1
if Frames[i] == '':
y = 0
stdscr.clear()
time.sleep(1)
document.body.innerText
Ответы:
Mathematica, 41 байт
Ожидает, что имя файла будет храниться в переменной
f
.Это первый раз, когда Mathematica использует правила приоритетов
@
и.~.~.
именно так, как они мне нужны.Кстати, этот фрагмент может пойти ужасно неправильно, если расширение файла что-то еще, чем
.txt
(потому что Mathematica попытается угадать, как сделать импорт на основе этого), но, к счастью, это окончание файла является частью спецификации вызова.источник
Баш, 82
Предполагается, что имя файла .txt предоставляется в качестве первого аргумента сценария.
Обратите внимание, что завершающая пустая строка должна присутствовать в конце файла .txt, чтобы это работало.
Особая благодарность @professfishfish и @DigitalTrauma.
источник
$IFS
пусто по умолчанию? Кроме того, используйтеfor ((;;)){ ... }
вместоwhile :;do ... done
''
так, чтобыread
можно было читать несколько последовательных пробелов, как в последней строке YIFS=
и[ "$a" ]
вместо[ -n "$a" ]
Рубин,
88865655 символовЭта программа предполагает, что имя файла задано в качестве первого аргумента.
Большое спасибо Ventero за то, что поделились отличными улучшениями!
Un-golfed:
Эта программа читает файл, разбивает его на части и распечатывает каждый фрагмент отдельно после очистки экрана.
cls
работает только на Windows. Вариант сclear
- 57 символов.источник
;
и опуская скобки при вызовеsplit
.\n
любом случае. Также здесь, в Code Golf, никто не заставит вас добавлять еще одно очко к вашему счету за каждый разрыв строки только потому, что вы используете Windows. ;)$*
является сокращением дляARGV
, который будет сохранять два символа. В этом случае, вы можете сэкономить еще больше, используяARGF
(или$<
) , хотя:a=$<.read.split"\n\n"
.a.size
также корочеa.length
. И так какsleep
возвращает свой аргумент после возврата, вы можете объединить последние два оператора в вашем цикле вi+=sleep 1
.i
с помощьюArray#cycle
, которая зацикливается если аргумент не задан:a.cycle{|i|system"cls";$><<i;sleep 1}
. И разделение на$/+$/
другой персонаж короче"\n\n"
.a
:$<.read.split($/+$/).cycle{...}
(извините за тройной комментарий, я всегда думаю о новых улучшениях сразу после окончания периода редактирования комментариев :))Дьялог АПЛ (64)
(Не могу победить Mathematica на этот раз. Кажется, что он встроен во все.)
Это функция, которая принимает имя файла в качестве аргумента. Предполагается, что файл в
\r\n
формате Windows ( ).Объяснение:
⎕ML←3
: установите уровень миграции на 3 (позволяя⊂
использовать в качестве функции разделения APL2)M←80 ¯1⎕MAP⍵
: прочитать файл, заданный правильным аргументом, как файл ASCII и сохранить его содержимое вM
.M⊂⍨~(4/1)⍷⎕TC∊⍨M
: найти все вхождения четырех последовательных управляющих символов терминала и разделитьM
их. Это дает каждый кадр.{
...}¨
: для каждого из этих ...⊂⊃⍵⊂⍨~⍵∊⎕TC
: разделить аргумент (= один кадр) на управляющие символы терминала, а затем превратить вектор векторов в матрицу (чтобы каждая строка отображалась на отдельной строке, это необходимо, поскольку⎕SM
не понимает управляющие символы).⎕SM←1 1,⍨
: затем отобразите его в левом верхнем углу⎕SM
окна.⎕DL 1
: а затем подождите одну секунду.источник
Авк, 53Новые правила:
Awk, 74
источник
BEGIN{RS=z}{system("sleep 1;clear")}1
... В awk""
это особенноеRS
значение многострочных записей. Чтобы поддерживать новое правило зацикливания до бесконечности, у меня есть это до сих пор:BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}
в 74 символов. Gawk поддерживает изменение,ARGV
так что вы можете сделатьBEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1
на 63 символов.Perl, 40
беги как
(т.е. файл анимации читается через STDIN).
p00
Для подсчета добавлено 3 байта . Это на 2 символа короче, то есть 38 на Windows, потому чтоcls
вместоclear
. Или, чтобы быть портативным:Или немного растянуть правила (а затем 31 + 3 = 34 ):
источник
Реболь, 74
Ожидает, что имя файла будет храниться в переменной
f
. Ниже приведен пример без гольфа:источник
Java, 678 символов (при игре в гольф)
Конечно, с графическим интерфейсом, поскольку работа в консоли - отстой с Java, особенно если вы хотите очистить экран ...
источник
Кобра - 163
источник
Python 117
Предполагается, что имя файла хранится в переменной
f
.Примечание: заменить
'cls'
на'clear'
if в системе на основе Unix, добавив 2 chrs.ctl+C
выйтиисточник
for i in F: s.addstr(y,0,i); ... if i=='': ...
open(f).read()
вместоfile.read(file(f))
, короче на 4 байта.Groovy -
121119 символовПортированный ответ ProgramFOX на Groovy 2.2.1. «Чистая консоль» слабая.
edit : заменено рекурсивное закрытие на простой цикл while, который короче и не переполняется стеком
Ungolfed:
источник
GNU sed, 32
источник
Groovy, 81
Это более отличный способ:
ungolfed
источник
cls
для Windows, я думаю ... попробуйтеclear
C # 226
Зачем?
Без гольфа :
Или в LINQPAD (таким образом, C # может оставаться полуконкурентоспособным с сокращенными именами Uber: D)
C # LINQPAD - 134
Я чувствую себя немного грязно, но эй, это код-гольф.
источник
SmileBASIC, 74 байта
F должно быть именем файла
источник