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


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.