Итак, я написал себе однострочник, который распечатал змею на консоли. Это немного забавно, и мне было интересно, как я могу сжать мой код ...
Вот (короткий) пример вывода:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Вот технические характеристики:
- В каждой строке один непробельный символ (какой вам нравится) выводится на консоль, первоначально с отступом от 29 до 31 пробела слева от него.
- На каждой итерации между этими тремя действиями принимается случайное решение
- Количество отступов уменьшается на 1
- Количество отступов остается прежним
- Количество отступов увеличивается на 1
Сделайте это 30 раз, чтобы напечатать 30-сегментную длинную змею на консоли.
Самый короткий ответ в байтах побеждает.
Ответы:
05AB1E ,
1514 байтовПопробуйте онлайн!
Использует
0
.объяснение
источник
Случайный Brainfuck ,
123 122121 байтПопробуйте онлайн!
Random Brainfuck - это расширение brainfuck, с полезным добавлением
?
команды, которая устанавливает текущую ячейку в случайный байт. Это печатает змею из!
s, которая, как ни странно, больше похожа на шаги, чем на змею.Как это работает:
Другое решение, которое придерживается буквы вопроса, а не духа.
87 байт
Попробуйте онлайн!
Этот сильно смещен в сторону того, чтобы оставить заполнение в покое, но увеличение или уменьшение заполнения оба одинаково возможны. Каждый из них имеет шанс чуть менее 1 к 256.
источник
?
команде. +1?
доступен только в случайном Brainfuck , не классический BrainfuckС (ССЗ) ,
615856 байтОтвет отредактирован, чтобы отразить изменения правил ...
Попробуйте онлайн!
источник
s+=1-rand()%3
к функции printf.i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Сетчатка , 24 байта
Попробуйте онлайн!
объяснение
Инициализируйте рабочую строку в первой строке, то есть 30 пробелов и a
+
.Во второй строке есть пробел.
-29{
оборачивает оставшуюся часть программы в цикл, который выполняется 29 раз.¶<
печатает рабочую строку в начале каждой итерации цикла с завершающим переводом строки. Сам атомный этап вставляет пробел в начале строки (основная идея состоит в том, чтобы вставить один пробел, а затем случайным образом удалить 0–2 пробела, потому что это на байт короче, чем случайный выбор между удалением, вставкой и отсутствием операции).Это сопоставляет пустое регулярное выражение с вводом, что дает нам каждую позицию между символами (и началом и концом строки). Затем
,2
сохраняются только первые три совпадения, то есть совпадения после нуля, одного и двух пробелов.@
выбирает случайный один из этих трех матчей. Затем split stage (S
) разбивает входные данные вокруг этого совпадения. И это1
говорит о том, чтобы сохранить только вторую часть раскола. Другими словами, мы отбрасываем все до нашего случайного совпадения.30-я строка, которая является результатом последней итерации цикла, печатается неявно в конце программы.
источник
VBA,
605949 байтВставьте его в окно «Немедленно» и нажмите «Ввод». (Убедитесь, что явное объявление отключено!)
Гораздо вероятнее двигаться, чем оставаться в очереди (то есть действия не имеют одинакового веса), но это не было определенным требованием (К счастью!)
{РЕДАКТИРОВАТЬ} Сохранено 1 байт, удалив пробел между
=1
иTo
{EDIT2} Сохранено 10 байтов благодаря комментарию remoel
Старые версии:
источник
String(i," ")
иSpc(30+i)
затем удаливi=30:
. Или -1 байт, удалив&
. :)C # (.NET Core),
1121101061009998 байт-1 байт благодаря @raznagul .
-1 байт благодаря @auhmaan .
Объяснение:
Попробуйте онлайн.
источник
new Random().Next()
несколько раз локально (.net Framework версии 4.6.1), я всегда получаю один и тот же результат. Мне нужно добавитьThread.Sleep(10)
между вызовами, чтобы надежно получить разные результаты. При времени сна менее 10 мс я иногда получаю тот же результат. Поэтому .net-Framework и TIO (.net-Core) имеют разные PRNG или, по крайней мере, используют разные начальные числа. Если я переключаю вашу программу в TIO на C # -mono, я получаю то же поведение, что и локально в .net-Framework.new Random()
использует время в качестве начального числа, поэтому в тесном цикле время одинаково, и поэтому результат одинаков.Thread.Sleep(10)
чтобы надежно получить разные результаты, иThread.Sleep(1)
даже 9 мс недостаточно.C, 56 байтов
Попробуйте онлайн!
Объяснение:
C (gcc) , 55 байтов
Зависит от f, «возвращающей» значение, присвоенное n в функции, что является неопределенным поведением, но работает согласованно с gcc, когда оптимизация не включена.
Попробуйте онлайн!
источник
JavaScript (ES8),
636260 байтВключает завершающий перевод строки.
*2-1
может быть заменено-.5
на 1-байтовое сохранение, но вероятность того, что длина каждой строки будет такой же, как и у предыдущей строки, будет значительно увеличена. Конечно, поскольку «случайный» не определен в задаче, RNG может быть замененnew Date%3-1
на общее количество байтов 55 .Спасла байт благодаря тому, кто удалил свой комментарий, прежде чем я смог поймать имя. Я бы на самом деле пытался это так с
repeat
и ,padStart
но не думаю , чтобы попробоватьpadEnd
- не знаю , почему!Показать фрагмент кода
бонус
Для того же количества байтов, вот версия, которая принимает количество начальных пробелов и итераций в качестве входных данных.
Показать фрагмент кода
источник
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``
на один байт короче. (Примечание: Так как SO не допускает разрывы строк в комментариях, мне пришлось печатать \ n вместо фактического использованияy=31
первая строка может быть слишком короткой. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…Java 8,
8987 байтПервый гольф, я уверен, что это может быть намного лучше ..
Редактировать: Исправлена первая строка благодаря Steadybox .
Попробуйте онлайн!
источник
Python 2 ,
836564 байтаПрямой подход:
Попробуйте онлайн!
Спасибо @Rod за сохранение нескольких байтов! Спасибо @ovs за -1 байт!
Редактировать: изменил имя переменной и строку вывода на букву 's'
Более змеевидный вывод для 88 байтов:
источник
APL (Dyalog) , 20 байтов
1 байт сохранен благодаря ngn
Попробуйте онлайн!
источник
¯2+
--->2-
Древесный уголь , 14 байтов
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Было бы только 10 байтов, если не было начального требования отступа.
источник
PHP, 61 bytes
Try it online!
источник
$i<30;$i++
можно$i++<30;
сохранить 2 байта.for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');
(\n
считается как 1 символ и должен быть заменен реальным переводом строки)for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Ява 8,
131129127126119108101 байтОбъяснение:
Попробуйте онлайн.
Старый 119-байтовый ответ:
Объяснение:
Попробуйте онлайн.
источник
R ,
726967 байтСпасибо Захиро Мор за 2 дополнительных байта!
Попробуйте онлайн!
источник
sample(3,29,T)-2
наrunif(29,-1,1)
уменьшает число байтов на 2, но ходы уже не так вероятны. И не могли бы выpaste("%"
вместо этого переключитьсяpaste0("% "
или я что-то здесь упускаю?% 30 s
а не% 30s
. Как вы сказалиrunif
, испортит вероятности.sprintf("%30s")
,sprintf("% 30s")
иsprintf("% 30 s")
вернуть те же результаты для меня. Но на TIO только первые два имеют одинаковые результаты, поэтомуpaste0("%"
следует сохранить байт. И не требуется, чтобы каждый ход имел одинаковую вероятность.Japt , 13 байт
Возвращает массив строк.
Попробуй это
объяснение
бонус
Для 2 байтов меньше , вот версия, которая принимает количество начальных пробелов и итераций в качестве входных данных.
Попытайся
Альтернативные ГСЧ
Последние 4 байта можно заменить любым из следующих:
источник
-1
RNG возвращает на первой итерации, мы получим общую длину строки,29
когда это должно быть30
,31
или32
.30
а затем добавить-1
,0
или1
давая нам29
,30
или31
- добавить"
и что дает нам полную длину30
,31
или32
для первой линии.Swift , 101 байт
объяснение
Полная программа. При этом используется довольно странный прием:
arc4random()
он входит в составDarwin
модуля, ноUIKit
также поставляется с этой установленной функцией, поэтому он сохраняет байт :) Также используется один из моих советов по игре в гольф Swift для повторения строк произвольное количество раз.источник
for _ in 0 ... g
выполняет ли блок кода 29 раз вместо 30 (цикл от 0 до 29 (исключая))?0...g
генерирует все целые числа в [0; г] . Мой плохой, исправил объяснение.0..<g
сгенерирует целые числа в [0; г) : P[0; g)
ты редактировал[0; g]
действительно смутил меня. :) Хм, но разве нельзя начать сg=30
и зацикливаться[1; g]
в этом случае?[0; g)
или[1; g]
определенно будет возможно, если я выберуg=30
вместо этого, но затем егоprint(...,0)
нужно изменить наprint(...+"0")
, потому что перед (0) будет добавлен дополнительный (посторонний) пробел перед 0. В любом случае, количество байтов остается неизменным.Perl, 36 байт
источник
say
для вычитания. Правильно ли я думаю, что это не меняет количество прогонов при$#a
увеличении, потому что это не ссылка?map
который, кажется, сначала размещает элементы в стеке.for
не имеет и имел бы непредсказуемую длину циклаperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'
, но это иногда (не каждый раз) приводило к ошибке сегментации. Может ли это быть ошибка в Perl v5.22.1 и v5.16.3?Р,
5453 байтаИдея та же, что и выше , но с укороченным
sprintf
кодом и более коротким символьным строковым литералом. Вместо\n
(два байта) я использую буквальный разрыв строки (один байт).Try it online!
источник
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number.
Я использовал вsprintf
течение многих лет и почему-то всегда пропускал эту часть ... Спасибо за напоминание!Рубин ,
4539 байтПопробуйте онлайн!
модифицирующий
x
во время цикла не влияет на счетчик цикла. Я выбрал S в качестве особенно змеиного выходного персонажа.-6 байт: использовать
rand(3)-1
вместо[-1,0,1].sample
. Спасибо, Эрик Думинил !источник
x.map
вместоx.times
(эквивалентно, поскольку вы не используете возвращаемое значение)rand -1..1
на пять байтов короче, чем[-1,0,1].sample
rand(3)-1
на 6 байтов меньше.(x=30).times{puts' '*x+?+;x+=rand(3)-1}
(того же размера) напечатает ровно 30 пробелов для головы змеи в соответствии сSenseTalk ,
237198 байтЭто язык, который я узнал и полюбил около десяти лет назад. Это язык сценариев, который управляет инструментом автоматического тестирования Eggplant Functional . Я много лет был заядлым пользователем инструмента, прежде чем некоторое время приходить в компанию. Это не самый подходящий язык для игры в гольф, но я считаю, что писать на нем очень приятно. Игра в гольф на самом деле довольно сложная, так как язык должен быть многословным и похожим на английский ... мне потребовалось немало времени, чтобы его освоить до 237 байт.
Ungolfed / Пояснение
Изменить: 36 байтов сохранено благодаря @mustachemoses
источник
J , 23 байта
Попробуйте онлайн!
источник
PowerShell , 42 байта
Попробуйте онлайн!
Петли от
1
до$l=30
. Каждая итерация мы помещаем$l
пространство плюсx
на трубопровод в виде строки, а затем+=
либо из на-1, 0, 1
основеGet-Random
в$l
течение следующего цикла. Эти строки собираются из конвейера, и неявныйWrite-Output
дает нам разделенный строкой список бесплатно.источник
Баш, 53
Попробуйте онлайн .
источник
p+=RANDOM%3-1
тоже работаетЖеле , 18 байт
Попробуйте онлайн!
Выбранный персонаж - 0 . Если разрешен возврат списка списка символов, то
Y
можно отбросить, а отправка может быть превращена в цепочку niladic для 17 байтов . Альтернатива .Как это работает
Желе , 16 байт
Объединяя мои решения, решения Эрика и Джонатана, мы можем увеличить это до 16 байт. Выбранный персонаж - 1 .
Попробуйте онлайн!
Спасибо Джонатану Аллану за хедз-ап (вкл
Ṭ€o⁶
).источник
Ṭ€o⁶
вместо того,⁶ẋ;€0
что делает мой 18-ти байтовый, и получать до 17.Октава ,
53 51 5049 байтовПопробуйте онлайн!
Сохранено 1 байт, больше не делать циклов. Сохраненный другой , как октава имеет
printf
, а такжеfprintf
.Этот новый код создает массив из 30 случайных чисел в диапазоне
-1:1
. Затем он кумулятивно суммирует массив и добавляет 30, что дает желаемую последовательность.Результат распечатывается с использованием
fprintf
с использованием формата, который гласит: «Десятичное число, дополняемое до указанной ширины, за которым следует новая строка. Ширина будет первым введенным значением, а десятичное число будет вторым введенным значением. Если число Если значения введены больше, Octave будет автоматически повторять печать, чтобы получить желаемый результат.Тогда, чтобы добиться зацикливания, нам нужно только чередовать нули между массивом последовательностей, поэтому
fprintf
функция использует каждое значение в последовательности как ширину, а каждый ноль - как цифру для печати.Печатает вывод как:
Приведенный выше код не всегда печатает ровно 30 пробелов в первой строке. Это будет либо 29, 30, либо 31. Чтобы исправить это, вы должны использовать эту 53-байтовую версию:
источник
x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Lua,
8175 байтовВ
for i=1,n ...
на to_expn
вычисляется только один раз перед входом в цикл, экономя один байт.-6 спасибо @ user202729
Попробуйте онлайн!
источник
Python 3.6 ,
847369 байтовСпасибо @WheatWizard за -11 байтов. Спасибо @JoKing за -4 байта.
источник
i
вы можете использоватьfor i in[1]*30
вместо этого для сохранения байтов.from random import*
чтобы вам не нужноrandom.
позже. И вы можете удалить символ новой строки после вашего:
.30
к можно заменить .29
"+".rjust(x)
" "*x+"+"
[1]*30
на,[1]*x
потому что это на один байт короче.ES5,
979581 байтES5,
11298 байт, если нужен формат функции:источник
_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
join(" ")
наjoin` `
красный , 54 байта
Попробуйте онлайн!
источник