После моего вступления в Запутанный Hello World я подумал, что было бы забавно поделиться базовым кодом. Но зачем просто показывать код, пусть это тоже гольф!
Вызов
Напишите скрипт, который прокручивает строку через терминал справа налево и располагается слева.
вход
Принимает строку в качестве аргумента.
Результат
Распечатывает выделенную область на STDOUT. Максимальная ширина ~ 50 символов. Начинается с показа 0 или 1 символа. Некоторое пространство между буквами при прокрутке. Останавливается, когда установлено (без дополнительного пробела между символами). Медленная прокрутка, но не слишком медленная (<1 с за итерацию).
пример
Запуск скрипта с аргументом arg 'Hello World'
H
потом
H e l l o W o
потом
H e l l o W o r l d
потом
Hell o W o r l d
наконец
Hello World
Для работающего примера попробуйте мой код из задачи «Hello World». Со временем я опубликую свой. В настоящее время в Perl 202 символа. Теперь, когда есть несколько конкурентов, я разместил свой в ответах.
победитель
Я не хочу, чтобы ограничения были абсолютными, поэтому я оставил их немного расплывчатыми. Самый короткий сценарий, который следует духу моего оригинала, победит.
Примечания
Эта игра предполагает xterm
среду. Если другая среда окажется полезной, будут сравниваться только похожие среды, и для каждого из них может быть объявлен отдельный победитель.
Приложение (25 апреля 2012 г.)
Чтобы решить некоторые возникающие проблемы, я делаю решение. Ваше количество символов должно включать код, необходимый для:
- Флеш STDOUT (смотрит на тебя, Руби)
- Реализация
sleep
с задержкой <1с (смотря на вас, Perl)
Это может быть сделано, когда командная строка переключается на интерпретатор, но эти символы учитываются в общем количестве (без пробелов).
xterm
,vt102
, ...?Ответы:
питон 2 - 146 символов
редактировать: сделал его функцией вместо ввода через стандартный ввод. Первый аргумент - это строка, а второй аргумент - это та длина, которую вы хотите. так что вызов будет
f('Hello World', 50)
. Я также сделал это намного более гладким; когда каждый персонаж "приземлился", была неловкая паузастарый, 158 символов:
источник
f("Hello World, 40)
работал для меня.Рубин,
939189 символовТекст для отображения должен быть задан в качестве аргумента командной строки, например
для примера, показанного выше. К сожалению, я не могу показать анимацию здесь, поэтому вы должны попробовать код самостоятельно.
Предыдущая версия:
источник
STDOUT.sync=true;
так, чтобы он автофлеш. Эквивалент Perl есть$|++
. Это дополнительные 17 символов, но все еще намного ниже моего. Ну, я не могу позволить Руби победить Perl! Собираюсь работать. Хороший.ruby1.8 "Hello World"
я получаю, не совсем к моему удивлению, сообщение об ошибке:ruby1.8: No such file or directory -- Hello World (LoadError)
ruby foo.rb args
;-)С
948380173 символовРЕДАКТИРОВАТЬ: Добавлено много кода, теперь реализованы все запрошенные функции. Константу
1e8
можно настроить для контроля скорости. На моей машине все довольно быстро как есть.Некоторые персонажи могут быть сохранены здесь.
l
может быть статическим (сохраняет инициализацию),c
может стать указателем (заменаb+c
).Старая версия (80 символов) с частичной функциональностью:
сохранена пара символов путем замены
char**t
наint*t
. Работает нормально в 32-битной (int**t
будет поддерживать 64-битную).источник
K & R C -
431416 знаковУважает стандарт в высокой степени. Использует ncurses, поэтому он должен быть в значительной степени независимым от терминала. Когда текст попадает на бок, происходит небольшое заикание из-за некоторой хитрости, сыгранной для сохранения предполагаемого пробела в строке.
Используемая строка должна быть передана в качестве первого аргумента в командной строке (и ее следует экранировать, если она содержит пробелы, особенно если она содержит a,
!
как этоHello, World!
делала моя тестовая строка ( )).В более читаемой и прокомментированной форме:
источник
if
на операторы. Например -if((s-q)%2)s--;else usleep(1e5);
->s-q&1?s--:usleep(1e5);
(илиs-=s-q&1||usleep(1e5);
)' '
s числовыми эквивалентами.x==32
наx-32
(меняет значение, поэтому измените если-либо) или наx<33
(при условии, что 0..31 никогда не использовалось). Инициализируйте значениями, которые у вас есть (for(curs_set(c=0);...
).*(s+1)
->s[1]
. Удалите ненужные скобки (замена;
с,
поможет).Perl 5.13.2, 96
Кража много из ответа @ Кевина Рейда , особенно
/r
уловка, доступная в более новых Perls.Perl, 115
Как и ответ @ Joel Berger , это могло бы стать намного короче, если бы я мог использовать
sleep 1
и был медленным, или передавал-MTime::HiRes=sleep
командную строку для включенияsleep.1
. В противном случае единственный встроенный способ получить короткий сон -select'','','',.1
это довольно длинный.Perl, 128Perl, 133источник
x
и блочная формаmap
сэкономит несколько.JavaScript
180218 символовПроизводственная версия:
Безголовая версия:
Вот демоверсия jsFiddle
Примечание: если вы пытаетесь воспроизвести его, убедитесь, что код находится ниже тела
источник
Perl 5.13.2, 115 символов
/r
.Кредиты:
$"
как источник" "
взят из ответа эпимента , сокращение на 1 символ.источник
r
флаг, лучшее дополнение к языку с тех порstate
Баш 234
Использование:
ungolfed:
источник
R, 319 символов
Следуя философии примера @Blazer (d - задержка в секундах):
Использование:
источник
Perl :
144133Для того, чтобы выспаться <1 с, вам нужно запустить как:
Поскольку я не буду объявлять себя победителем, я не буду спорить о том, что там важно или нет (но я действительно не могу, чтобы Руби выиграла это ;-))
источник
s/' '/$"/g
иs/shift/pop/
push
заявления. Я просто еще не опубликовал это.Вопрос, 145
Не совсем соответствует требованиям, потому что последняя строка удаляет все пробелы, которые были в исходной строке ввода.
Требуется два аргумента: строка ввода и скорость прокрутки
источник
PowerShell, 135
Не очень игра в гольф и, вероятно, ужасный подход, но я болен и не могу думать ...
источник
J (116)
Принимает строку ввода в командной строке, т.е.
jconsole marquee.ijs 'Hello, world!'
Если ему не нужно очищать экран, то есть выводить это так:
разрешено, это будет на 12 символов короче.
Объяснение:
s.=>2{ARGV
: получить строку из командной строкиk.=50,3#~<:#s
: начальное количество пробелов, добавленное перед каждым символом, 50 перед первым и 3 перед всеми остальными. (дает массив '50 3 3 3 ... ')([-=&0@/:@\:@~:&0)
: дан массив, уменьшает первый ненулевой элемент в массиве^:(i.>:+/k)
: эта функция применялась N раз, где N равно 0 до суммы количества добавленных пробелов. (дает матрицу:50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0)
."1
: запустить следующую функцию в каждой строке матрицы;@:(([,~#&' '@])@.>)
: добавить заданное количество пробелов перед каждым символом в строке(50&{.)
: взять первые 50 символов строки([[i.@]&2e7)
: функция, которая генерирует список от 0 до 2 * 10 ^ 7, а затем выбрасывает его. Это занимает около трети секунды на моей машине, это вызывает задержку.((50#LF)&,)
: добавить 50 новых строк перед строкой, чтобы очистить экранecho
: вывести строкуs (...)
: дать строку в качестве левого аргумента функцииисточник
APL (70)
Принимает ввод с клавиатуры, вывод находится в
⎕SM
окне (которое будет терминалом, если у вас есть текстовый APL, я думаю). Размер окна определяется автоматически, если вы действительно хотите, чтобы это было 50 Изменение1↓⎕SD
в50
.Объяснение:
1↓⎕SD,1↓3⍴⍨⍴D←⍞
: прочитайте строку и сохраните вD
. Создайте вектор, описывающий количество пробелов, добавляемых перед каждым символом, - ширину экрана перед первым символом (1↓⎕SD
) и 3 перед остальными (1↓3⍴⍨⍴D
).⎕DL÷8
: подождите 1/8 секундыP←⍵-{⍵×~×⍺}\×⍵
: в векторе в правом аргументе вычтите 1 из крайнего левого ненулевого элемента и сохраните новый вектор в P.,/D{⍺,⍨⍵⍴⍕⍬}¨P
: для каждого символа в D префикс количества пробелов, указанного в P.⎕SM∘←1,⍨1,⍨
: отображение на экране, в крайнем левом столбце верхнего ряда0∨.≠P:∇P
: если в P есть ненулевой элемент, повторите с P.источник
PowerShell , 129 байт
Попробуйте онлайн!
Этот сценарий не удаляет пробелы в аргументах в отличие от сценария Джои .
TIO
не отображает вывод правильно. С консолью Powershell вы получаете прокрутку.источник
05AB1E , 42 байта
Попробуйте онлайн (без сна).ПРИМЕЧАНИЕ: у меня не установлен 05AB1E локально, поэтому я не уверен на 100%, работает ли
\r
трюк (однако теоретически он должен работать). В TIO\r
они интерпретируются как переводы строк. Кроме того, TIO использует унаследованную версию, поскольку.e
она отключена в новой версии TIO (однако программа одинакова как в устаревшей, так и в новой версии 05AB1E).Объяснение:
Смотрите этот 05AB1E наконечник шахты (раздел Как использовать словарь? ) , Чтобы понять , почему
“…¢('\r')“
это"print('\r')"
.источник
Python, 139 байт
Должен позвонить,
f('Hello World', 50)
чтобы начать.источник