Очень вдохновленный этим испытанием Code Golf: Ваша собственная домашняя змея ASCII - я подумал, что если сделать это горизонтально, это добавит дополнительный уровень сложности.
Пример горизонтальной змеи:
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
И правила таковы:
- Ровно 5 строк символов напечатано
- Каждая строка ровно 30 символов, состоящая из комбинации пробелов и символа, который вы выбираете, чтобы нарисовать свою змею
- Ваша змея начинается на линии 3
- Следующая строка, которая будет использоваться для рисования вашей змеи, должна быть случайным образом выбрана из текущей строки, на одну строку выше (если вы еще не в строке 1) или на одну строку ниже (если вы еще не в строке 5).
- Эти выборы должны быть одинаково взвешены. Поэтому, если вы находитесь на линии 1, у вас есть 50% шанс остаться на линии 1 и 50% с вероятностью перейти на линию 2. Если вы на линии 2, у вас есть 33% шанс перейти на линию 1, а 33% шанс остаться на линии 2 или 33% шанс перейти на линию 3
- Ваша змея не должна посещать каждую строку.
Ответы:
JavaScript (ES6), 98 байт
Сохранено 7 байтов благодаря @KevinCruijssen
Возвращает массив из 5 строк.
Попробуйте онлайн!
комментарии
источник
d
и использовать((y%4?3:2)|0)-(y>0)
для -6 байтов. Попробуйте онлайн.1
Вnew Random(...)
подразумевается по умолчанию, конечно .. Попробуйте его в Интернете.!!y
вместо того, чтобы(y>0)
сохранять еще 2 байта.)Древесный уголь , 28 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Напечатайте некоторые отступы, чтобы форсировать 5 строк вывода.
Повторите 30 раз.
Напечатайте ноль (и двигайтесь горизонтально).
Если Y-координата равна 2, двигайтесь вверх случайным образом на 0 или 1.
Если это -2, двигайтесь вниз случайным образом на 0 или 1.
В противном случае двигайтесь вниз случайным образом на -1, 0 или 1.
источник
Perl, 68 байт
Это не чувствует себя оптимальным на всех.
источник
Желе , 24 байта
Попробуйте онлайн!
объяснение
источник
R 138 байт
Попробуйте онлайн!
Легко отстает от планнапа
источник
Python 3, 144 байта
@Ruts, @Turksarama и @mypetlion очень помогли уменьшить байты
Постараюсь улучшить это. Веселый вызов!
источник
l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else l
чтобыl+=random.randint(~-(l<1),l<4)
сохранить 31 байт.m=[[' 'for x in R(w)]for y in R(h)]
чтобыm=[list(' '*w)for y in R(h)]
сохранить 7 байтов.boolean
подклассint
. Так чтоFalse
можно использовать вместо0
иTrue
можно заменить1
. Это~
унарный оператор для побитового оператора,not
и-
оператор переворачивает знак (умножить на-1
). Так что~-(False)
оценивает-1
и~-(True)
оценивает до 0.m[2][0]=0
ушел) и 2 байта цикла for (for i in R(1,30):
становитсяfor i in R(30):
). Вам также нужно будет пересчитать l после того, как вы установите 0. Это должно привести к 144 байтам.R ,
120114 байтовСпасибо @Giuseppe за дополнительные 6 байтов!
Использует таблицу вероятностей следующим образом:
где каждый столбец соответствует случаю, то есть столбец 1 выбирается, если змея находится в строке 1, давая вероятности 0, 1/2 и 1/2 для выбора соответственно -1 [понижаться], 0 [оставаться неподвижным] и 1 [ идти вверх] (
sample
автоматически нормализует вероятности до 1), столбец 2 для строки 2 дает вероятности 1/3, 1/3 и 1/3 и т. д.Попробуйте онлайн!
источник
SOGL V0.12 ,
2221 байтПопробуй здесь!
Объяснение:
источник
Japt,
3129 байтВозвращает массив строк.
Попробуй это
источник
Japt , 26 байт
Проверьте это онлайн!
источник
Python 2 , 127 байт
Попробуйте онлайн!
источник
Октава с пакетом статистики, 99 байт
Он также работает в MATLAB с помощью панели инструментов статистики.
Попробуйте онлайн!
источник
Japt , 28 байт
Сохранено 9 байт благодаря ETHproductions
Попробуйте онлайн!
источник
SmileBASIC,
10710510389 байтЭтот ответ более интересен, чем вертикальный, из-за (буквальных) краевых случаев.
64 байта без пробелов:
Я также нашел несколько вариантов строки 2 с одинаковой длиной:
Целочисленное деление Y / 3 используется для проверки, находится ли Y вне допустимого диапазона, а также для получения знака.
источник
Java 8,
177170 байт-7 байт благодаря @ OlivierGrégoire .
Объяснение:
Попробуйте онлайн.
источник
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
сохранить несколько байтов.C (gcc) ,
134130 байтовПопробуйте онлайн!
источник
Python 3 , 123 байта
Попробуйте онлайн!
Создайте массив целых чисел, затем преобразуйте его в каждую строку.
Python 2 , 120 байт
Попробуйте онлайн!
Для Py2 избыточные парены для
exec
иprint
могут быть удалены, но синтаксис во 2-й строке недействителен.Превышение подачи как Py2 от Rod, так и Py3 от linemade .
источник
Рубин ,
9877 байтПопробуйте онлайн!
Лямбда, возвращающая массив строк.
Моим первоначальным импульсом было создание столбцов и их транспонирование, но гораздо проще избежать этого шага.
Я хотел бы инициализировать
a
с помощью[" "*30]*5
, но это сделало бы мелкие копии строк, в результате чего получилась очень толстая, не скользкая змея.Я мог бы использовать константу, например,D
в качестве приращения (для того же количества байтов), но Руби жаловался бы каждый раз, когда я назначал ее. Я решил, что предпочитаю снижение читабельности за счет повторного использованияi
середины цикла, чтобы игнорировать кучу предупреждений отладки.Я также хотел бы сэкономить несколько байтов сloop{x+=rand(3)-1;(0..4)===x&&break}
, но это вызвало бы смещение по краям: 1/3 шанса повернуть назад внутрь, 1/3 шанса остаться, и 1/3 шанса выйти за пределы для какое-то время, прежде чем в конечном итоге вернуться в случайном порядке (то есть «остаться»).-20 байт: используйте Ruby
Integer#[]
для создания крошечных условных выражений, обеспечивающих правильное взвешивание движения для всех 5 позиций. Это заменяет шаблон прерывания цикла (с ненулевым шансом сбоя остановки) для огромной экономии. Спасибо, Эрик Думинил !-1 байт: инициализировать
a
с помощью(0..4).map
вместо5.times
, еще раз спасибо Эрику Думинилу .источник
loop
. Вы можете рассчитать приращение с помощьюrand(2+14[x])-30[x]
илиrand -(30[x])..15[x]
. Там, вероятно, более короткая версия. Тем не менее, -20 байт не плохо! Попробуйте онлайн!x,a=2,(0..4).map{" "*30}
. Попробуйте онлайн!30[x]
это отличный трюк! Благодарность!Perl 6 , 85 байт
Попробуйте онлайн!
Выражение с длинными скобками - это ленивая последовательность, сгенерированная из начального элемента
(' ', ' ', 0, ' ', ' ')
, первой вертикальной полосы выходных данных. Каждая последующая полоса / список генерируется из предыдущего путем вызоваrotate
метода, причем смещение случайным образом выбирается из набора , содержащего0
,1
(если первый элемент не равен нулю), и-1
также (если пятый элемент не равен нулю).Матрица горизонтальных полос переставляется
[Z]
оператором, превращая его в список вертикальных полос, каждая из которых затемjoin
объединяется в одну строку и выводится с помощьюsay
.источник
Scala, 207 байт
образец:
degolfed:
Мое уникальное изобретение - ну, я до сих пор не читал о других решениях, чтобы генерировать Random (6), который неявно является двумя Randoms, (2 * 3). Если вдали от границы, я использую значения r / 2 (0,1,2) и → (-1,0,1), скажи мне, чтобы идти вверх или вниз. Если на границе, я могу избежать дорогостоящего вызова персонажа другого случайного персонажа и просто взять по модулю (2), чтобы решить, остаться мне или мне идти.
Давайте посмотрим на другие решения. :)
источник
java
?try it
ссылку? Кевин Круйссен не включил в себя какой-то шаблон, необходимый для компиляции этого кода или для его запуска в JShell, но я думаю, что это в соответствии с руководящими принципами - возможно, существует мета обсуждение. Если хотите, вы можете попытаться уменьшить этот код, также используя двумерный массив. Вторая идея состоит в том, чтобы уменьшить скользящий код в конце. Какой-то метод карты? Печать скрыта Кевином. - Да, Array дает улучшение на 8.Perl,
83101 байтНовое: без вероятности вопроса на границах:
Ungolfed:
источник
PowerShell , 133 байта
Попробуйте онлайн!
Создает двумерный массив из 30 пространств шириной 5 строк. (NB - если кто-то может придумать более эффективный способ инициализации этого массива, я буду <3 навсегда.) Устанавливает вспомогательную переменную
$l
в2
(это используется для той строки, на которой был предыдущий сегмент змеи). Затем переходит от0
к29
.Каждую итерацию мы устанавливаем для нашего элемента snake
0
. Затем мы индексируем в сложный массив,Get-Random
который выбирает, идти ли нам вверх или вниз или оставаться неизменным. Это добавлено обратно в$l
.Наконец, мы перебираем все пять элементов
$a
и-join
их внутренние элементы в одну строку каждый. Эти пять строк остаются в конвейере, и неявноеWrite-Output
дает нам новые строки бесплатно.источник
Clojure, 123 байта
А вот и парни:
Безголовая версия:
Создает список различных высот тела змеи, затем выполняет итерацию от 0 до 4. Всякий раз, когда высота соответствует текущей строке, она печатает 0, в противном случае - пробел. Не позволяя высотам выходить за границы, стоит байт. Также распознавание, когда новая строка в порядке, является более интенсивным байтом, как это и должно быть. Можно легко написать один
doseq
, составив декартово произведение х и у, но тогда не знаешь, когда печатать новую строку.источник
Python3 + NumPy,
137132 байтаНе самая короткая подача Python, не самая длинная и, безусловно, не самая быстрая.
update Используя
numpy
команду diff, мы сохранили 5 байтов для проверки, является ли змея допустимым шаблоном, по сравнению с вычислением разницы вручную с помощьюj[1:]-j[:-1]
.источник
C (gcc),
80767271 байтПопробуйте онлайн!
источник
f(r)
вместоr;f()
R , 95 байт
Следующая строка
x
всегда выбирается из строк, которые находятся на расстоянии не более 1 от текущей строки (l[abs(x-l)<2]
). Использованиеreplicate
вместоfor
цикла экономит некоторые байты, необходимые для инициализации матрицы и манипуляции с ней, и требует использования<<-
оператора при присваивании глобальной переменнойx
.Попробуйте онлайн!
источник
05AB1E , 25 байтов
Попробуйте онлайн!
объяснение
источник