Эта проблема вдохновлена этим ответом на бирже Ask Ubuntu Stack Exchange.
вступление
Помните заставку Windows ME с трубами ? Время вернуть ностальгию!
Вызов
Вы должны написать программу или функцию, которая выведет ASCII-представление заставки. В скринсейвере должна быть одна труба, которая будет расти в полуслучайных направлениях.
Начало трубы будет случайным образом размещено на любой из границ экрана, и часть трубы должна быть перпендикулярна границе (угловые первые трубы могут быть горизонтальными или вертикальными). Каждый тик труба будет расти в том направлении, в котором она находится (горизонтальный / вертикальный) при 80%
случайном повороте или при повороте 20%
.
Представление трубы
Для создания канала будут использованы 6 символов Юникода
─ \u2500 horizontal pipe
│ \u2502 vertical pipe
┌ \u250C upper left corner pipe
┐ \u2510 upper right corner pipe
└ \u2514 lower left corner pipe
┘ \u2518 lower right corner pipe
вход
Программа / функция будет принимать 3 значения ввода, которые могут быть собраны через параметры функции или предложены пользователю.
- Количество тиков
- Ширина экрана
- Высота экрана
Количество тиков
Для каждого тика, кусок трубы будет добавлен на экран. Трубы перезапишут старые части трубы, если они появляются в одной и той же позиции.
Например, возьмем экран размером 3х3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Всякий раз, когда труба выходит из экрана, как в последнем примере с 5 тиками, новая труба будет появляться на случайной границе. Например:
ticks == 6
│┐
└┘
─
Новая труба должна иметь 50% шанс быть горизонтальной или вертикальной.
Ширина экрана / высота
Ширина и высота экрана могут быть объединены в одно значение, если это предпочтительнее для вашего языка. Ширина и высота экрана всегда будут иметь минимальное значение 1 и максимальное значение 255. Если выбранный вами язык поддерживает консоль или экран вывода, размер которого меньше сетки символов 255x255, то вы можете предположить, что ширина и высота будут никогда не выходите за пределы вашей консоли. (Пример: окно Windows 80x25 cmd)
Выход
Вывод вашей программы / функции должен быть выведен на экран или возвращен из функции. Для каждого запуска вашей программы должен генерироваться другой набор каналов.
Контрольные примеры
Следующие тесты являются случайными примерами правильных выходных данных.
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
Очевидно, что чем больше тиков, тем труднее становится доказать правильность вашей программы. Следовательно, публикация GIF вашей работы будет предпочтительнее. Если это невозможно, пожалуйста, опубликуйте версию своего кода, которая включает распечатку вывода. Очевидно, это не будет учитываться при подсчете очков.
правила
- Это код-гольф , выигрывает самое короткое количество байтов
- Применяются стандартные лазейки
- Если в исходном коде вы используете символы канала Юникод, вы можете считать их одним байтом
Это довольно сложная задача, которую, возможно, можно решить многими творческими способами. Вам предлагается написать ответ на более многословном языке, даже если ответы уже есть в коротких esolangs. Это создаст каталог кратчайших ответов для каждого языка. Бонус за голосование за модные цветные гифки;)
Удачного игры в гольф!
Отказ от ответственности: я знаю, что символы Unicode не ASCII, но из-за отсутствия лучшего названия я просто называю это ASCII art. Предложения приветствуются :)
ascii-art
вместоgraphical-output
- ссылкаОтветы:
JavaScript (ES6), 264
266 274 281Подсчет символов рисования Юникода как 1 байт каждый. (Как указано в ОП)
Меньше гольфа
Анимированный тест
Примечание: пытаясь сохранить время анимации менее 30 секунд, большее количество тиков ускоряет анимацию
источник
Ничто так не говорит, ностальгия совсем как ...
QBasic, 332 байта
QBasic - правильный язык для этой задачи, потому что:
LOCATE
позволяет печатать в любое место на экране, перезаписывая то, что было ранееконкретика
Это гольф QBasic, написанный и протестированный на QB64 с отключенным автоформатированием. Если вы введете / вставите его в реальную среду разработки QBasic, он добавит несколько пробелов и расширится
?
доPRINT
, но он должен работать точно так же.Программа вводит три значения, разделенных запятыми: тики, ширина и высота. Затем он запрашивает случайное число семян. (Если это поведение неприемлемо, измените вторую строку на
RANDOMIZE TIMER
на +6 байт.) Наконец, он рисует трубы на экран.Максимальные размеры, которые можно ввести: 80 (ширина) на 25 (высота). Задание высоты 25 приведет к обрезанию нижнего ряда, когда QBasic скажет «Нажмите любую клавишу для продолжения».
Как?
TL; DR: много математики.
Текущая строка и столбец являются
r
иc
; текущее направлениеd
и предыдущее направлениеb
. Значения направления 0-3: вниз, вправо, вверх, влево. Арифметика переводит их в правильные значения шага дляr
иc
, а также правильные координаты края , чтобы начать.Поле для рисования персонажей
│┐└─┘┌
- это кодовые точки 179, 191, 192, 196, 217 и 218 в QBasic. Они выглядят довольно случайными, но для генерации чисел с какой-то (довольно запутанной, я не уверен, даже я понимаю) математикой по-прежнему используется меньше символов, чем для набора условных выражений.Код для изменения направления генерирует случайное число в диапазоне от -0,125 до 1,125 и занимает свое место. Это дает
-1
10% времени,0
80% времени и1
10% времени. Затем мы добавляем это к текущему значениюd
, mod 4. Добавление 0 сохраняет текущее направление; добавление +/- 1 делает поворот.Что касается потока управления, то
WHILE t ... WEND
это основной цикл; раздел перед ним, начиная с номера строки1
(1b=INT(RND*4)
), перезапускает канал со случайного ребра. Всякий раз, когдаr
иc
за окном, мыGOTO 1
.Покажите мне GIF!
Ну вот:
Это было сгенерировано несколько отличной версией с анимацией, цветом и автоматическим случайным начальным числом:
источник
Python 2,7,
624616569548552 байтаПервый параметр - это начальное число, одни и те же начальные числа будут генерировать одинаковые выходные данные, печатая каждый шаг с задержкой 500 мс.
повтори это
Пример запуска
будет выводить
подробная версия
источник
if x*y<0 or
.0.5
может быть уменьшен до.5
.import *
может бытьimport*
.''.join(k) for
имеет бесполезные пробелы. Вы также должны иметь возможность хранитьdict
переменную и вызывать ее каждый раз, когда вы ее используете. Не проверял, сколько это экономит, но, сохраняяdict(zip(a,b))
в лямбде, который выполняет работу для двух строк (a, b), он должен нарезать некоторые. +1.C (GCC / Linux),
402353352302300298296288 байтБлагодарим edc65 за сохранение направления в одном 4-битном числе.
Считывает ширину / высоту в stdin перед зацикливанием заставки навсегда. Например:
Или для полноэкранной заставки:
Для удобства чтения я добавил новые строки. Требуется машина Linux с терминалом, поддерживающим коды ANSI. Имеет цвета! Если удалить поддержку цвета, это будет стоить на 17 байт меньше.
источник
Рубин,
413403396 байтФункция, которая принимает количество тиков и ширину в качестве входных данных и возвращает последний экран в виде строки. Без сомнения, можно играть в гольф больше.
Смотрите его на repl.it: https://repl.it/Db5h/4
Чтобы увидеть его в действии, вставьте следующее после строки, которая начинается
b[n*w+n+m]=
:... затем назначьте лямбду переменной, например,
pipes=->...
и назовите ее какpipes[100,20]
(для 100 тиков и экрана 20x20).Ungolfed & объяснение
источник