При заданном значении x найдите наименьшее числовое значение, большее y , которое можно умножить и разделить на x , сохранив при этом все исходные цифры.
- Новые номера не теряют цифр.
- Новые номера не набирают цифры.
Например:
Ввод: х = 2, у = 250000
- Оригинал: 285714
- Отдел: 142857
- Умножение: 571428
Это правда, потому что 285714 больше, чем у ; затем при делении на х получается 142857, а при умножении на х получается 571428 . В обоих тестах присутствуют все оригинальные цифры от 285714 , и никакие дополнительные цифры не были добавлены.
Правила
- Х должно быть 2 или 3, так как для вычисления чего-либо более высокого требуется слишком много времени.
- Y должен быть целым числом больше нуля .
- Самый короткий код выигрывает.
Тестовые случаи
Это мои самые распространенные тестовые случаи, так как они являются самыми быстрыми для тестирования.
- х = 2, у = 250000 = 285714
- х = 2, у = 290000 = 2589714
- х = 2, у = 3000000 = 20978514
- х = 3, у = 31000000 = 31046895
- х = 3, у = 290000000 = 301046895
Разъяснения
- Тип деления не имеет значения. Если вы можете получить 2.05, 0.25 и 5.20, то не стесняйтесь.
Желаю вам всем удачи!
Ответы:
Шелуха , 14 байт
Попробуйте онлайн!
объяснение
источник
-
что было неправильно.Brachylog v2, 15 байт
Попробуйте онлайн!
Принимает участие в форме
[x,y]
.объяснение
Комментарий
Слабость Brachylog в повторном использовании нескольких значений проявляется здесь; в этой программе почти все слесарное дело и очень маленький алгоритм.
Таким образом, может показаться более удобным просто жестко закодировать значение y (есть комментарий к этому вопросу, предполагающий, что 2 является единственно возможным значением). Однако на самом деле существуют решения для y = 3, что означает, что, к сожалению, сантехника должна обрабатывать и значение y . Наименьшее, что мне известно, это следующее:
(Методика, которую я использовал, чтобы найти это число, не является полностью общей, поэтому возможно, что есть меньшее решение, использующее другой подход.)
Однако вряд ли вы подтвердите это с помощью этой программы. Brachylog
p
написан очень общим способом, который не имеет оптимизаций для особых случаев (например, в случае, когда и вход, и выход уже известны, что означает, что вы можете выполнить проверку в O ( n log n ) с помощью сортировки, а не чем O ( n !) для подхода грубой силы, который я подозреваю, он использует). Как следствие, требуется очень много времени, чтобы проверить, что 105263157894736842 - это перестановка 315789473684210526 (я оставляю его работающим в течение нескольких минут без видимого прогресса).(РЕДАКТИРОВАТЬ: я проверил источник Brachylog по причине. Оказывается, что если вы используете
p
два известных целых числа, используемый алгоритм генерирует все возможные перестановки рассматриваемого целого числа, пока не найдет тот, который равен выходному целому числу, в качестве алгоритма это «вход → индексы, перестановка индексов → выходы, выходы → выход». Более эффективным алгоритмом было бы сначала установить отношение «выход / выход» , чтобы обратное отслеживание в перестановке могло учитывать, какие цифры были доступны.)источник
p
не работаетpermutation/2
с двумя известными списками, даже если в качестве аргументов указаны два известных целых числа; он генерирует все перестановки первого целого числа (используяpermutation/2
с одним известным списком) , а затем сравнивает их против второго целого числа.Perl 6 , 56
54байтаПопробуйте онлайн!
Интересная альтернатива, вычисляющая n * x k для k = -1,0,1:
источник
Чисто , 92 байта
Попробуйте онлайн!
Довольно просто Объяснение придет через некоторое время.
источник
q, 65 байтов
Разбейте число по основанию 10, отсортируйте каждое по возрастанию и проверьте, равны ли они. Если нет, увеличьте y и снова
источник
JavaScript (ES6),
767369 байтСохранено 3 байта с использованием
eval()
, как предложено @ShieruAsakotoПринимает вход как
(x)(y)
.Попробуйте онлайн!
Рекурсивная версия была бы 62 байта , но она не очень подходит здесь из-за большого количества необходимых итераций.
Как?
Пример:
При добавлении двух массивов вместе каждый из них неявно приводится к строке через запятую. Последняя цифра первого массива будет напрямую объединена с первой цифрой второго массива без запятой между ними, что делает этот формат однозначным.
Пример:
Но:
комментарии
источник
x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):y
Может вызвать переполнение стека, если y далеко от решения, хотя.eval
:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
eval()
идею. Моя первая попытка была действительно рекурсивной, но я сдался из-за большого количества необходимых итераций.Haskell,
7674 байтаДва байта сбрили благодаря комментарию Линн
источник
f
можете быть,f x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0
но затем, определив свой ответ как оператор, вы экономите два байта:x!y=…
и тогда ваш ответ(!)
:)Japt, 24 байта
Довольно наивное решение для нескольких сортов пива; Я уверен, что есть лучший способ.
Попробуй это
источник
315789473684210526
что это первое решение дляx=3
Javascript или Japt, он не может правильно его вычислить, поскольку он не соответствует двойной точности.Python 2 , 69 байт
Попробуйте онлайн!
источник
f=lambda x,y,S=sorted:y*(S(`y`)==S(`y*x`)==S(`y/x`))or f(x,y+1)
должен работать, но он довольно быстро достигает предела рекурсии, и я не знаю, что об этом говорят правила PPCG.Желе ,
1413 байт-1 спасибо Эрику Искателю (`` использует make_digits, поэтому
D
не требуется)+2 исправление ошибки (еще раз спасибо Эрику Искателю за то, что он указал на одну проблему)
Полная программа, печатающая результат (в виде двоичной ссылки выдается список длиной 1).
Попробуйте онлайн!
Как?
Обратите внимание, что, когда деление не является точным, неявная десятичная инструкция (эквивалентная a
D
), примененная до сортировки, дает дробную часть,например:
1800÷3D
->[6,0,0]
while
1801÷3D
->[6.0,0.0,0.33333333333337123]
источник
D
.>=
я совершенно пропустил это! Не знал,Ṣ
что на нем установлен make_digits - спасибо. Придется исправлять и обновлять позже, хотя ...Mathematica,
8274 байта-8 байт благодаря тш
Функция, которая принимает аргументы как
[x,y]
. Эффективно поиск методом перебора, который проверяетy
, совпадают ли отсортированные списки цифрy/x
иxy
совпадают ли они.Попробуйте онлайн!
источник
x=3
, но я не уверен, что это правдаx=2
.v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n]
,u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]
. Иu-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])
С10^x-10^y=0 (mod 9)
всегда держит.u-v=0 (mod 9)
всегда держит. Если есть неправильный ответw
, так какw*x-w=0 (mod 9)
, и,w-floor(w/x)=0 (mod 9)
мы имеемfloor(w/x)=0 (mod 9)
. еслиfloor(w/x)*x <> w
,w-floor(w/x)*x>=9
но это противоречит тому факту, что вw-floor(w/x)*x<x
то время как х может быть 2 или 3.w=0 (mod 9)
это следует из того,w*x-w=0 (mod 9)
чтоx-1
не делится на 3.IntegerQ
тест, он выдает пару ошибок при попытке выполнитьIntegerDigits
дроби, но Mathematica все равно обходит их и выдает правильный ответ. Я не уверен, будут ли допущены ошибки при расчете, даже если окончательный ответ правильный.APL (NARS), 490 символов, 980 байтов
тестовое задание
Я думал, что проблема в том, что ra удобное число, которое может меняться, так что у каждого есть 3 числа r, r * x, r * x * x в способе r начать к значению, что r * x близко к y (где x и y - входные данные проблемы, используя те же буквы, что и основной пост). Я использовал наблюдение, что если первая цифра r - d, то в r должны появиться цифры d * x и d * x * x, чтобы сделать r (или лучше r * x) одним решением.
источник
05AB1E , 16 байтов
Попробуйте онлайн. (ПРИМЕЧАНИЕ. Очень неэффективное решение, поэтому используйте входы, близкие к результату. Он работает и для более крупных входов локально, но на TIO время ожидания истекает через 60 секунд.)
Объяснение:
источник