Wise - простой побитовый язык, который я разработал некоторое время назад. Он основан на побитовых операциях Python . Он имеет несколько операций, большинство из которых совпадают или очень похожи на эквивалентные символы в Python.
:
Дублируйте вершину стека?
Поверните верх стопки к низу!
Поверните дно стека к вершине[
]
цикл в то время как вершина стека не равна нулю~
не вершина стека (-(n+1)
)-
отрицать вершину стека (-n
)>
сдвиг вершины стека один раз вправо (n//2
)<
сдвиг вершины стека один раз влево (n*2
)^
xor два верхних элемента стека (такие же как Python )|
или два верхних элемента стека (такие же как Python )&
и два верхних элемента стека (такие же как Python )
Сделать целое число в Wise довольно просто, вы можете сделать ноль с помощью ::^
и увеличить его, ~-
чтобы сделать ноль и увеличить его несколько раз. Однако если мы уберем -
вещи, станет немного интереснее.
Мы все еще можем сделать каждое число, используя оставшиеся операции. Например вот 3
~<<~
Это работает, потому что ~
превращает ноль, бесконечную строку 0
битов, в отрицательную, бесконечную строку 1
битов, каждый <
добавляет 0
бит до конца, когда мы закончим, мы делаем, ~
который превращает каждый его в строку 0
s, за которой следуют два 1
s или, как большинство людей называют это 3.
задача
Напишите программу, которая при получении положительного целого числа выведет программу Wise, которая создаст число n
без какого-либо -
источника (источник вывода вы можете использовать -
в своем собственном источнике). Вы можете предположить, что на вершине стека уже есть ноль.
Это код-гольф, а не мета-гольф, поэтому вы должны стремиться минимизировать генерацию исходного кода, а не обязательно вывод.
Пример выходов
Этот список не является исчерпывающим, они просто возможные выводы
1 -> ~<~
2 -> ~<~<
3 -> ~<<~
4 -> ~<~<<
5 -> ~<~:<<|
6 -> ~<<~<
7 -> ~<<<~
8 -> ~<~<<<
9 -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<
источник
positive integers
:
применяется на пустой стек толкает0
. Я думаю, что это должно быть указано, так как не очевидно, что дублирование из пустого стека должно дать0
Ответы:
Japt , 10 байт
Попробуйте онлайн!
Основная идея: взять двоичное представление числа, и карты
0
в<
и1
к~<~
. Выходы на 1-10:источник
~~
JavaScript (ES6),
3433 байтаРаботает для любого 32-разрядного целого числа.
источник
Haskell , 38 байт
Я чувствую, что PPCG действительно улучшает мой Haskell. Поглаживает белого кота.
f
принимаетInt
и возвращаетString
.Попробуйте онлайн!
(
<$f
Кстати, я имею в виду это . Это спасает персонажа\_->
).Альтернативно, такой же длины, но меньше зла (
(l!!)
это анонимная функция):Попробуйте онлайн!
Оба из них используют то же представление, что и ответ @ETHproductions 'Japt, хотя особенно первый может дать несколько избыточных
<
s в начале.Первый вычисляет все комбинации
n
"<"
и"~<~"
строки, затем индексирует в результирующий список.Второй рекурсивно вычисляет бесконечный список, сформированный, начиная с,
""
а затем создавая новые элементы, добавляя"<"
и добавляя"~<~"
строки к каждому элементу, уже находящемуся в списке (на самом деле, он был немного короче, чтобы можно""
было превратить в"<"
).источник
<$f
работает? Какой-то странный экземпляр функтора?Рубин ,
11811610910710591 байтСохранено 2 байта благодаря Cyoce!
Попробуйте онлайн!
Это функция, которая принимает целое число в качестве входных данных и возвращает строку, которая представляет это целое число в Wise. Вы можете найти ungolfed версию здесь , которая проверяет эту программу на всех целых чисел от 1 до.
Основная идея состоит в том, чтобы записать «пул» констант. Затем, с каждым «шагом», константы добавляются в пул для каждой возможной функции. Я выбрал функции
~
,<
и>
, которые я считаю достаточными для представления каждого числа. (По крайней мере, каждое число до 10000).источник
dup
вместоclone
iircdup
?map
не изменяет свой приемник.Python2,
545251 байт.Спасибо Wheat Wizard за сохранение 2 байта и Орджану Йохансену за один байт! При этом используется та же идея, что и в ответе Japt ETHproduction, но с другими заменяемыми строками (т. Е. Используется двоичное представление)
источник
[
]
вокруг генератора внутриjoin
.join
может взять генератор в качестве аргумента.'>~<~'*int(i)
может сэкономить вам байт.05AB1E , 11 байт
Попробуйте онлайн!
Аналогично ответу ETHproductions 'Japt.
Сохранено 4 байта благодаря @Adnan!
источник
'
). Вы также можете использовать индексирование, которое должно дать вам 11 байтов :).0
на нулевой элемент и1
на первый элемент (потому что он автоматически векторизуется). Вот более четкий пример того, как это работает.Python 2 ,
123110 байтПопробуйте онлайн!
Также как
lambda
Попробуйте онлайн!
Может быть короче, но вот мое решение. Он принимает двоичное представление и превращает его в код.
источник
Japt , 23 байта
Попробуйте онлайн!
источник
Желе,
1110 байтЭто портированная версия ответа ETHproductions 'Japt. Говоря о продуктах ETH, они спасли мне один байт!
источник
<
, который в Wise производит 0~<~
мне