Мне нравится играть в гольф dc
, но я иногда расстраиваюсь, потому что dc
у меня нет побитовых операций.
Вызов
Обеспечить четыре названные функции , которые реализуют эквивалент операций с поразрядными &
, |
, ~
и^
(побитовое AND, OR, NOT и XOR). Каждая функция принимает два операнда ( ~
занимает только один), которые представляют собой как минимум 32-разрядные целые числа без знака. Каждая функция будет возвращать целое число без знака той же битовой ширины, что и операнды.
ограничение
Вы можете использовать только те операции, которые поддерживаются dc
. Эти:
+
-
*
/
Арифметическое сложение, вычитание, умножение и деление~
по модулю (или divmod, если ваш язык поддерживает это)^
экспоненцирование|
модульное возведение в степеньv
квадратный корень>
>=
==
!=
<=
<
стандартные операторы равенства / неравенства>>
<<
операторы сдвига битов.dc
не имеет их, но так как они тривиально реализуются с точки зрения деления / умножения на степени 2, тогда я позволю это.
Управляющие структуры в dc
могут быть неуклюже построены с использованием (рекурсивных) макросов и (в) операций равенства. Вы можете использовать любые встроенные управляющие структуры вашего языка.
Вы также можете использовать логические операторы &&
||
!
, даже если они не доступны напрямую в dc
.
Вы не должны использовать операторы побитового &
, |
, ~
и ^
или любые функции , которые реализуют их тривиальными.
Кроме того, вы не должны использовать встроенные операторы или функции базового преобразования строк.
Также рассмотрите возможность предоставления тестовой программы или фрагмента онлайн-компилятора (не включенного в счет по гольфу), чтобы подтвердить свой ответ.
источник
Ответы:
С, 134
Препроцессор C довольно забавный, чтобы злоупотреблять. В основном этот макрос определяет 3 функции,
a
,o
, иx
, дляand
,or
иxor
соответственно. Единственным отличием в алгоритме этих операций являются критерии установки бита в результате.not
это функцияn
.Программа тестирования (занимает много времени, я вообще не тратила время на ее оптимизацию, но она тестирует все возможные тесты, кроме связанных с MAX_INT):
источник
ised 76 байт
ised также не имеет побитовых операций - обычно это раздражает, но теперь приветствуется, потому что нам действительно нужно их реализовать.
Функции будут храниться в пронумерованных слотах памяти (без подробных имен).
Преобразование в двоичный код и из него:
НЕ может быть,
@1{:$6::{1-$5::x}:}
но, очевидно, проще просто вычесть:ИЛИ:
И:
XOR:
Это приведет нас к 156 байтам (с символами новой строки и точкой с запятой). Тестовый код будет просто (NOT, OR, AND, XOR подряд, найден под именами $ 1, $ 2, $ 3, $ 4):
Но, конечно, ИЛИ и НЕ - это все, что нам действительно нужно, и все можно упростить:
Это 109 символов. Когда пропускаются символы новой строки и точки с запятой, и мы немного больше играем в гольф, у нас 76 символов:
источник
Ним
(537)(490)Nim Compiler 0.10.2
Я искал причину, чтобы научиться Ним, так что поехали.
Для кода гольф, я использовал переменные параметры и неявные доходы. Переменные параметры, согласно документации , менее эффективны в стеке. Лично мне труднее читать неявные возвраты и, вероятно, использовать их только в тривиальных процедурах.
Что касается алгоритмов, они достаточно просты. Для всех операций, кроме NOT, мы сравниваем каждый бит и вручную сравниваем их с нашей ожидаемой таблицей истинности. Установите каждый бит по мере необходимости в нашей выходной переменной. В Nim результатом является неявное возвращаемое значение.
Я не был уверен, разрешили ли нам использовать встроенные OR и AND для утверждения двух логических условий, поэтому вместо них была создана процедура notZero.Все еще ищу лучший метод ...
Вот версия без сквоша плюс полный тестовый жгут для запуска на собственной машине.
Если вы просто хотите запустить несколько входов, вот тестовый пример lite .
источник
CJam, 71 байт
объяснение
Тестирование
Этот код проверяет выполнение каждой из функций my и, or, not и xor 100 раз с равномерно распределенными 64-разрядными входами без знака и сравнивает результат с результатом, полученным встроенным оператором. Из-за необоснованного использования оператора eval, он довольно медленный и может занять около минуты у онлайн-переводчика. Но если все идет хорошо, выполнение должно заканчиваться без вывода, потому что все найденные расхождения печатаются.
источник
JavaScript
294267Был в состоянии побрить еще несколько байтов с предложениями @ AlexA. И @ kennytm.
Функции:
пример:
выход:
источник
for
и заменитьfunction B(n,m,t)
наB=(n,m,t)=>
. Аналогично для других функций.4*(1<<30)
для 4294967296 и-1>>>0
для 4294967295.var
truly здесь действительно необходимо? ③ вы можете написать(n,m)=>B(n,m,'a')
вместо(n,m)=>{return B(n,m,'a')}