Учитывая положительное целое число N («виральность»), ваша программа должна создать ASCII-рисунок дерева с двумя ветвями длины N, идущими вниз и / или вправо от верхнего левого угла.
Направление, выбранное каждой ветвью после первой звездочки, может быть как вправо, так и вниз, и этот выбор должен быть сделан случайным образом 1 на каждом следующем шаге.
Например, если задано значение 5, результат может выглядеть следующим образом:
***
* ***
**
**
Две ветви могут касаться (находиться в соседних ячейках), но не перекрываться (находиться в одной и той же ячейке), поэтому не допускается следующее:
***
* *
*****
*
*
Примеры
Для ввода 1
единственно возможный вывод:
**
*
(Это будет присутствовать во всех допустимых выходных данных, так как если две ветви выберут один и тот же путь, они будут перекрываться.)
Возможные выходы для входа 3
включают в себя:
***
* *
**
**
***
*
*
Для ввода 7
:
****
* **
* **
*
***
*
Для ввода 10
:
****
* *
*********
*
*****
Это Код-гольф, поэтому самый короткий действительный ответ (в байтах) выигрывает.
1. Это должно быть равномерно случайным (то есть шанс 50/50 каждого направления), или настолько близко к равномерно случайным, насколько вы можете получить на обычном оборудовании.
0
s и1
s вместо пробелов и звездочек?Ответы:
CJam ,
5851 байтПопробуйте онлайн!
Основная идея состоит в том, что мы начинаем с,
[0 0]
а затем многократно добавляем либо 0, либо 1 к каждому элементу (следя за тем, чтобы они никогда не были равны, кроме как в начале, чтобы избежать дублирования), собирая все промежуточные результаты.Затем мы создаем большой массив массивов, где каждый подмассив содержит
*
индексы, заданные соответствующей парой в исходном массиве и пробелами везде.Это дает диагональные срезы выходной матрицы (где перемещение слева направо соответствует перемещению сверху вниз справа налево в фактической матрице).
Затем мы можем использовать
::a:.+
для «de-diagonalize» и получить результирующие строки:источник
Древесный уголь ,
3124 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Первоначально я думал, что будет проще сделать первый шаг случайным, но оказалось, что лучше сделать первую ветку предсказуемой. Объяснение:
Цикл дважды, используя индексную переменную
i
. (Это на самом деле перебирает неявный список, поэтому его можно изменятьi
внутри цикла.)Перейти к началу холста.
Цикл
N+1
раз.Напечатайте a
*
, но оставьте курсор вправо или ниже курсора в зависимости от значенияi
.Произведите рандомизацию значения
i
для следующей итерации внутреннего цикла.Если текущим символом является a
*
, это означает, что мы вторая ветвь, и мы пошли вниз, а не вправо, поэтому двигайтесь вверх вправо, чтобы исправить это. (Первая ветвь всегда начинается вниз, поэтому вторая ветвь всегда будет над ней, а это означает, что нам нужно только проверять наличие вертикального столкновения.)источник
N
размерные ветви, аN-1
размером :)Java 10,
273272268239 байтПопробуйте это онлайн здесь .
Спасибо Кевину Круйссену за игру в гольф 29 байтов.
Безголовая версия:
источник
do{}
немного изменил вещи внутри (и поместил их в первую часть цикла for). PS: В вашем первоначальном ответе0.5
можно было бы сыграть и в гольф.5
.Perl , 5 ,
208124122118 байт118 байт без перевода строки, отступов и комментариев. Берет N из стандартного ввода:
Попробуйте онлайн!
источник
2..$N
на1..shift
сейчас, а также сбрил несколько байтов.<>
иshift
вводя вместо аргументов и аргументы, и переупорядочивая их,rand
чтобы избежать паренсов. Вам не нужно оборачивать свое назначение@o
ни тем, ни другим. Я попытался использовать тот,@b=([],[]);
который, кажется, работает, но я не слишком много экспериментировал, поэтому я мог пропустить крайний случай. Надеюсь, они немного помогут!Python 2 , 204 байта
Попробуйте онлайн!
источник
Perl 5
-a
,97969392 байтаНе имеет права, вниз или вне диагонального смещения.
Попробуйте онлайн!
источник
PHP, 118 байт
требует PHP 5.4 или более поздней версии для оператора Elvis. Заменить
?:
с?1:
для более старых PHP.Запустите как трубу с
-nR
или попробуйте онлайн .источник
$argBak=$argn=
$argn
. В реальной среде$argn
приходит из STDIN, если вы запускаете его как канал-R
. Затем он выполнит код для каждой строки ввода (но я почти уверен, что PHP не сбрасывает переменные между ними; таким образом, явные последовательные запуски с большей вероятностью позволят избежать неприятных сюрпризов.)Красный ,
195190 байтовПопробуйте онлайн!
Удобочитаемый:
источник
Желе ,
504341 байтПопробуйте онлайн!
Это было действительно весело, чтобы написать. Там может быть гораздо более оптимальный метод. В этом методе, вероятно, есть и игра в гольф.
Сразу после публикации я понял, что могу использовать
,þ`
вместоaþ,""oþ`Ɗ
.источник
R ,
148142 байтПопробуйте онлайн!
Кроме того, хотя он не будет соответствовать выходной спецификации, вы можете различить две ветви: попробуйте онлайн!
Объяснение:
Начиная с индекса
1
, мы произвольно выбираем движение вправо или влево для ветвиr
, добавляяn
или1
, соответственно. Затем мы выбираем другое движение вправо или влево для веткиk
, и если оно будет пересекатьr
направление движения, мы выбираем другое направление. Затем мы используемr
и вk
качестве индексовm
, устанавливая эти значения как"*"
. Итерируяn-1
время, мы затем выводим результат.источник
Желе ,
3938 байтПопробуйте онлайн!
Хотя, казалось бы, не связано,
d
здесь полезно сохранить байт (по сравнению с моим предыдущим подходом).источник
Python 2 ,
191187176 байтПопробуйте онлайн!
Python имеет встроенную поддержку для комплексных чисел формы
a+bj
; это делает некоторые двумерные проблемы более податливыми ...источник