Одной из многих уникальных особенностей языка программирования Malbolge является его крайне неинтуитивный OP
оператор, упоминаемый в документации и исходном коде только как «op», но широко известный как оператор «сумасшедший». Как описывает Бен Олмстед, создатель языка, в его документации: « не ищите шаблон, его там нет ».
op является оператором "tritwise" - он работает с соответствующими троичными цифрами своих двух аргументов. Для каждого трита (троичного бита) результат операции определяется следующей таблицей поиска:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Например, чтобы вычислить op(12345, 54321)
, сначала запишите оба числа в троичной форме, а затем найдите каждую пару тритов в таблице:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
Последний важный момент является то, что все значения в Malbolge 10 trits шириной, поэтому входные значения должны быть дополнены нулями до ширины 10. (например, op(0, 0)
находится 1111111111
в трехкомпонентном.)
Ваша задача - взять два целых числа 0 ≤ a
, b
<59049 в качестве входных данных и вывести целочисленное значение op(a,b)
.
Тестовые случаи (в формате a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Вот эталонная реализация (скопированная непосредственно из исходного кода Malbolge).
54616_3
это не значит, что «эта другая вещь - десятичное число 54616, но представлена как основа три». Это означает «Читать54616
как основание 3». Что, конечно, вы не можете сделать (есть цифры, на которые Valve не может сосчитать). Вероятно, было бы все так же ясно, если бы вы избавились от всего_3
, и более точным.Ответы:
C (gcc) ,
999896 байт19683
вL'䳣'
.108609
вL''
.Попробуйте онлайн!
источник
JavaScript (ES7), 56 байт
Попробуйте онлайн!
Как?
Учитывая и b в [ 0..2 ] , мы вычисляем:a b [0..2]
Ведущий к:
Выбор функции
Есть несколько других возможных функций-кандидатов вида:
Одним из самых коротких является:
Но хорошая вещь в состоит в том, что это может быть выполнено с побитовыми операторами, таким образом неявно отбрасывая десятичные части a и b . Вот почему мы можем просто разделить их на 3 без округления между каждой итерацией.( + 512 б + 8 ) a б 3
комментарии
источник
(1581093>>b%3*2+a%3*8&3)
сохраняет целый байт!a/3
иb/3
без округления. Это потерпит неудачу из-за этого.k = 9 ... => ~k && ...
чтобыk = 10 ... => k && ...
?for(k=9;k>=0;k--)
чемfor(k=10;k>=1;k--)
.05AB1E , 18 байт
Код:
Использует кодировку 05AB1E . Попробуйте онлайн!
Алгоритм Объяснение
Чтобы получить число, дополненное нулями, нам нужно добавить 59049 к обоим числам (потому что 59049 в троичной форме - 10000000000 ). Нам не нужно опускать ведущую 1 при . Мы конвертируем числа из десятичного в троичное и соединяем каждую пару в качестве каждого собственного числа.( 1 , 1 ) → 0
Например, для входных данных 12345 и 54321 они отображаются на:
Что дает следующий список объединенных чисел:
Эти целые числа должны отображаться с помощью данной таблицы поиска в OP. В настоящее время мы используем формулу, которая отображает эти числа в соответствующие им триты ( ):0 → 1 , 10 → 0 , …
Тогда как обозначает побитовую функцию xor .⊕
В конце концов, после сопоставления этой функции со списком соединенных целых чисел, мы рассматриваем этот результирующий список как число, представленное в базе 3, и преобразуем его из базы 3 в десятичную.
Код Объяснение
источник
3Tm+3Bø19sm74%3%3β
быть в гольф?R ,
6462 байтаПопробуйте онлайн!
Спасибо JAD за некоторые трюки в
черной магиии -2 байта!30801
при преобразовании в трехзначное трехзначное целое число,1120020210
которое просто добавляет конечный ноль в операционную таблицу при чтении столбцов. Затем мы конвертируем троичные цифрыa
иb
поэлементно в целое число и используем его в качестве индекса в троичных цифрах30801
.источник
x
используете индекс[.*]
. Тогда все%any%
операции происходят. Самое интересное в том, что если вы видите30801%/%x%%3
какf=function(x)30801%/%x%%3
, тоf(x[index]) == (f(x))[index]
. Сохранение брекетов :)C (gcc) ,
747271 байтПопробуйте онлайн!
Сломать
Таблица правды
Можно рассматривать как массив 3x3, где a - столбец, а b - строка. Преобразование этого в одномерный список дает нам 100102221. Чтобы сэкономить место, мы избегаем списков и строк и вместо этого превращаем их в число. Для этого мы переворачиваем порядок и преобразуем каждый трит в 2-битное число. Склейте их вместе, и мы получим двоичное число, к которому мы можем «проиндексировать», сдвинув вправо
2 * (b * 3 + a)
и замаскировав:Затем мы массируем выражение, используя силу действия приоритета, чтобы стать мерзостью выше.
3 ^ 9 = 19683, так что это хороший предел цикла. Поскольку мы умножаем счетчик на 3 каждый раз, мы можем записать предел2e4
вместо этого. Также мы спасаем себя от беспокойстваpow()
или подобного.Если подумать, давайте начнем с 3 ^ 10 и продолжим работу с предварительным циклом «разделяй и тестируй».
источник
Haskell , 108 байт
Попробуйте онлайн!
источник
APL (Дьялог) ,
4125 байт9 байтов сохранено благодаря @ Adám
Попробуйте онлайн!
источник
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Желе ,
2318 байт-1 спасибо Эрику Outgolfer (переставить
3*⁵¤
в⁵3*
)Монадическая ссылка, принимающая список из двух целых чисел.
Попробуйте онлайн! Или посмотрите тестовый набор .
⁹*%733%3
байт длиннее чемị⁽½Ṡb3¤
:(Как?
Кроме того, 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(использует магическую формулу после получения попарных тритов преобразования от базовой десятки, затем переводит 19 в эту степень, по модулю 74, по модулю 3, чтобы получить требуемые триты вывода - найденные с помощью поиска в Python)источник
y
0
встроен «prepend s»)Python 2 ,
79656361 байтспасибо Арно за его формулу (-2 байта).
Попробуйте онлайн!
источник
J 37 байт
Объяснение:
Закончился тем, чтобы быть относительно читабельным, TBH
источник
Python 2 ,
9087 байтПопробуйте онлайн!
источник
Древесный уголь , 31 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Альтернативное решение, также 31 байт:
Попробуйте онлайн! Ссылка на подробную версию кода.
источник
Рубин , 70 байт
Попробуйте онлайн!
Разлагается
a
иb
рекурсивно, пока мы не получим 10 цифр каждого.6883
дает сплющенный троичный стол (перевернутый). Восстанавливает из троичного в десятичное путем умножения на3**(10-l)
.источник
Cjam, 31 байт
Попробуйте онлайн!
источник
J , 43 байта
Это, конечно, можно играть в гольф дальше.
Объяснение:
Попробуйте онлайн!
источник
Stax , 22 байта
Запустите и отладьте его
источник
Pyth
26 2524 байтаСохранено 1 байт благодаря @ErikTheOutgolfer
Сохраните еще один байт, вдохновленный ответом @ JonathanAllan
Вход представляет собой список из 2 элементов
[a,b]
. Попробуйте это онлайн здесь , или проверьте все тестовые случаи здесь .источник
.T
может бытьC
.K (нгн / к) ,
2522 байтаПопробуйте онлайн!
источник
Джапт ,
2423 байтаПолучать мяч катится на бегу Джапта как языка месяца - я полностью ожидаю, что меня обойдут!
Принимает ввод в обратном порядке как целочисленный массив (т. Е.
[b,a]
).Попытайся
источник
Perl 5
-p
, 102 байтаПопробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
757260 байтПопробуйте онлайн!
версия без гольфа:
Оба
a
иb
преобразуются в десятикратные списки, а затем используются попарно в качестве двумерного индекса в справочную таблицу чисел{1, 0, 0, 1, 0, 2, 2, 2, 1}
. Результат снова интерпретируется как десятикратный список и преобразуется обратно в целочисленную форму.Таблица поиска закодирована как
IntegerDigits[6883,3]
, что коротко, потому что мы перерабатываемIntegerDigits
символ.источник