Скільки картонних цифр мені потрібно?


32

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

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

Приклад: n = 50

Щоб відобразити будь-яке число в діапазоні 0 ... 50, мені потрібні наступні цифри:

  1. Нуль для відображення числа 0 або будь-якого іншого круглого числа
  2. Дві копії цифр 1, 2, 3 і 4 для відображення відповідних чисел
  3. Один примірник цифр 5, 6, 7 і 8, якщо вони є найменш значущою цифрою в цифрі
  4. Цифра 9 ніколи не потрібна, тому що я можу використовувати перевернуту цифру 6 замість цього

Всього: 13 цифр

Тестові приклади (кожен рядок - тестовий випадок у форматі "input; output")

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

Ні (див. Приклад)
anatolyg

Тож два 1 не можна
накладати,

2
... і дві нулі не можуть зробити 8. Це було б негарно.
anatolyg

Можливо, незручне запитання, але оскільки це "картонні" цифри, чи можна їх друкувати двостороннім способом, щоб заощадити на загальній необхідній кількості? Наприклад, вам ніколи не знадобиться 6 і 0 разом, наприклад.
Векар Е.

Відповіді:


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.
Ерік Аутгольфер

Я на якусь мить засумнівався в дійсності part9 частини, тоді зрозумів, що 6 <9, тому число 6 не може бути меншим від загальної можливої ​​кількості 6s та 9s, об'єднаних у кожній комбінації.
Надер Ганбарі

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

За моїми розрахунками (див. Мою відповідь Batch), ви, ймовірно, можете використовувати, (n*9+8)/10**len(`n`)щоб уникнути використання min.
Ніл

7

Хаскелл , 117 114 108 95 89 88 87 84 82 63 байт

6 байт збережено завдяки Лайконі

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 Я не знаю, що таке точкова функція буквальна, але я думаю, я бачу те, що ви пропонуєте. Скажи мені, якщо я помиляюся.
Пшеничний майстер

1
... і length[x|x<-...]є sum[1|x<-...].
німі

1
Функції можна не називати, тому немає необхідності g=(але, можливо, ви хочете включити її у версію TIO).
німі


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^1це 1 ...?
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

Математика, 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.