Ваша цель - определить, делится ли число на 3 без использования условных выражений. На входе будет 8-битное число без знака от 0 до 255. Творчество приветствуется!
Вам разрешено использовать ТОЛЬКО
Равенство / Неравенство (
==
,!=
,>
,<
,>=
,<=
)Арифметика (
+
,-
,x
)Логические операторы (
!
не,&&
и,||
или)Побитовые операторы (
~
не,&
и,|
или,^
исключающий,<<
,>>
,>>>
арифметические и логические левые и правые сдвиги)Константы (было бы лучше, если бы вы держали эти маленькие)
Переменная присваивание
Выведите, 0
если false, 1
если true.
Применяются стандартные правила атомного кодекса. Если у вас есть какие-либо вопросы, пожалуйста, оставьте их в комментариях. Примеры методов здесь . Токен - это любой из вышеперечисленных, за исключением констант и переменных.
Ответы:
C - 2 жетона
Кажется, работает до 2 31 -1.
Кредиты
zalgo("nhahtdh")
для мультипликативной обратной идеи.источник
<=
работает, и вспомнил, что 0xAAAAAAAB принимается заunsigned int
тип, поэтому результат умножения не подписан.Python,
32 токенаРешение грубой силы, но оно работает.
Спасибо Говарду за сокращение на 1 токен.
источник
0x9......>>x&1
.C -
54 (?) ТокеновРаботает для любого 32-разрядного числа без знака .
Этот код использует мультипликативный обратный по модулю 2 32 делителя для преобразования операции деления в операцию умножения.
редактировать
Мое решение (опубликованное через 2 минуты) имеет тот же дух, что и решение aditsu. Благодарим его за использование
==
которое улучшает мое решение на 1 жетон.Ссылка
источник
Bull
: PC - 15 (?) Токенов
Так как 4 ≡ 1 (мод 3), мы имеем 4 n ≡ 1 (мод 3). Правило суммирования цифр не ограничивается суммированием цифр, но также позволяет нам произвольно разбивать число на последовательности цифр и суммировать их все при сохранении конгруэнтности.
Пример в базе 10, делитель = 9:
1234 ≡ 12 + 34 ≡ 1 + 2 + 3 + 4 ≡ 123 + 4 ≡ 1 (мод 9)
Все утверждения в программе используют это свойство. На самом деле его можно упростить до цикла, в котором оператор выполняется
n = (n & 0x3) + (n >> 2);
до тех порn < 4
, пока оператор просто разбивает число в base-4 на наименее значащую цифру и добавляет 2 части.источник
n = (n & 0x3) + (n >> 2);
результат уменьшается до 3 бит, и повторение заставляет его оставаться только 2 бита stackoverflow.com/a/3421654/995714Python (2 токена?)
Или
Или
источник
JavaScript - 3 токена
Это злоупотребляет тем фактом, что использование побитовых операторов для числа обрезает его до целого числа в JavaScript.
источник
=
,*
,|
,==
C - 4 жетона
Работает до 383.
Предыдущая версия (большие константы):
Работает до 1535
источник
Баш - ???
Не уверен, как это оценить.
например
источник
Befunge 93 - 5 жетонов
Исправлено - разделение удалено.
Получает ввод, продолжает вычитать 3 до тех пор, пока он не станет меньше 0, направить указатель вверх ('|'), а затем добавить 3. Если значение равно 0, указатель перемещается вправо (" 1. @" выводит "1"), в противном случае перемещается влево («@. » выводит «0»). '@' завершает программу.
источник
Партия - 7 жетонов
я думаю
Возвращает,
1
если данное число (как stdin) делится на три.источник
Рубин, 6 (?) Жетонов
Я действительно не знаю, как считать жетоны. ОП, ты можешь забить меня?
Я думаю , что это 6 ...
1
,0
,0
,*
,255
,x
Обратите внимание, что
*
это не целочисленное умножение.источник
Python 0
Я отправил сообщение, но я использовал условные выражения. Здесь нет никаких условных обозначений и токенов, только ключевые слова
использует трюк, что несколько из 3 имеют цифры, которые добавляют к 3
Изменить: Удалена ненужная лямбда
Изменить: Гольф дальше (117 символов) до сих пор нет жетонов
Убит прямой доступ к изящному getitem от Python Longer за 132 символа
http://www.codeskulptor.org/#user34_uUl7SwOBJb_0.py
источник
[]
не разрешен.only
.Python - 25 жетонов
Чтобы начать, у меня есть длинное решение - реализация одного из ответов в ссылке в моем первом посте.
n
это вход.or
эквивалентно||
.источник
JavaScript - 3 токена
Проверьте это на консоли вашего браузера:
источник
JavaScript
не уверен насчет токена
function mod3 (i) { return {'undefined':'100','0':'0'}[[0][i]][i.toString (3).split('').pop ()]}
или если выход для 0 допускается равным 1;
function mod3 (i) { return '100'[i.toString (3).split('').pop ()]}
источник
Tcl , 83 байта
Попробуйте онлайн!
источник
proc T n {set n [expr [join [split [expr [join [split $n ""] +]] ""] +]];expr {$n in {0 3 6 9}}}
Попробуйте онлайн!proc T n {expr {[expr [join [split [expr [join [split $n ""] +]] ""] +]] in {0 3 6 9}}}
Попробуйте онлайн!