Кредиты для идеи конкурса идут в @AndrewPiliser. Его первоначальное предложение в песочнице было заброшено, и, поскольку он не работал здесь в течение нескольких месяцев, я принял вызов.
Сбалансированная троичная система является нестандартной системой счисления. Это похоже на троицу в том смысле, что цифры увеличиваются в 3 раза по мере того, как вы идете дальше влево - то100
есть9
и1001
есть 28.
Однако вместо значений 0, 1 и 2 цифры имеют значения -1, 0 и 1 . (Вы все еще можете использовать это, чтобы выразить любое целое число.)
Для этой задачи значение цифры +1
будет записано как +
, -1
будет записано как -
и 0
просто 0
. Сбалансированный троичный -
символ не использует символ перед числами, чтобы отрицать их, как это делают другие системы счисления - см. Примеры.
Ваша задача - написать полную программу, которая принимает 32-разрядное десятичное целое число со знаком в качестве входных данных и преобразует его в сбалансированную троичную форму. Никакие встроенные базовые функции преобразования любого вида не допускаются (Mathematica, вероятно, имеет одну ...). Ввод может быть на стандартном вводе, аргументах командной строки и т. Д.
Ведущие нули могут присутствовать на входе, но не на выходе, если только это не вход 0
, и в этом случае также должен быть вывод 0
.
Примеры
Это преобразования из сбалансированного троичного в десятичное; вам придется конвертировать в другую сторону.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
источник
Ответы:
Python 2: 58 символов
Создает сбалансированный троичный знак за цифрой с конца. Последняя цифра дается остаток
n%3
существа-1
,0
или+1
. Затем мы удаляем последнюю цифру и делим на 3, используя деление на пол Pythonn=(n+1)/3
. Затем мы продолжаем рекурсивно с новой последней цифрой, пока число не станет 0.Особый случай необходим для ввода ,
0
чтобы дать ,0
а не пустую строку.Спецификации не позволяют этого, но если бы можно было написать функцию вместо программы и вывести пустую строку для 0, было бы возможно решение с 40 символами.
источник
n*"."and
в случае только функции. Такжеprint s or 0
работает лучше: Ps or 0
. Я пыталсяn*"."and
, но это не удается, когдаn<0
.CJam, 24 байта
Я придумал это самостоятельно, и я думаю, что это, скорее всего, единственный способ справиться с этим.
Алгоритмически, это похоже на ответ xnor.
Попробуйте онлайн здесь
Как это работает :
источник
JavaScript (E6) 68
Полная программа, по запросу, с вводом / выводом через всплывающее окно. Ядром является функция R, 49 байтов.
Полагаю, не сильно отличается от других рекурсивных решений. Воспользуйтесь преимуществом автоматического преобразования между строкой и числом, чтобы избежать специального случая для «0»
Тестируйте в консоли FireFox / FireBug, используя только функцию R
Выход
источник
d=(n%3+3)%3
когдаd=n%3
дает то же значение дляd
?Pyth,
712423Это рекурсивное решение, основанное на 40-символьной рекурсивной функции @ xnor.
y
строит сбалансированную троичную часть входа, находя последнюю цифру, используя индекс mod 3, а затем использует тот факт, что остальные цифры равны сбалансированной троичной для (n + 1) / 3, используя расслоенное деление. Затем он вызывает функцию, возвращая результат, или 0, если ввод равен 0.Попробуй это здесь.
источник
Mathematica -
157154146128Версия для гольфа:
И с отступом для разборчивости:
Использование:
Выход:
Большое спасибо Мартину Бюттнеру за сокращение количества персонажей.
источник
Mathematica, 54 символа
Подобно рекурсии Xnor
Символы Unicode используются для замены
Floor
,Part
,!=
Выход
Сохранено
f
для краткости и написано без юникода, если вы не можете просмотретьисточник
GNU sed, 236 байт
Попробуйте онлайн!
объяснение
Первая половина кода (за исключением первой строки) переводит десятичную в одинарную форму и идет прямо из « Советов по игре в гольф в седе ». Затем он переводит унарный в сбалансированный троичный по одному триту за раз, что я продемонстрирую на примере работы вручную.
До окончательного вывода, тройные цифры
-
,0
и+
представлены!
,:
и+
, соответственно.Для интересного результата мы начнем с того
-48
, что был преобразован в одинарный (с-
неповрежденным). Чтобы вычислить первый (самый правый) трит, мы должны вычислить остаток 48 ÷ 3. Мы можем сделать это, заменив111
s на3
s:48 ÷ 3 не имеет остатка, поэтому
1
s не осталось, и мы знаем, что наш первый трит:
(0), поэтому мы заменим его:Теперь у нас есть наше «одно место», поэтому мы знаем, что оставшиеся
3
s представляют три места. Чтобы математика работала, мы должны разделить их на 3, то есть заменить их на1
s:Давайте еще раз проверим нашу математику: у нас 16 (одинарное
1111111111111111
) в тройке и ноль (:
) в одном месте. Это 3✕16 + 1✕0 = 48. Пока все хорошо.Теперь мы начнем снова. Замените
111
s на3
s:На этот раз наш остаток таков
1
, поэтому мы помещаем+
в тройку место и заменяем оставшиеся3
s на1
s:Время проверки работоспособности: у нас есть 5 (одинарные
11111
) в девятке, 1 (+
) в тройке и 0 (:
) в одном месте: 9✕5 + 3✕1 + 1✕0 = 48. Отлично! Снова мы заменяем111
s на3
s:На этот раз наш остаток 2 (
11
). Это занимает две trits (+!
), что означает, что у нас есть перенос. Как и в десятичной арифметике, это означает, что мы берем самую правую цифру и добавляем остаток к столбцу слева. В нашей системе это означает, что мы поместили!
девятку и добавили еще три слева, а затем заменили все3
s на1
s, чтобы обозначить 27-е место:Теперь у нас нет 3-х оставшихся, поэтому мы можем заменить любые оставшиеся унарные цифры на соответствующие им триты. Два (
11
) это+!
:В реальном коде это делается в два этапа
s/1/+/
иy/1:/!0/
для сохранения байтов. Второй шаг также заменяет:
s на0
s, поэтому он фактически делает это:Теперь мы проверяем, есть ли у нас отрицательное число. Мы делаем, поэтому мы должны избавиться от знака, а затем инвертировать каждый трит:
Наконец, мы заменим
!
s на-
s:Это оно!
источник
Stax , 17 байт
Запустите и отладьте его
Самый короткий ответ на данный момент, но он должен быть легко побежден некоторыми языками гольфа. Алгоритм такой же, как и у @ xnor's Python.
ASCII эквивалент:
источник
JavaScript
108102 (ES6, нет рекурсивных вызовов)Оригинальная запись на 108
Не так сложно, как ответ @ edc65 ... Буду признателен за любую помощь в дальнейшем сокращении этого ...
источник
Clojure, 242 байта
Это самый длинный ответ Clojure до сих пор?
Ungolfed (с комментариями):
источник
8th ,
179171167 символовЗдесь это полная программа в восьмом, которая принимает десятичное знаковое целое число в качестве входных данных и преобразует его в сбалансированную троичную
Тест
В первый раз программа запрашивает число для преобразования (при необходимости). Затем можно вызвать слово
f
для преобразования большего числа чисел, как показано в следующей строке:Выход
Объяснение кода
Это код для обработки ввода. Ядро кода находится внутри слова
f
. Вдали от поля для гольфа я бы использовал слово>bt
вместоf
. Вот это негольфированная версияf
(с комментариями):источник
Java,
327269 символовМоя первая попытка в коде в гольф. Я не знаю ни одного из этих действительно коротких языков, поэтому вот решение на Java. Буду признателен за совет по дальнейшему сокращению.
Попробуйте это здесь: http://ideone.com/fxlBBb
РЕДАКТИРОВАТЬ
Заменено
BufferedReader
наScanner
, что позволило мне удалитьthrows
предложение, но пришлось изменить импорт (+2 символа). ЗамененоInteger
наint
. К сожалению, программа не будет компилироваться, если ее нетString[] h
вmain
.источник
Scanner
вместо вашегоBufferedReader
. Кроме того,String[] h
и,throws java.lang.Exception
вероятно, в этом нет необходимости, и вы можете сэкономить еще несколько байтов, используяint
вместоInteger
.JavaScript (ES6), 51 байт
Перебирайте персонажей Сначала умножьте предыдущее общее количество раз на 3, затем, если isNaN (символ) - истина, преобразуйте строку (символ + «1») в число и добавьте ее, в противном случае ноль.
источник
Stax , 14 байт
Запустите и отладьте его
источник
05AB1E , 20 байтов
Попробуйте онлайн!
источник
APL (NARS), 26 символов, 52 байта
тест:
Возможно, это может быть меньше, если ⊥ используется, но это запрещено ...
источник