Иногда, когда я лениво пытаюсь учесть, какое число появляется передо мной, через некоторое время я понимаю, что это проще, чем я думал. Возьмем, 2156
к примеру: мне в конечном итоге пришло в голову, что и то, 21
и другое 56
является кратным 7
, и поэтому, безусловно 2156 = 21 x 100 + 56
, также является кратным 7
.
Ваша задача - написать некоторый код, который идентифицирует числа, которые легче вычислить из-за совпадения такого рода.
Точнее:
Напишите программу или функцию, которая принимает положительное целое число в n
качестве входных данных и возвращает истинное значение, если существует такой делитель d
(больше чем 1
), который n
можно разделить на два, чтобы получить два положительных целых числа, каждое из которых кратно d
; вернуть ложное значение, если нет.
- «Нарезанный пополам» означает то, что вы думаете: обычное представление base-10,
n
разделенное в некоторой точке на переднюю половину и заднюю половину, чтобы получить два других целых числа base-10. Это нормально, если второе целое имеет начальный ноль (но учтите, что оно должно быть положительным целым числом, поэтому разбиение1230
на123
и0
недопустимо). - Истинные и ложные значения могут зависеть от ввода. Например, если любое ненулевое целое число является правдивым на выбранном вами языке, вы можете вернуть делитель
d
или одну из «частей»n
(илиn
себя в этом отношении). - Например, любое четное число, содержащее не менее двух цифр в наборе
{2, 4, 6, 8}
, даст истинное значение: просто разделите его после первой четной цифры. Также, например, любое простое числоn
будет давать ложное значение, как и любое однозначное число. - Обратите внимание, что достаточно рассмотреть простые делители
d
. - Вы можете предположить, что ввод действителен (то есть, положительное целое число).
Это код-гольф , поэтому выигрывает самый короткий код в байтах. Но решения на всех языках приветствуются, поэтому мы можем стремиться к созданию самого короткого кода на каждом языке, а не только самого короткого кода в целом.
Контрольные примеры
(Вам нужно только вывести истинное или ложное значение; приведенные ниже аннотации приведены только для пояснения.) Некоторые входные данные, которые дают истинные значения:
39 (3 divides both 3 and 9)
64 (2 divides both 6 and 4)
497 (7 divides both 49 and 7)
990 (splitting into 99 and 0 is invalid; but 9 divides both 9 and 90)
2233 (11 divides both 22 and 33)
9156 (3 divides both 9 and 156; or, 7 divides both 91 and 56)
11791 (13 divides both 117 and 91)
91015 (5 divides both 910 and 15)
1912496621 (23 divides both 1912496 and 621; some splittings are multiples of 7 as well)
9372679892 (2473 divides both 937267 and 9892; some splittings are multiples of 2 as well)
Некоторые входные данные, которые дают ложные значения:
52
61
130 (note that 13 and 0 is not a valid splitting)
691
899
2397
9029
26315
77300 (neither 7730 and 0 nor 773 and 00 are valid splittings)
2242593803
¹ да, я действительно делаю это
источник
;(11+)+,\1+;
Брахилог (2), 8 байт
Попробуйте онлайн!
объяснение
Ясно, что если одно и то же число (больше 1) делит обе части, одно и то же простое число будет делить обе части. Требование, чтобы фактор был простым, аккуратно запрещает 1 как фактор. Это также предотвращает
0
выбор литерала как сегмента числа (потому что0
он не имеет простой факторизации и приведетḋ
к сбою).Нет необходимости проверять соответствие внутренних нулей; если раскол
x
и0y
действует,x0
иy
будет работать так же хорошо (и в другую сторону, еслиx0
иy
работает, то есть работающее решение , независимо от того ,x
и0y
будет работать или нет).Полная программа на брахилоге, как эта, возвращает логическое значение;
true.
если есть какой-то способ запустить его без сбоев (т.е. сделать выбор таким, чтобы не возникало ошибок),false.
если все пути ведут к сбою. Это именно то, что мы хотим здесь.источник
Желе ,
14121110 байтСпасибо @JonathanAllan за отыгрывание 1 байта!
Попробуйте онлайн!
Как это работает
источник
D
, какmake_digits
в действительности дляŒṖ
.Mathematica,
6362 байта(1 байт благодаря Грегу Мартину)
Это функция, которая принимает целое число в качестве входных данных и возвращает
True
илиFalse
. Если вы проверите это на большом количестве, принесите книгу, чтобы прочитать, пока вы ждете.Объяснение:
Floor@{Mod[#,t=10^n],#/t}
арифметически разбивает входные данные на последниеn
цифры и оставшиесяm-n
цифры (гдеm
общее количество цифр).Table[1~Max~#&/@...,{n,#}]
делает это для каждогоn
до входного номера. (Это слишком много. Нам нужно сделать это только до количества цифр на входе, но этот способ сохраняет байты и все равно дает правильный результат.)1~Max~#&/@
Бит избавляется от нулей, поэтому такие числа, как130 -> {13,0}
не считать какTrue
.1<Max@@GCD@@@...
находит наибольший общий делитель каждой из этих пар и проверяет, являются ли какие-либо из этих делителей больше 1. Если они есть, мы нашли способ разделить число на множители.источник
{#~Mod~10^n,#/10^n}
или{Mod[#,t=10^n],#/t}
.#~Mod~10^n
, но, кажется,Mod[#,10]^n
вместо скобокMod[#,10^n]
. Я не думал о вашем втором предложении, хотя!Mod[#,10]^n
Haskell , 57 байт
Попробуйте онлайн! Использование:,
(#1) 2156
возвращаетTrue
илиFalse
источник
C
145142139138135 байтовисточник
JavaScript (ES6),
747170 байтПринимает ввод в виде строки, что удобно для фрагмента. Редактировать: 3 байта сохранены благодаря @ user81655.
источник
(c,i)
->c
,i+1
->++i
,t=''
->i=t=''
, этот прием полезен в любое время вы должны использовать индексы 1-основанные и где - то инициализациюi
к0
.t=''
может бытьt=0
, так как добавлениеc
его в строку в любом случае.i
, поэтому мне не нужны индексы на основе 1, но потом я сделал первый срезt+=c
.f=(x,y,z)=>z?x%y?g(y,x%y):y:x?f(x,y,1)>1||f(x.slice(1),~~y+x[0]):0
. Я также объединил вашу функцию GCDf
. Возможно, будет в гольф дальше. Последнее предложение, обещаю! : Pgcd
функция не работаетx=0
, и, работая над этим, и ваша опечатка привела меня к 72 байтам, так что мне повезло, что я тогда смог убрать 2 байта.Python 3
133118117 байтКонечно, не самый короткий, возможно, может быть немного сокращен. Работает
O(n)
вовремя. Входные данные принимаются в формате,\d+
а выходные данные - в формате(True|False)
согласно булевому значению Python по умолчанию-3 байта благодаря Dead Possum
-15 байтов благодаря ovs
-1 байт благодаря этому парню
источник
from fractions import*
спасет 3 байтаany
кall
? Если это так, вы можете изменить всю эту часть,i(j[k:])and i(j[:k])
доведя ее до 125 байтов. Вот исправленияany(i(j[k:])*i(j[:k])*~-gcd(i(j[k:]),i(j[:k]))for k in range(1,len(j)))
)) for
QBIC ,
9190 байтОбъяснение:
источник
Python 3 ,
7069 байтПопробуйте онлайн!
источник
Perl 5 , 46 байт
43 байта кода + 3 байта для
-p
флага.Попробуйте онлайн! или попробуйте эту модифицированную версию, допускающую несколько входов.
Вы, вероятно, не хотите пробовать это на самом большом входе, так как это может занять (очень много) некоторое время.
Пояснения:
мы перебираем каждую позицию в слове с
s~~~g
,$`
содержащим числа до и$'
числа после. Если$`*$'
это правда (это означает, что ни один не является пустым, и ни один не является0
), то мы проверяем, если число между 2 и$`
делит их обоих (сgrep!(...),2..$`
). Если это так,$\|=..
будет установлено$\
ненулевое значение, которое неявно печатается в конце благодаря-p
флажку.источник
$<backquote>
в SE уценку, я был бы признателен, если вы скажете мне, как.<code>
...</code>
(а не`
...`
), а затем экранируя обратные кавычки как\`
. Кроме того, этот комментарий было труднее написать, потому что его нужно дважды экранировать (и два набора правил экранирования различны!).Python 2 , 69 байт
Использует рекурсию вместо встроенных в GCD.
Попробуйте онлайн!
Как это работает
Когда f вызывается с одним-тремя аргументами (по умолчанию d равно 10 , k - 2 ), сначала проверяется значение выражения
k<d<n
. Если выполняются неравенства k <d и d <n , выполняется следующее выражение иand
возвращается его значение; в противном случае, f просто вернет False .В первом случае мы начнем с оценки выражения
n/d%k+n%d%k<1<n%d
.d всегда будет степенью десяти, поэтому
n/d
иn%d
эффективно разделим десятичные цифры на n на две части. Эти срезы делятся на k в том и только в том случае, еслиn/d%k+n%d%k
значение равно 0 , что проверяется путем сравнения результата с 1 .Поскольку часть требований состоит в том, что оба среза должны представлять положительные целые числа, значение
n%d
также сравнивается с 1 . Обратите внимание, что 1 не имеет простых делителей, поэтому более дорогое сравнение с 0 не требуется. Также обратите внимание, что d <n уже гарантирует, чтоn/d
будет иметь положительное целое число.Наконец, он рекурсивно все
f(n,d,k+1)
(пробует следующий потенциальный общий делитель) иf(n,10*d)
(пробует расщепление) и возвращает логическое ИЛИ всех трех результатов. Это означает, что f вернет True, если (и только если) k является общим делителем n / d и n% d или то же самое верно для большего значения k и / или большей степени, равной десяти d .источник