Учитывая положительное целое число в качестве входных данных, ваша задача состоит в том, чтобы вывести истинное значение, если число делится на двойную сумму его цифр, а в противном случае - на ложное значение ( OEIS A134516 ). Другими словами:
(sum_of_digits)*2 | number
Вместо истинных / ложных значений для истинных и ложных случаев вы можете указать любой конечный набор значений для истинного / ложного случаев и дополнить их другими значениями. Для простого примера вы можете использовать
0
для истинного регистра и все другие числа для ложного регистра (или наоборот, если хотите).Применяются стандартные правила ввода и вывода. Лазейки по умолчанию также применяются.
Вы можете принять входные данные как целое число или как строковое представление этого целого числа.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Я новичок в PPCG, поэтому я хотел бы, чтобы вы опубликовали объяснение, если это возможно.
Тестовые случаи
Ввод - вывод - (причина) 80 - Истина - (16 делит 80) 100 - Истина - (2 делит 100) 60 - Истина - (12 делит 60) 18 - Истина - (18 делит 18) 12 - Истина - (6 делит 12) 4 - Ложь - (8 не делит 4) 8 - Ложь - (16 не делит 8) 16 - Ложь - (14 не делит 16) 21 - Ложь - (6 не делит 21) 78 - Ложь - (30 не делит 78) 110 - Ложь - (4 не исчезает 110) 111 - Ложь - (6 не делит 111) 390 - Ложь - (24 не делит 390)
Ответы:
Нейм , 3 байта
Объяснение:
Попробуйте онлайн!
Подробная версия
источник
JavaScript (ES6),
312927 байтПринимает ввод в виде строки. Возвращает ноль для правды и ненулевой для фальсификации.
комментарии
Контрольные примеры
Показать фрагмент кода
источник
C #, 46 байт
Полная / Отформатированная версия:
источник
Retina ,
3827 байт-11 байт и исправили ошибку с кодом благодаря @MartinEnder
Попробуйте онлайн!
Выводит 1, если делится, 0 в противном случае
Объяснение (надеюсь, я правильно понял)
Добавляет весь ввод, плюс перевод строки, плюс ввод снова
Преобразует каждое совпадение в унарное (либо всю вторую строку, которая является исходным вводом, либо каждую цифру в первой строке)
Проверьте, является ли первая строка (удвоенная сумма цифр) делителем второй строки
источник
MATL , 7 байт
Выводит,
0
если делится, в противном случае положительное целое число. В частности, он выводит остаток от деления числа на двойную сумму его цифр.Попробуйте онлайн!
объяснение
источник
05AB1E ,
54 байта-1 байт благодаря Okx
Попробуйте онлайн!
Вы также можете удалить последние Ö, чтобы получить 0 для правдивых данных и что-то еще для ложных результатов, в результате чего получится всего 3 байта, но для меня это просто не соответствует определению.
объяснение
источник
%_
наÖ
.Машинный код x86-64, 24 байта
Приведенный выше код определяет функцию в 64-битном машинном коде x86, которая определяет, делится ли входное значение на двойную сумму его цифр. Функция соответствует соглашению о вызовах System V AMD64, поэтому ее можно вызывать практически из любого языка, как если бы она была функцией C.
Он принимает один параметр в качестве ввода через
EDI
регистр в соответствии с соглашением о вызовах, которое является целым числом для проверки. (Предполагается, что это положительное целое число, в соответствии с правилами вызова, и требуется дляCDQ
правильной работы инструкции, которую мы используем.)Он возвращает свой результат в
EAX
регистр, опять же, в соответствии с соглашением о вызовах. Результат будет 0 , если значение входного сигнала был делится на сумму своих цифр, и не ноль в противном случае. (По сути, обратный логический тип, в точности как в примере, приведенном в правилах вызова.)Его прототип C будет:
Ниже приведены инструкции на языке ассемблера без аннотации с кратким объяснением цели каждой инструкции:
В первом блоке мы делаем предварительную инициализацию регистров:
PUSH
+POP
инструкции используются как медленный, но короткий способ инициализацииESI
до 10. Это необходимо, потому чтоDIV
инструкция для x86 требует операнда регистра. (Нет формы, которая делится на непосредственное значение, скажем, 10.)XOR
используется как короткий и быстрый способ очисткиECX
регистра. Этот регистр будет служить «аккумулятором» внутри предстоящего цикла.EDI
) создается и сохраняется вEAX
, которая будет перекрыта при прохождении цикла.Затем мы начинаем цикл и суммируем цифры во входном значении. Это основано на x86
DIV
инструкции, которая делитEDX:EAX
на операнде и возвращает частное вEAX
и остаток вEDX
. Здесь мы разделим входное значение на 10, так что остаток будет цифрой в последнем месте (которую мы добавим в наш регистр аккумулятора,ECX
), а частное - это оставшиеся цифры.CDQ
Инструкция короткий путь установкиEDX
0. Это фактически знаково-расширяет значение вEAX
кEDX:EAX
, что иDIV
использует в качестве дивидендов. На самом деле здесь нам не нужно расширение знака, потому что входное значение является беззнаковым, ноCDQ
составляет 1 байт, в отличие от использованияXOR
для очисткиEDX
, что составляет 2 байта.DIV
IdeEDX:EAX
поESI
(10).EDX
) добавляется в аккумулятор (ECX
).EAX
Регистр (фактор) проверяется , чтобы увидеть , если он равен 0. Если это так, мы сделали это через все цифры , и мы провалиться. Если нет, у нас все еще есть больше цифр для суммирования, поэтому мы возвращаемся к началу цикла.Наконец, после завершения цикла мы реализуем
number % ((sum_of_digits)*2)
:LEA
Инструкция используется как короткий способ умножитьECX
на 2 (или, что то же самое, добавитьECX
к себе), и сохранить результат в другом регистре (в данном случае,EAX
).(Мы могли бы также сделать
add ecx, ecx
+xchg ecx, eax
; оба - 3 байта, ноLEA
инструкция более быстрая и более типичная.)CDQ
снова готовимся к разделению. ПосколькуEAX
будет положительным (то есть без знака), это будет иметь эффект обнуленияEDX
, как и раньше.EDX:EAX
на входное значение (немоледированная копия которого все еще находится вEDI
). Это эквивалентно модулю с остатком вEDX
. (Коэффициент также вводитсяEAX
, но нам это не нужно.)XCHG
(обмениваемся) содержимымEAX
иEDX
. Обычно вы делаетеMOV
здесь, ноXCHG
это всего 1 байт (хотя и медленнее). ПосколькуEDX
содержит остаток после деления, он будет равен 0, если значение было равномерно делимым или отличным от нуля в противном случае. Таким образом, когда мыRET
urn,EAX
(результат) равен 0, если входное значение делится на двойную сумму его цифр, или ненулевое значение в противном случае.Надеюсь, этого достаточно для объяснения.
Это не самая короткая запись, но, похоже, она превосходит почти все языки без игры в гольф! :-)
источник
Japt ,
74 байтаПринимает ввод в виде строки. Выходы
0
дляtrue
или число больше, чем0
дляfalse
, который, по мнению других решений, будет действительным. Если нет, дайте мне знать, и я сделаю откат.Попробуй это
объяснение
Неявный ввод строки
U
."390"
Повторите
U
дважды."390390"
Разделить на массив отдельных символов.
["3","9","0","3","9","0"]
Сократить путем суммирования, автоматически приведя каждого персонажа к целому числу в процессе.
24
Получите остаток от деления
U
на результат, также автоматически приведяU
к целому числу в процессе. Неявно выведите полученное целое число.6 (=false)
источник
C89,
5553 байта(Спасибо Steadybox!
Требуется один вход,
x
который является значением для проверки. Возвращает 0, еслиx
он делится равномерно на двойную сумму его цифр, или ненулевое значение в противном случае.Попробуйте онлайн!
Ungolfed:
Как вы можете видеть, здесь используются правила неявного int в C89. Глобальные переменные
s
иt
неявно объявлены какint
s. (Они также неявно инициализируются в 0, потому что они являются глобальными, но мы не можем воспользоваться этим, если хотим, чтобы функция вызывалась несколько раз.)Точно так же функция,
f
принимает один параметр,x,
который неявно являетсяint
, и возвращаетint
.Код внутри функции довольно прост, хотя
for
цикл будет выглядеть очень странно, если вы не знакомы с синтаксисом. По сути,for
заголовок цикла в C состоит из трех частей:В разделе «инициализация» мы инициализировали наши глобальные переменные. Это будет выполнено один раз, прежде чем цикл будет введен.
В разделе «условие цикла» мы указали, при каком условии цикл должен продолжаться. Это должно быть очевидно.
В разделе «приращения» мы в основном поместили произвольный код, так как он будет выполняться в конце каждого цикла.
Большая цель цикла - перебирать каждую цифру во входном значении, добавляя их к
s
. Наконец, после того, как цикл завершен,s
он удваивается и берется по модулю,x
чтобы увидеть, делится ли он равномерно. (Лучшее, более подробное объяснение логики здесь можно найти в моем другом ответе , на котором основан этот.)Человекочитаемая версия:
источник
t
вместоt>0
условия цикла .Брахилог , 8 байт
Попробуйте онлайн!
объяснение
источник
Python 2 ,
3432 байта-2 байта благодаря @Rod
Попробуйте онлайн!
источник
<1
.Mathematica, 26 байтов
Понятия не имею, почему
∣
имеет более высокий приоритет, чем умножение ...источник
PHP , 41 байт
печатает ноль, если делится, в противном случае положительное целое число.
Попробуйте онлайн!
источник
$a=10
, но вы забыли посчитать , что к вашему счетчику байтов$argn
доступно с-F
(в данном случае) или-R
опцией-F
. Но это не отражено в вашем TIO (поддерживает ли он эхо от STDIN?).-F
опцию вместо-R
php.net/manual/en/features.commandline.options.php Если вы нашли лучший способ сделать то же самое в tio, как в commnd линия, дайте мне знатьExcel, 63 байта
Суммирующие цифры - это длинный бит.
источник
Perl 6 , 19 байт
Попробуйте онлайн!
источник
Шелуха ,
98 байтСпасибо Лео за сохранение 1 байта.
Попробуйте онлайн!
объяснение
источник
Haskell ,
383742 байтаБлагодаря Zgarb для игры в гольф от 1 байта
Попробуйте онлайн!
Принимает ввод в виде строки; возвращает 0, если делится и ненулевой в противном случае.
источник
(:[])
может бытьpure
.Python 3, 35 байт
источник
=
и после)
дюймаint(c)
. Кроме того, поскольку выsum
можете взять генератор в качестве аргумента, вы можете удалить его[..]
изнутри. Если у вас есть дополнительные вопросы, не стесняйтесь пинговать меня.int(c)for c in a
также может бытьmap(int,a)
, чтобы сохранить несколько байтов.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 байт-5 благодаря @Oki
Это усложняется тем фактом, что в TI-BASIC нет краткого способа суммирования целых чисел . Возвращает
0
дляTrue
и другой номер дляFalse
.Объяснение:
источник
10^-randIntNoRep(1,1+int(log(Ans
делает то же самое, что иseq(10^(~A-1),A,0,log(Ans
в меньшем количестве байтов, поскольку порядок не имеет значения (при условии версии 2.55MP)Braingolf ,
1312 байтПопробуйте онлайн!
Выводит 0 для истины, любой другой номер для фальси.
объяснение
источник
Japt , 7 байт
Возвращает
1
дляtrue
,0
дляfalse
Попробуйте онлайн!
объяснение
источник
Haskell , 49 байт
использование
Попробуйте онлайн!
источник
Джава , 66 байт
-1 байт благодаря Оливье
Ungolfed & объяснение:
источник
int
вместо того,byte
чтобы сохранить ... байт.a%i*2
, это анализируется,(a%i)*2
поскольку модули и умножение имеют одинаковый порядок.J 15 байт
0 указывает на правдивость, ненулевой указывает на ложь.
объяснение
источник
@
или[:
!|~2*1#.,.&.":
для 13 байтов.Ом , 5 байт
Попробуйте онлайн!
источник
tcl, 45
демонстрация
источник
0==
на1>
.Haskell ,
3534 байтаПопробуйте онлайн!
Возвращает «0» в истинном случае, остальное в противном случае.
Haskell , pointfree edition от nimi, 34 байта
Попробуйте онлайн!
источник
mod<*>(2*).sum.map(read.pure).show
PHP, 44 байта
Запустите так:
объяснение
Перебирает цифры, чтобы вычислить итог, а затем выводит по модулю, как и большинство ответов.
источник
Java (OpenJDK 8) ,
5553 байтаПопробуйте онлайн!
Возвращаемое значение
0
означает правдивое, все остальное означает ложь.Так как мой комментарий в ответе Окса не имел никакой пульсации, я удалил его и опубликовал как этот ответ, играя в гольф еще немного.
Дальнейшая игра в гольф благодаря @KrzysztofCichocki и @Laikoni, которые справедливо показали мне, что мне не нужно отвечать истинным / ложным значением, но любым значением, пока я описываю результат.
источник
true
.Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.
.Мини-Флак,
296292 байтаПопробуйте онлайн!
Ссылка на TIO содержит больше комментариев от меня, поэтому ее легче читать.
Истина / Ложь: Истина (делимая), если второе число равно третьему, ложь в противном случае. Таким образом, и набор правды, и ложь бесконечны, но я полагаю, что это должно быть разрешено. +10 байт, если это не так.
Примечание: начальные / завершающие символы новой строки / пробелы не допускаются при вводе.
источник