Мне нужно подготовить цифры из картона для отображения некоторого числа ( пример ). Я заранее не знаю, какое число мне показывать - единственное, что я знаю, это то, что оно не больше, чем n
.
Сколько картонных цифр я должен подготовить?
Пример: n = 50
Чтобы отобразить любое число в диапазоне 0 ... 50, мне нужны следующие цифры:
- Ноль, для отображения числа 0 или любого другого круглого числа
- Две копии цифр 1, 2, 3 и 4, для отображения соответствующих номеров
- Одна копия цифр 5, 6, 7 и 8, для случая, когда они появляются как наименее значимая цифра в числе
- Цифра 9 никогда не нужна, потому что вместо нее я могу использовать перевернутую цифру 6
Всего: 13 цифр
Контрольные примеры (каждая строка представляет собой контрольный пример в формате «ввод; вывод»)
0 1 1 2 9 9 11 10 50 13 99 17 100 18 135 19 531 22 1000 27 8192 34 32767 38
Ответы:
Желе , 9 байт
Попробуйте онлайн!
Как это работает
источник
0rDŒr€ẎQṪÞẎḟ9ĠẎL
.Python 2 , 49 байт
Попробуйте онлайн!
Неуклюжая арифметическая формула. Предположим, что
n
вписывается вint
так, чтоL
не добавляется.Спасибо Нейлу за то, что он сэкономил 5 байтов, указав, что неиспользуемые 9 могут быть обработаны с помощью операции
n*9+8
вместоn*9+9
, так что, скажем,999*9+8=8999
не переносится на 9000.источник
33333
требуется пять 3, но22222
требуется только четыре.n*9
[0] заманчиво, но не для чисел, начинающихся с1
и менее того111..
.(n*9+8)/10**len(`n`)
чтобы избежать использованияmin
.Haskell ,
11711410895898887848263 байта6 байтов сэкономлено благодаря Laikoni
146 байт сэкономлено благодаря nimiПопробуйте онлайн!
источник
maximum[a,b]
же, какmax a b
. 2.)filter
max d$sum[1|x<-show a,x==b]
g
с функцией литерала pointfree:sum.(#[-9..])
.length[x|x<-...]
естьsum[1|x<-...]
.g=
(но, возможно, вы захотите включить их в версию TIO).Mathematica, 49 байтов
источник
JavaScript (ES6),
6053 байтаЭтакий хакерский рекурсивный вариант. Это генерирует числа, которые требуют добавления цифры:
а затем подсчитывает, сколько меньше, чем на входе. Счастливым чудом удаление цифры
9
фактически удаляет несколько байтов из функции, потому что последовательность может быть сгенерирована следующим образом (при условии целочисленного деления):Мы должны принять во внимание тот факт, что числа до 10 по-прежнему требуют нуля, но это так же просто, как добавление
n > 9 ? 0 : 1
к результату.Контрольные примеры
Показать фрагмент кода
источник
n>9^1
вероятно, может бытьn<10
true
для ввода0
, так что я немного колеблюсь, чтобы сделать это.0>9
ложно,false^1
1 ...?true
вместо числа1
.Пакетный, 67 байт
В стандартной постановке этой задачи вам нужны отдельные цифры
6
и9
цифры, но вы не обязаны их отображать0
. По мере того, какn
увеличивается максимальное требуемое значение , количество требуемых цифр увеличивается каждый раз, когда вы достигаете повторной цифры (потому что вам не хватает этой цифры), и каждый раз, когда вы достигаете степени10
(когда вам нужен дополнительный ноль). В целом каждой степени10
требуется10
больше чисел, чем предыдущей, которая может быть рассчитана какfloor(log10(n))*10
. Для значенийn
между степенями 10 число промежуточных повторов может быть рассчитано какfloor(n/((10**floor(log10(n))*10-1)/9))
или в качестве альтернативыfloor(n*9/(10**floor(log10(n))*10-1))
.Я рассчитываю
floor(log10(n))
с помощью цикла на первой строке. Каждый раз%2
получает дополнительное0
и%3
получает дополнительное-~
. Это значит, что10%2
есть10*10**floor(log10(n))
и%30
естьfloor(log10(n))
.Дублирование
6
и9
имеет два эффекта: во-первых,9
для каждой степени необходимы только цифры10
, а во-вторых, при обнаружении повторных чисел необходимо игнорировать9
повторные обозначения . К счастью, так как они на единицу меньше, чем 10, это может быть достигнуто путем изменения формулы для получения результатаfloor((n*9+8)/(10**floor(log10(n))*10))
.Имея дело с нулем достаточно просто: это просто требует дополнительной цифры когда
n<10
, то естьfloor(log10(n))==0
.источник
Mathematica, 83 байта
источник
Python 3 , 75 байт
Попробуйте онлайн!
источник
PHP , 60 байт
Попробуйте онлайн!
источник