Мой друг и я работали в лаборатории в нашем классе AP Computer Science и решили написать одну из проблем, так как у нас все еще оставалась свободная половина класса, когда мы закончили. Вот вопрос:
Учитывая число n, делится ли n на каждую из его цифр?
Например, 128 пройдет этот тест - он делится на 1,2 и 8. Любые числа с нулем автоматически дисквалифицируют число. Хотя вы можете использовать другие языки и публиковать решения с ними, если хотите, нам больше всего интересно узнать, насколько компактные люди могут создавать программы на Java, поскольку это язык, который мы используем в классе. Пока у нас обоих 51. Вот мой текущий код:
public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters
// Breakdown:
// for(int p=n; Saves one semicolon to put declaration into for loop
// n%10>0;) Basic check-for-zero
// n/= Pretty simple, discarding one number off of n at a time
// p%(n%10)>0? If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10; Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1 If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.
Требования
Подпись метода может быть любой, какой вы захотите. Просто посчитайте тело функции. Убедитесь, что метод возвращает логическое значение и передает только один числовой параметр (не строку).
Код должен быть в состоянии пройти все эти случаи (чтобы оставаться верным направлениям исходного вопроса, учитываются только логические значения true и false, если язык поддерживает логические значения. Если и только если ваш язык не имеет логических переменных, вы может представлять false с 0 и true с любым ненулевым целым числом (предпочтительно 1 или -1):
128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false
Кроме того, мы не учитывали пробелы, поэтому не стесняйтесь делать то же самое, если только пробелы не важны для работы программы (так что переводы строки в Java не учитываются, а только один пробел между int
и x=1
считается). Удачи !
true
и /false
или все в порядке? 3. Тэг на самом деле здесь не применяется, так как сам вызов не связан с Java.java
0
цифрами, кратным каждому из них), я думаю, что большинство ответов просто длиннее, неинтересным способом, чтобы включить проверку для него. Так что мне больше нравится проблема, представленная заголовком (делится на цифры, а не на кратность, исключая 0).Ответы:
Perl 6, 13
Использует неявную переменную
$_
-$_ %% .comb.all
эквивалентно$_ %% all($_.comb)
.%%
является оператором «делится», иcomb
без дополнительного аргумента возвращает список символов в строке. Например, если аргумент равен 123, то функция оцениваеткоторый
автоматическое продвижение нитей делает это
который
который является ложным в логическом контексте, потому что это соединение «все», и, очевидно, не все его элементы верны.
Должна быть возможность принудительно возвращать возвращаемое значение
Bool
и скрывать соединение от вызывающих, создавая сигнатуру функцииsub golf($_ --> Bool())
, но приведения в сигнатурах функций в Rakudo пока не работают. Возвращаемое значение по-прежнему правильно true или false, просто нетTrue
илиFalse
.источник
Bool
просто добавьтеso
в начало кодаso$_%%.comb.all
.C # и System.Linq - 26/40
По правилам, не считая самого объявления метода.
Еще раз продемонстрировав, что C # - лучший выбор, когда рассматривается Java ... Я шучу, шучу!
К сожалению, эта функция (и многие другие ответы) не даст правильных результатов для отрицательного ввода. Мы можем это исправить, но решение теряет большую часть своего очарования (и увеличивается до 46 символов в длину):
Изменить : сбрил один персонаж с предложением Тима.
Изменить : с введением членов с выражением тела в C # 6, мы можем сократить это дальше, вырезав
return
:в общей сложности 26 символов (по моему мнению,
=>
их не следует включать больше, чем было бы в скобках). Версия, обрабатывающая отрицательные числа, может быть сокращена аналогичным образом.источник
.0
? Не нужно ничего, кроме целочисленного модуля.i % 0
сi
целым числом даетDivideByZeroException
.48d
такой же, как48.0
, но на один символ меньше (d для двойного).&
именно потому,&
что не закорачиваем - вы получите исключение деления на ноль%
. Мы можем исправить это, сделав его двойным (сd
), но затем мы снова потеряли один символ.APL (
(видимо, скобки не в счет)1311)Объяснение:
⍎¨⍕⍵
: оценить каждый символ в строковом представлении⍵
⍵|⍨
: для каждого из них найдите модуль и⍵
0∧.=
: посмотреть, все ли равны0
Testcases:
источник
X%0
? без метания?0|X
даетX
.(0∧.=⍎¨∘⍕|⊢)
Python 2: 43 символа
Проверяет, есть ли у числа ненулевые остатки по модулю его цифр, и выводит отрицание этого. Нулевые цифры обрабатываются странно: поскольку вычисления
%0
вызывают ошибку, цифры0
заменяются на.3
, что, как представляется, всегда дает ненулевой результат из-за неточностей с плавающей запятой.Тело функции составляет 32 символа.
источник
Perl - 27 байт
Не считая подписи функции, как указано в инструкции.
Пример использования:
Пример вывода:
Решение проблемы: «Только логические значения true и false учитываются. Значения Truthy / Falsey не учитываются».
Выходы:
«True» и «False» определяются как
1
и""
.Ошибка:
как справедливо указывает Брэд Гилберт , Perl определяет true как скаляр, который одновременно является целым числом
1
и строкой"1"
, и false как скаляр, который одновременно является целым числом0
и строкой""
.источник
$_
:pop=~s///ger<1
. Я не знаю, согласятся ли с этим ОП1
и""
являются ли они действительными результатами. Если нет, то это можно исправить еще двумя байтами: просто добавьте|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
составляет 26 байтов, включая|0
и-p
флаг. Вам не нужно использовать функцию.dualvar(1,'1')
иdualvar(0,'')
.SVIV
(int),SVNV
(double) иSVPV
(string).'abc'
в качестве числа (при условии, что выuse warnings;
включили.)CJam,
1110 байтЭто определяет функцию с именем
F
и отбрасывает блок из стека.Попробуйте онлайн.
Контрольные примеры
Как это устроено
источник
JavaScript ES6,
393228 байтСпасибо core1024 за предложение заменить
(""+v).split("")
с[...""+v]
, и openorclose для предполагая использованиеevery
функции.Ответ в настоящее время не содержит ни одного бита моего кода: O
Предыдущее решение
==""
не является допустимым способом проверить, является ли массив пустым, поскольку[""]==""
возвращаетtrue
, но массив гарантированно содержит непустую строку, поэтому он работает здесь.Остальные являются стандартным сокращением типов преобразования в JavaScript.
источник
(""+v).split("")
на[...""+v]
.every
метод?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
возвращаетсяNaN
иNaN == false
, таким образом , в вашем случае чисел , который содержит 0, например10
, может вернутьсяtrue
.Java 8, 46 байт (тело метода)
Использование преобразования Джероена Мостерта в двойной трюк.
источник
Pyth, 12 байт
Это фильтрует символы в строке как наличие нуля (
!vT
) или не разделяет input (%vzvT
), а затем принимает логическое значение не результирующего списка.Попробуй это здесь.
источник
Ruby, 44 байта (тело функции: 37)
Вероятно, есть потенциал, чтобы дальше играть в гольф.
Ввод через функцию
f
. Пример использования:источник
.to_i
на.hex
, так как однозначные числа одинаковы в базе 16 и могут измениться==0
на<1
.Python -
59504947 байтЯ уверен, что есть более быстрый способ ... о хорошо.
Редактировать - Спасибо FryAmTheEggman за советы по игре в гольф.
Редактировать 2 - FryAmTheEggman, возможно, также написал это на данный момент, ой
Редактировать 3 - Руки вверх, если вы даже не знали, что генэкспы были чем-то особенным. ...Просто я?
источник
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. И никаких проблем :)all
метод.1>n%int(c)
работать?all(c>'0'and 0==n%int(c)for c in`n`)
делает то же самое, с 2 символами меньше и даже с сохранением выделения списка.Pyth 11
Это объединяет ответы @ isaacg и @ xnor . Он отфильтровывает цифры из входных данных, проверяя значение
input % (eval(current_digit) or .3)
. Затем он проверяет, является ли полученная строка пустой или нет.Наткнулся на еще пару вариантов такой же длины:
Попробуйте онлайн.
источник
Bash + coreutils, 44 байта
Полное определение функции:
Я не уверен, как это оценить, поскольку обычно функции оболочки используют один набор
{}
или()
содержат тело функции. Я обнаружил, что здесь также можно использовать double,(())
чтобы содержать тело функции, которое вызывает арифметическое расширение, которое мне здесь и нужно. Итак, пока я считаю только одну пару из этих скобок - дальнейшее обсуждение этого приветствуется.Выход:
источник
true
/false
?J - 14 символов
Тело функции - это часть после
=:
. Если мы хотим минимизировать количество символов для всей функции, это 15 символов*/@(0=,.&.":|])
.,.&.":
кратчайший путь в J, чтобы развернуть как число в список его десятичных цифр: преобразовать в строку, разделить цифры и преобразовать каждую цифру обратно в число.,.&.":|]
принимает входной номер (]
) по модулю (|
) эти цифры.0*/@:=
возвращает true, если все результаты были 0, иначе выдает false.источник
Java -
121102977978 байтЯ просто знаю, что это будет забито позже. Ну что ж.
Я вернусь.
источник
Хаскелл -
1005438Все еще учусь, критику оценили
источник
length
s, они не нужны. 2) Заменитьt
по определению. 3)elem y s
не нужно. 4)/='0'
можно переместить в левый фильтр вместоelem y s
. 5) В этом случае/='0'
эквивалентно>'0'
, поскольку каждая буква является цифрой. 6) Положитеmod
в кавычки, чтобы он стал инфиксом. 7) Поместите все в одну строку.s==filter(...)s
вы должны использоватьall(...)s
. Теперь, посколькуs
в выражении появляется только один раз, вы можете заменить его на определение и удалитьwhere
. также, вместо того, чтобы==0
вы могли использовать<1
.all(\y->...)$show x
наand[...|y<-show x]
.CJam, 15 байтов
Это блок, наиболее близкий к функции в CJam. Я только считаю тело (т.е. опускаю скобки). Вы можете использовать его следующим образом:
Или, если вы хотите проверить серию входов, вы можете сделать
Блок оставляет
0
(ложно) или1
(верно) в стеке, чтобы указать результат. (CJam не имеет логического типа.)Проверьте это здесь.
Объяснение:
Альтернатива, также 15 байтов
объяснение
источник
CJam, 15 байтов
{}
это самая близкая вещь к функции в CJam. Я просто считаю тело функцииИспользуйте это так:
Получить либо
1
(если число делится), либо0
(если число не делится на его цифры).Попробуйте онлайн здесь
объяснение
источник
Ab
разделить цифры? Кажется, он просто конвертирует его в базу 10. Кроме того, как% узнает, что нужно модифицировать по номеру, а не только по следующей цифре, поскольку кажется, что следующая цифра будет следующей в стеке?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
просто возьмите последние два числа (в данном случае) и рассчитайте мод. Последние два числа здесь - это фактическое число и цифра (всегда)C89, 43 байта
C89 не имеет логического типа. Надеюсь, что это работает. Также я использовал второй параметр, чтобы передать копию оригинального числа через стек, но определение может быть любым. Чтобы получить правильный результат, вам просто нужно вызвать функцию с одинаковым значением для обоих параметров (
d(128, 128)
).РЕДАКТИРОВАТЬ: применены предложенные изменения от анонимного пользователя
источник
C11 - 44 байта в теле функции
Другая версия C, не рекурсивная и без исключения с плавающей запятой.
Это также будет работать в C ++, Java и большинстве других C-подобных языков.
Отредактировано, чтобы включить улучшение комментария primo.
источник
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
один байт меньше, чем код OP.Юлия
322523Улучшено использование цифр
Также исправляет проблему с отрицательными числами
Старый метод
Все цифры делятся, если сумма всех остатков равна 0. Как и у других, есть проблема с отрицательными числами.
Выход
Улучшенный метод также обрабатывает BigInt
тем не мение
потому что
источник
C / C ++, 58 байт (44 в теле)
Вызывает неопределенное поведение (см. Комментарии)
true
иfalse
являются 1 и 0, но вы можете добавить один символ подписи возвращатьbool
.И для удовольствия, рекурсивная версия, которая меньше, если вы разрешаете вызовы вида
r(128,128)
Изменить : теперь запрещено по правилам:
C / C ++, 53 байта (33 в теле)
источник
R:
726765Функция
Спасибо @AlexA и @plannapus за экономию
Тестовый забег
источник
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
вместоtoString(a)
дает тот же результат.GNU Awk: 53 символа
Подсчитанная часть:
Вся функция:
Поскольку Awk не имеет логических значений, возвращает 1 для true и 0 для false.
источник
JavaScript (ES6) 30
Функция с одним числовым параметром. Используя% и вычитание, нет необходимости в специальном случае '0', потому что 0% 0 - это NaN в JavaScript.
Редактировать Сохранено 1 символ thx DocMax
Просто ради забавы, нарушая правило о неисчислении подписи функции, 4
Тест в консоли FireFox / FireBug
Выход
источник
of(t=n+'')
толькоof t=n+''
на сохранение 1.PHP: 85 байт (64 байта на теле)
Чтобы эта функция работала, просто передайте строку или число.
0
правильно вернет false.Код:
Пожалуйста, НЕ УСТАНАВЛИВАЙТЕ 2-Й ПАРАМЕТР!
Javascript: 76 байт (61 байт на теле)
Это переписать предыдущую функцию.
Не сильно изменилось между обеими версиями.
Вот код:
Полиглот: Javascript + PHP 187
217байты (7684 байта без шаблона):Почему я это сделал?
Из-за причины и, возможно, потому что я могу!
Просто игнорируйте ошибку на PHP: все равно работает!Больше не нужно, это было исправлено путем удаления 3 байтов.
Вот этот шедевр:
Вы можете запустить этот код как на своей консоли, так и на интерпретаторе PHP!
Старая версия:
источник
Октава, 33 (39, включая настройку функций)
Использование числового преобразования в матрицу:
Разделите число поэлементно на матрицу X, где X получается путем преобразования числа в строку и вычитания 48, чтобы снова перейти от значений ASCII к числам. Возьмите по модулю 1, чтобы получить десятичную часть каждого деления, подтвердите, что все они равны нулю (если они равны NaN из-за / 0, сумма будет равна NaN и, следовательно, не равна нулю).
Пример ввода с использованием www.octave-online.net:
Выход:
источник
f(123)
делимого на 1, 2 и 3). Но это работает для предоставленных тестовых случаев.MATLAB - 39 символов
источник
BASH - 117 знаков
тесты
источник
PHP -
747164 символовGolfed:
Меньше гольфа
Результаты теста:
(Код)
(Выход)
источник