Преобразовать число в сумму цифр
Не любая сумма: нам нужна самая короткая сумма
Не любые цифры: вы можете использовать только цифры номера
Пример
Вам будет предоставленыкачестве ввода целого числаn>0
Давайте скажем n=27
. Вы должны выразить 27
в виде суммы , используя только цифры [2,7]
, в кратчайший возможный способ. Вам не нужно использовать все цифры данного номера!
Так 27=2+2+2+7+7+7
. Затем взять эти цифры и считать их : [2,2,2,7,7,7]
.
Окончательный ответ за n=27
это6
Еще один пример для n=195
того , чтобы получить кратчайшую сумму мы должны использовать следующие цифры:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]
и ответ является23
Соревнование
Получив целое число n>0
, выведите минимальное количество цифр (содержащихся в числе), которые суммируются до этого числа.
Тестовые случаи
Input->Output
1->1
2->1
10->10
58->8
874->110
1259->142
12347->1765
123456->20576
3456789->384088
Это код-гольф. Самый короткий ответ в байтах побеждает!
Ответы:
Шелуха , 12 байт
Обрабатывает двузначные числа довольно быстро. Попробуйте онлайн!
объяснение
источник
Pyth , 12 байт
Попробуйте онлайн!
К сожалению, это ошибки памяти на входах, таких как
58
.объяснение
источник
./
lef<.{TjQ;./
(фильтр - правильное подмножество - цифр ввода)Mathematica, 78 байт
находит последний контрольный пример за 5 секунд
источник
Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
R , 78 байт
Попробуйте онлайн! (версия для гольфа)
Алгоритм чистой грубой силы, поэтому он не решает все тестовые случаи, и я думаю, что он попытался выделить 40000 ГБ для последнего тестового примера ...
T
в R по умолчанию1
мы получаем ошибку «off-by-one», которую исправляем на шаге возврата, но мы также получаем,F
какие значения по умолчанию0
окупаются.Нежелательное объяснение:
Попробуйте онлайн! (меньше версия для гольфа)
источник
Python 2,
168155144 байтаЭто не самое короткое время, которое может быть, но оно лучше всего, и не очень плохо, с точки зрения времени выполнения.
Цельfilter(None...
состоит в том, чтобы удалить 0 как цифру, что я узнал, что мог сделать, делая это.Самая большая проблема - это кадры стека Python, которые реально не позволяют мне запускать это на самых больших входах. Таким образом, это не правильное решение, на самом деле, я поиграл с увеличением предела рекурсии, который просто привел к сбоям сегмента. Это должно быть сделано либо с помощью цикла и стека, либо с гораздо большим умом, чтобы работать в Python.
редактирование: благодаря Кэрду и Чэсу Брауну за 13 байтов!
источник
input
и требовать, чтобы ввод был заключен в кавычки.filter(None,sorted(map(int,set(n)))[::-1])
сsorted(set(map(int,n))-{0})[::-1]
(хотяNone
вещь довольно хорошо знать).filter(len,...)
для списков и строк, а такжеfilter(abs,...)
для целых чисел и чисел с плавающей точкой.Шелуха , 13 байт
Довольно неэффективно
Попробуйте онлайн!
источник
JavaScript (ES6), 82 байта
Принимает ввод в виде строки.
источник
1/0
?f=
начале это большая подсказка, так как она вам не нужна для нерекурсивных лямбд.Рубин , 70 байт
Очень медленно, попробуйте все возможные комбинации, увеличивая размер, пока мы не найдем решение.
Спасибо Денису за Ruby 2.4 на TIO.
Попробуйте онлайн!
источник
Желе , 23 байта
Попробуйте онлайн!
Это настолько неэффективно, что не запускается для тестовых случаев после третьего на TIO из-за ограничения по времени> _ <
Любые советы по гольфу приветствуются!
источник
Python 2 ,
183176172166161 байтПопробуйте онлайн!
Дольше, чем другой ответ Python, но выполняет все тестовые примеры вместе взятые плюс
987654321
за секунду на TIO.Используется тот факт, что если
d1<d2
цифры являются цифрами, тоd2-1
d1
в сумме должно быть не более s (посколькуd2
экземплярыd1
можно заменить наd1
экземплярыd2
для более короткой суммы). Таким образом, сортируя цифры в порядке возрастания, можно рассмотреть «только» максимально9! = 362880
возможную сумму; и максимальная глубина рекурсии9
(независимо от значенияn
).источник
Haskell , 91 байт
Попробуйте онлайн! Пример использования:
f 58
доходность8
. Быстрый для двузначных чисел, ужасно медленный для больших входов.Функция
f
преобразует входной номерn
в список цифр при фильтрации нулей. Затем этот список иn
сам передаются(#)
функции, которая возвращает одноэлементный список.!!0
возвращает элемент этого одноэлементного списка.(#)
использует одиночные и пустые списки в качестве типа параметра. Учитывая вводn=58
иs=[5,8]
, идея состоит в том, чтобы вычесть все цифрыs
изn
, затем рекурсивно применить(#)
и проверить, какая цифра привела к минимальному количеству шагов, и вернуть один плюс этот минимум в качестве результата. Первая часть вычисляется(s#).(n-)=<<s
, что так же, какconcat(map(s#)(map(n-)s))
. Таким образом, в нашем примере сначала[58-5,58-8]
вычисляется, а затем[[5,8]#53,[5,8]#50]
результаты в[[7],[7]]
или[7,7]
послеconcat
. Результат сопоставляется с шаблоном,x:m
чтобы убедиться, что в списке есть хотя бы один элемент (вminimum
противном случае происходит сбой), затем одноэлементный список, равный 1, и минимум результата будут перенастроены. Еслиn
было меньше нуля или рекурсивный вызов возвратил пустой список, мы находимся в ошибочной ветви поиска и возвращается пустой список. Еслиn==0
ветка прошла успешно и[0]
возвращается.Haskell , 101 байт
Попробуйте онлайн! Способ более эффективный, проверяет все тестовые случаи за одну секунду.
На этот раз список цифр ввода вычисляется в порядке убывания, что позволяет
(#)
пытаться использовать наибольшую цифру как можно чаще, затем вторую по величине и так до тех пор, пока не будет найдено решение. Первое решение, найденное таким образом, также гарантированно будет самым маленьким.источник