Вдохновленный A014486 .
Вызов
Учитывая целочисленный ввод в основании 10, создайте представление для двоичного леса, соответствующего вводу. Представления включают в себя, но не ограничиваются ими, вложенные массивы и строки.
Как?
Преобразовать входные данные в двоичный. 1
s представляют ветви, а 0
s представляют листья.
Чтобы это было легче понять, давайте использовать 834
(1101000010 в двоичном виде) в качестве примера.
Начнем с первой цифры. Первая цифра - это 1
, поэтому мы рисуем ветви:
\ / 1
или как массив, {{1}}
Следующая цифра 1
, поэтому мы рисуем больше веток (мы идем слева направо):
\ / 1 \ / 1
или как массив, {{1, {1}}}
Следующая цифра 0
, поэтому мы помещаем лист:
0 \ / 1 \ / 1
или как массив, {{1, {1, 0}}}
Следующая цифра - это 1
, поэтому мы размещаем ветку:
\ / 0 1 \ / 1 \ / 1
или как массив, {{1, {1, 0, {1}}}}
Повторяя процесс, мы получаем следующее дерево после 8-й цифры:
0 0 \ / 0 1 \ / 1 0 \ / 1
или как массив, {{1, {1, 0, {1, 0, 0}}, 0}}
Для оставшихся цифр мы рисуем больше деревьев:
9-ая цифра - это 0
, поэтому мы помещаем листок (аааа, это молодой выстрел!)
0 0 \ / 0 1 \ / 1 0 \ / 1 0
или как массив, {{1, {1, 0, {1, 0, 0}}, 0}, 0}
Когда мы используем все цифры, мы получаем следующее:
0 0 \ / 0 1 \ / 1 0 0 \ / \ / 1 0 1
или как массив, {{1, {1, 0, {1, 0, 0}}, 0}, 0, {1, 0}}
Это выглядит странно, поэтому мы добавляем ноль для завершения дерева:
0 0 \ / 0 1 \ / 1 0 0 0 \ / \ / 1 0 1
или как массив, {{1, {1, 0, {1, 0, 0}}, 0}, 0, {1, 0, 0}}
Обратите внимание, что выравнивание массива дает исходное число в двоичном виде, но с добавленным нулем.
критерии
- Выходные данные должны четко показывать разделение деревьев и ветвей (если это не вложенный массив, объясните, пожалуйста, ваш выходной формат).
- Извлечение всех цифр из выходных данных должно быть идентично двоичному представлению входных данных (с добавленными нулями из вышеприведенного процесса).
Контрольные примеры
Выходные данные могут отличаться, если они соответствуют критериям.
0 -> {0} 1 -> {{1, 0, 0}} 44 -> {{1, 0, {1, {1, 0, 0}, 0}}} 63 -> {{1, {1, {1, {1, {1, {1, 0, 0}, 0}, 0}, 0}, 0}, 0}} 404 -> {{1, {1, 0, 0}, {1, 0, {1, 0, 0}}}} 1337 -> {{1, 0, {1, 0, 0}}, {1, {1, {1, 0, 0}, {1, 0, 0}}, 0}}
счет
Это код-гольф , поэтому побеждают младшие байты!
источник
Ответы:
JavaScript (ES6),
968980797473 байтаОпределяет функцию,
f
которая возвращает вложенный массив. HTML-код только для тестирования.источник
$&
, обходится без этого.replace
?» : PBefunge,
138117104 байтаПопробуйте онлайн!
объяснение
Строка 1 считывает число из стандартного ввода, а строка 2 преобразует это число в двоичную последовательность, которую она сохраняет в игровом поле в строке 10. Строки с 3 по 5 затем выполняют итерацию по этим двоичным цифрам, выводя соответствующее представление дерева при обработке каждой цифры. Стек Befunge используется для отслеживания глубины в дереве и того, сколько листового пространства осталось на каждом уровне, чтобы мы знали, когда создавать новую ветвь. Строки 6 и 7 обрабатывают окончательное
0
заполнение, чтобы заполнить любые пустые листья.Для того, чтобы по возможности играть в гольф, я удалил запятые с вывода, а также посторонние внешние скобки. Это все еще не побеждает решение Mathematica, но это было весело, пытаться.
Если вы хотите увидеть, как это выглядело в исходном подробном формате вывода, я сохранил более раннюю версию кода здесь (131 байт).
источник
Mathematica,
167161 байтАнонимная функция. Принимает число в качестве входных данных и возвращает произвольно вложенный список чисел в качестве выходных данных. Добавлены разрывы строк для ясности. Использует какой-то механизм, включающий продолжения, но я слишком устал, чтобы думать об этом больше.
источник
#[[1]]
чтобы#&@@#
сохранить байт.!#~FreeQ~1
вместо того, чтобы#~MemberQ~1
сохранить байт, а также.Mathematica,
11510910810498 байтГенерирует сообщения об ошибках, которые можно безопасно игнорировать. Выводит двоичный лес. Он немного отличается от примера вывода, потому что
1
этоHead
не первый элемент списка. (например,1[0, 0]
вместо{1, 0, 0}
)Безошибочная версия (104 байта)
объяснение
Преобразование ввода в список base-2. Сохраните это в
i
.SetDelay
f
следующее (оценивается всякий раз, когдаf
вызывается):Switch
заявление.Во-первых, если
i
пусто, выведите0
. Если нет, выведите первый элементi
и удалите его из списка. Используйте вывод в качестве управляющей переменной.Если управляющая переменная есть
0
, выведите0
. Если это так1
, вывод1[f, f]
(рекурсивный).Пока
i
не пусто, продолжайте звонитьf
. Выведите результат, завернутый вList
.пример
Альтернативное решение (120 байт)
Идентичен моему 104-байтовому решению, но преобразует выходные данные в формат, указанный в вопросе.
источник
Python 2,
133118117 байтЧастично рекурсивный, частично итеративный. Я попытался использовать целое число, но дерево начинается с самых значимых битов, поэтому я не думаю, что оно того стоит.
Попробуйте онлайн
источник
Java 8, 367 байт
Golfed:
Ungolfed:
источник
DUP , 84 байта (82 символа)
По причинам, связанным с игрой в гольф, я избавился от внешних фигурных скобок и запятых, потому что они не нужны для восстановления деревьев.
Пример выходов:
Объяснение:
Попробуйте это с помощью онлайнового интерпретатора DUP Javascript на quirkster.com или клонируйте мой GitHub-репозиторий моего интерпретатора DUP, написанный на Юлии.
источник