Кто не любит боевики с быстрыми шумными автомобилями, особенно те, где много аварий? Кто не любит боевики в ascii art?
Сцена это:
Две машины стартуют на противоположных сторонах прямой дороги (с 60 пробелами между ними). Они начинают двигаться навстречу друг другу с постоянной скоростью. Автомобиль слева движется со скоростью 1 пробел в секунду, а автомобиль справа - со скоростью 2 пробела в секунду.
Очевидно, что автомобили не могут проходить друг через друга, поэтому на n ≥ 20
месте происшествия будут две разбитые машины с капотами в том месте, где произошла авария.
Как любитель кино, я хочу время от времени останавливать сцену, просто чтобы насладиться ее красотой.
Если задано целое число n
(аргумент функции или STDIN), представляющее количество секунд от начала сцены, покажите сцену в этот момент.
Это стартовая сцена с 60 пробелами между передними колесами:
__ __
_/ \_ _/ \_
o o o o
это сцена через 11 секунд:
__ __
_/ \_ _/ \_
o o o o
и вот как это выглядит после аварии (обратите внимание, что капоты открыты после аварии):
__ __
_/ \/\/ \_
o oo o
Я заинтересован только в том, чтобы посмотреть, как разбиваются две машины, так что пробелы, переводы строк, ++ не имеют значения.
Это код гольф, поэтому выигрывает самый короткий код в байтах. Ответы, добавленные позже, все еще могут выиграть, если они короче текущего принятого ответа.
/ \
а не опущены_ _
?Ответы:
CJam,
6866 байтПопробуйте онлайн
Любой, кто увидит начало кода, будет в этом уверен
liKe
!Объяснение:
источник
Лабиринт ,
394386 байтЯ с гордостью представляю ...
... мой новый двухмерный лабиринт esolang! Приведенный выше код не очень хорошо подходит для игры в гольф (есть 161 пробел и 25 NOP, поэтому лучшая компоновка может значительно сократить это), но, по крайней мере, мне удалось показать, что язык пригоден для нетривиальных задач. :)
Как это работает
Сначала краткий обзор языка:
"
это NOP, который не является стеной и может быть полезен для заполнения определенных путей в коде. В отличие от многих других 2D-языков, края не смещаются.@
завершает программу>v<^
которые циклически сдвигают строку или столбец исходного кода на одну ячейку. Какая строка или столбец зависит от вершины стека. Если собственная строка или столбец IP смещены, они будут перемещаться вместе со смещением. Это позволяет перейти с одного края исходного кода на другой.Теперь для этой конкретной задачи, вот общая идея алгоритма:
/ \_o oo o
) На вспомогательный стек.__
или/\
дальше.__ __ _/ \
и два ведущих пространства) на вспомогательный стек.20
, давайте назовем это N .Наконец, давайте посмотрим на некоторые части кода. IP начинается в верхнем левом углу команды сдвига сетки. Вершина основного стека
0
(которая используется как относительный индекс), поэтому первая строка смещена влево, что также перемещает IP-адрес в правый конец сетки. Теперь первая строка просто выполняется справа налево, что помещает первый набор фиксированных символов во вспомогательный стек:Это смещение строк полезно для игры в гольф, когда вы хотите начать с большого количества линейного кода.
Далее мы читаем ввод и нажимаем правильные крышки:
Бит слева с тремя NOP отправляет отрицательные результаты по верхней ветви и неотрицательные результаты по нижней ветви. Справа они соединены вместе.
Теперь следует еще один большой линейный участок (который, вероятно, можно было бы много сыграть с помощью другого трюка со сдвигом строк):
Это толкает оставшуюся часть машин на вспомогательный стек.
Далее мы вычисляем
min(20, input)
, что похоже на первую ветку:Наконец, у нас есть цикл, который запускается три раза для печати строк. Каждая итерация цикла содержит два маленьких (3x3) цикла для печати пробелов, а также два раздела для печати 6 символов из вспомогательного стека:
Один изящный трюк, на который я хотел бы обратить внимание -
.{.{.
это правый край. Это тупик, поэтому, кроме.
конца, код выполняется дважды, один раз вперед и один раз назад. Это дает аккуратный способ сократить палиндромный код (выгода заключается в том, что вам нужно убедиться, что IP-адрес принимает правильный поворот при выходе из тупика снова).источник
Python 2.7,
167164159 байтЭто требует ввода от стандартного ввода.
Демо здесь
Тестирование этого -
источник
(n,20)[n>20]
это простоmin(n,20)
.(' \_',' \/')[s<1]
на' \\\\_/'[s<1::2]
.l
необходимо? Не могли бы вы просто сделатьfor e in [' _',"_/ ","o "]:
и удалитьl
?l
сейчас не нужно. Я должен был использовать его в более ранней версии. Спасибо :)R, 191 байт
Примерно так хорошо, как я могу получить это сейчас. Занимает секунды от STDIN и кошек до STDOUT.
объяснение
тесты
источник
formals()
. :)CJam, 120 байтов
демонстрация
Ungolfed:
демонстрация
источник
J
имеет значение 19,K
имеет значение 20, сохраняя каждый символ для этих констант. Если вам нужен массив с одним элементом, вы можете использоватьa
оператор для переноса элемента вместо использования пары скобок.PHP,
160155 байтКод отображается здесь в 3 строки, чтобы соответствовать макету поля кода. Эти новые строки не нужны.
Негольфированный код:
Он получает количество секунд из командной строки (первый аргумент):
Параметр CLI PHP
-d error_reporting=0
необходим, чтобы скрыть некоторые уведомления, которые PHP отображает о неопределенных константах (str_repeat
,_
), которые он преобразует в строки (2 байта сохраняются для каждого уведомления).Один дополнительный байт может быть сохранен в PHP 7, сжимая инициализацию
$f
в его первое использование ($m=($f=str_repeat)(...)
); он не компилируется на PHP 5.Тестовый пример и некоторые методы, используемые для сжатия кода, можно найти на github .
Обновить:
@ ismail-miguel сжал инициализацию
$left
и добавил$c
аргументыecho
сохранения 4 байта (см. комментарий ниже).Меняя местами порядок переменных
$m
иs
инициализируя, я избавился от пары скобок и сохранил еще 1 байт.источник
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
в переменную, но получил ту же длину или хуже.\n
реальными символами новой строки. Я забыл об этом. И это считается как 1 байт каждыйJavaScript (ES6), 121 байт
Используя строку шаблона, 2 символа новой строки внутри строки являются значимыми и подсчитываются.
Для сохранения байтов выведите с помощью
alert
, даже если пропорциональный шрифт используется вalert
, не очень подходит для ASCII-искусства, и результат будет некрасивым для n> = 20 (сбой).Тестовый запуск фрагмента в FireFox
источник
Python 2, 148 байт
При этом используются escape-коды ANSI, чтобы расположить курсор в нужном месте для рисования автомобилей. Затем он проверяет, был ли ввод 20, если он был, он возвращается и рисует на капоте автомобиля.
Принимает int из stdin, выводит в stdout.
Ungolfed:
источник
Pyth, 67 байт
Попробуйте это здесь .
источник
C
180191168 байтungolfed:
тестовая программа:
выход:
Я смог сыграть в эту игру довольно сложно. Я думаю, что я начал с почти 300 байтов.
Но я не знаю, соответствует ли это всем требованиям. Как вы можете видеть через 21 секунду, первая машина толкает вторую машину вправо. Мне нужно добавить несколько байтов, если это не разрешено.Редактировать: исправлено. Это должно быть более реалистично, чем Sharknado ;-)
Изменить: я мог бы значительно сократить свое решение, еще раз посмотрев на
printf
справочную страницу. Если вы используете '*', вы можете указать длину поля непосредственно для printf, без необходимостиsprintf
предварительно создавать строку формата .источник
> <> ,
538276 байтЯ уменьшил размер ОЧЕНЬ, я поражен тем, что мне удалось уменьшить размер вдвое. Старый ниже. Этот не столь эффективен с точки зрения производительности из-за ширины сетки, в основном с самой первой строки.
Вы можете проверить это здесь . Укажите количество времени, которое прошло в «Начальном стеке», а не «Вход»!
Вот старая версия.
источник
Ява, 258 символов
Un-Golfed
Полученные результаты
источник
Python 2, 102 байта
Довольно просто. Для каждого ряда автомобилей мы печатаем
n
пробелы, этот ряд,60-3*n
пробелы и ряд снова. Чтобы остановить автомобили, вместо того, чтобы делатьmin(n,20)
это, было на один символ короче, чтобы ограничить первый пробег пробелов[:20]
, а второй - это хорошо, потому что строка с отрицательным числом - пустая строка.Чтобы сдвинуть крылья, мы просто делаем
replace
. Так как__
также появляется на крыше, нам нужно немного контекста, чтобы идентифицировать крылья, поэтому мы проверяем/
следующее.источник
Ява,
270267 байтЯ уверен, что есть лучший / более короткий способ сделать это, но мой мозг не задействован должным образом.
Для n = 19:
Для n = 20:
Ungolfed
источник
PHP 7, 140 байт
Использование:
Сохраните как ANSI в
file.php
(там должно быть символов нулевой ширины$o
) и запустите:с
x
количеством секунд.И версия, которая работает без изменения сообщения об ошибке ( 148 байт ):
источник
Javascript, 193 байта
Это не победитель, но это что-то
http://jsfiddle.net/yb703y0p/2/
источник