Сколько картонных цифр мне нужно?


32

Мне нужно подготовить цифры из картона для отображения некоторого числа ( пример ). Я заранее не знаю, какое число мне показывать - единственное, что я знаю, это то, что оно не больше, чем n.

Сколько картонных цифр я должен подготовить?

Пример: n = 50

Чтобы отобразить любое число в диапазоне 0 ... 50, мне нужны следующие цифры:

  1. Ноль, для отображения числа 0 или любого другого круглого числа
  2. Две копии цифр 1, 2, 3 и 4, для отображения соответствующих номеров
  3. Одна копия цифр 5, 6, 7 и 8, для случая, когда они появляются как наименее значимая цифра в числе
  4. Цифра 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

2
Можно ли повернуть любую другую цифру, кроме 6/9?
feersum

Нет (см. Пример)
Анатолиг

Таким образом, две 1 не могут быть наложены, чтобы сделать 7 тогда
user253751

2
... и два нуля не могут сделать 8. Это было бы ужасно.
Анатолий

Возможно, это неуклюжий вопрос, но так как это «картонные» цифры, можно ли их печатать на двух сторонах, чтобы сэкономить на общем объеме? Например, вам никогда не понадобятся 6 и 0 вместе.
Weckar E.

Ответы:


16

Желе , 9 байт

‘ḶDœ|/ḟ9L

Попробуйте онлайн!

Как это работает

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length

14
Слишком быстро>. <Клянусь, у вас есть ответ желе на все известные вызовы во вселенной, и у вас просто есть бот, чтобы опубликовать их сразу после испытания. : P Хороший ответ.
HyperNeutrino

10
@HyperNeutrino Я думаю, что бот извлекает тестовые случаи из испытания и пробует каждую возможную программу желе, используя суперкомпьютер.
NieDzejkob

1
@HyperNeutrino Вы знаете это чувство ... особенно если ваше решение 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Эрик Outgolfer

Я на мгновение усомнился в достоверности части ḟ9, потом понял, что 6 <9, поэтому число 6 не может быть меньше общего возможного количества 6 и 9, объединенных в каждой комбинации.
Надер Ганбари

7

Python 2 , 49 байт

lambda n:9*len(`n`)-9+(n*9+8)/10**len(`n`)+(n<10)

Попробуйте онлайн!

Неуклюжая арифметическая формула. Предположим, что nвписывается в intтак, что Lне добавляется.

Спасибо Нейлу за то, что он сэкономил 5 байтов, указав, что неиспользуемые 9 могут быть обработаны с помощью операции n*9+8вместо n*9+9, так что, скажем, 999*9+8=8999не переносится на 9000.


@ovs Это не совсем работает, недостаточно знать первую цифру. Например, 33333требуется пять 3, но 22222требуется только четыре. n*9[0] заманчиво, но не для чисел, начинающихся с 1и менее того 111...
xnor

По моим расчетам (см. Мой пакетный ответ) вы, вероятно, можете использовать, (n*9+8)/10**len(`n`)чтобы избежать использования min.
Нил

7

Haskell , 117 114 108 95 89 88 87 84 82 63 байта

6 байтов сэкономлено благодаря Laikoni

1 4 6 байт сэкономлено благодаря nimi

g x=sum[maximum[sum[1|u<-show y,d==u]|y<-[0..x]]|d<-['0'..'8']]

Попробуйте онлайн!


3
1.) так maximum[a,b]же, как max a b. 2.) filtermax d$sum[1|x<-show a,x==b]
Понимание

1
Вы можете заменить gс функцией литерала pointfree: sum.(#[-9..]).
Ними

@nimi Я не знаю, что такое литерал pointfree, но я думаю, что вижу то, что вы предлагаете. Скажи мне, если я ошибаюсь.
Пшеничный волшебник

1
... и length[x|x<-...]есть sum[1|x<-...].
Ними

1
Функции могут быть безымянными, поэтому в них нет необходимости g=(но, возможно, вы захотите включить их в версию TIO).
Ними

5

Mathematica, 49 байтов

Tr@Delete[Max~MapThread~DigitCount@Range[0,#],9]&

хороший! Это основано на моем ответе?
J42161217

5

JavaScript (ES6), 60 53 байта

f=(n,i=9)=>n>(i%9+1+"e"+(i/9|0))/9-1?1+f(n,-~i):n>9^1

Этакий хакерский рекурсивный вариант. Это генерирует числа, которые требуют добавления цифры:

1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 22, 33, 44, 55, 66, 77, 88, 100, 111, 222, ...

а затем подсчитывает, сколько меньше, чем на входе. Счастливым чудом удаление цифры 9фактически удаляет несколько байтов из функции, потому что последовательность может быть сгенерирована следующим образом (при условии целочисленного деления):

1e1 / 9 = 1, 2e1 / 9 = 2, ..., 8e1 / 9 = 8, 9e1 / 9 = 10, 1e2 / 9 = 11, 2e2 / 9 = 22, ...

Мы должны принять во внимание тот факт, что числа до 10 по-прежнему требуют нуля, но это так же просто, как добавление n > 9 ? 0 : 1к результату.

Контрольные примеры


n>9^1вероятно, может бытьn<10
CalculatorFeline

@CalculatorFeline Ну, это дает trueдля ввода 0, так что я немного колеблюсь, чтобы сделать это.
ETHproductions

0>9ложно, false^11 ...?
CalculatorFeline

@CalculatorFeline Да, я говорю, что не решаюсь вывести логическое значение trueвместо числа 1.
ETHproductions

4

Пакетный, 67 байт

@if %1 geq 10%2 %0 %1 0%2 -~%3
@cmd/cset/a(%1*9+8)/10%2+9*%30+!%30

В стандартной постановке этой задачи вам нужны отдельные цифры 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.


2

Mathematica, 83 байта

v=DigitCount;s=v@0;(Table[s[[i]]=v[j][[i]]~Max~s[[i]],{i,10},{j,#}];s[[9]]=0;Tr@s)&


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.