Berapa banyak angka kardus yang saya butuhkan?

32

Saya perlu menyiapkan angka yang terbuat dari karton untuk menampilkan beberapa nomor ( contoh ). Saya tidak tahu sebelumnya nomor mana yang harus saya tampilkan - satu-satunya yang saya tahu adalah tidak lebih besar dari itu n.

Berapa banyak angka karton yang harus saya siapkan?

Contoh: n = 50

Untuk menampilkan nomor apa pun dalam kisaran 0 ... 50, saya perlu digit berikut:

  1. A nol, untuk menampilkan angka 0, atau angka bulat lainnya
  2. Dua salinan digit 1, 2, 3 dan 4, untuk menampilkan nomor yang sesuai
  3. Satu salinan dari angka 5, 6, 7 dan 8, untuk kasus mereka muncul sebagai digit paling tidak penting dalam nomor
  4. Digit 9 tidak pernah diperlukan, karena saya bisa menggunakan digit 6 terbalik

Total: 13 digit

Test case (setiap baris adalah test case dalam format "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
anatolyg
sumber
2
Bisakah digit lainnya diputar selain 6/9?
feersum
Tidak (lihat contoh)
anatolyg
Jadi dua 1 tidak dapat dilapis untuk menghasilkan 7 saat itu
user253751
2
... dan dua nol tidak dapat membuat 8. Itu akan menjadi jelek.
anatolyg
Mungkin pertanyaan yang aneh, tetapi karena ini adalah angka 'kardus', bisakah mereka dicetak dua sisi untuk menghemat total yang diperlukan? Dalam contoh, Anda tidak akan pernah perlu 6 dan 0 bersama, misalnya.
Weckar E.

Jawaban:

16

Jelly , 9 byte

‘ḶDœ|/ḟ9L

Cobalah online!

Bagaimana itu bekerja

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length
Biarawati Bocor
sumber
14
Terlalu cepat>. <Aku bersumpah, kamu punya jawaban Jelly untuk setiap tantangan yang diketahui di alam semesta dan kamu hanya punya bot untuk mempostingnya tepat setelah tantangan. : P Jawaban yang bagus.
HyperNeutrino
10
@HyperNeutrino Saya pikir bot mengekstrak testcases dari tantangan dan mencoba setiap program jelly yang mungkin menggunakan superkomputer.
NieDzejkob
1
@HyperNeutrino Anda tahu perasaan ... terutama jika solusi Anda 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Erik the Outgolfer
Saya meragukan validitas ḟ9 bagian untuk sesaat, kemudian saya menyadari 6 <9 sehingga jumlah 6s tidak bisa kurang dari jumlah total yang mungkin 6s dan 9 yang digabungkan dalam setiap kombinasi.
Nader Ghanbari
7

Python 2 , 49 byte

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

Cobalah online!

Formula aritmatika yang kikuk. Anggap itu ncocok di dalam intsehingga Ltidak ditambahkan.

Terima kasih kepada Neil karena telah menghemat 5 byte dengan menunjukkan bahwa 9 yang tidak digunakan dapat ditangani dengan melakukan n*9+8alih - alih n*9+9, sehingga, katakanlah, 999*9+8=8999tidak masuk ke 9000.

Tidak
sumber
@ovs Itu tidak cukup berhasil, itu tidak cukup untuk mengetahui digit pertama. Misalnya 33333membutuhkan lima 3 tetapi 22222hanya membutuhkan empat. n*9[0] menggoda, tetapi gagal untuk angka yang dimulai dengan 1dan kurang dari itu 111...
xnor
Dengan perhitungan saya (lihat jawaban Batch saya), Anda mungkin dapat menggunakan (n*9+8)/10**len(`n`)untuk menghindari penggunaan min.
Neil
7

Haskell , 117 114 108 95 89 88 87 84 82 63 byte

6 byte disimpan berkat Laikoni

1 4 6 byte disimpan berkat nimi

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

Cobalah online!

Wisaya Gandum
sumber
3
1.) maximum[a,b]sama dengan max a b. 2.) Pemahaman daftar seringkali lebih pendek dari filter:max d$sum[1|x<-show a,x==b]
Laikoni
1
Anda dapat mengganti gdengan fungsi pointfree literal: sum.(#[-9..]).
nimi
@nimi Saya tidak tahu apa fungsi pointfree literal, tapi saya rasa saya mengerti apa yang Anda sarankan. Katakan kalau aku salah.
Wheat Wizard
1
... dan length[x|x<-...]itu sum[1|x<-...].
nimi
1
Fungsi dapat dinamai, jadi tidak perlu untuk g=(tetapi mungkin Anda ingin memasukkannya dalam versi TIO).
nimi
5

Mathematica, 49 byte

Tr@Delete[Max~MapThread~DigitCount@Range[0,#],9]&
alephalpha
sumber
bagus! Apakah ini berdasarkan jawaban saya?
J42161217
5

JavaScript (ES6), 60 53 byte

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

Semacam solusi rekursif hacky. Ini menghasilkan angka-angka yang membutuhkan penambahan digit:

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

dan kemudian menghitung berapa banyak yang kurang dari input. Dengan mukjizat yang bahagia, menghapus digit 9sebenarnya menghilangkan beberapa byte dari fungsi, karena urutannya kemudian dapat dihasilkan seperti itu (dengan asumsi pembagian bilangan bulat):

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

Kita harus memperhitungkan fakta bahwa angka di bawah 10 masih membutuhkan nol, tapi ini sesederhana menambah n > 9 ? 0 : 1hasilnya.

Uji kasus

Produksi ETH
sumber
n>9^1mungkin bisan<10
CalculatorFeline
@ CalculatorFeline Nah, itu memberi truemasukan 0, jadi saya agak ragu untuk melakukan itu.
ETHproduk
0>9salah, false^1apakah 1 ...?
CalculatorFeline
@ CalculatorFeline Ya, saya katakan saya ragu untuk mengeluarkan boolean truesebagai pengganti nomor tersebut 1.
ETHproductions
4

Batch, 67 byte

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

Dalam perumusan standar masalah ini, Anda perlu angka 6dan 9angka yang terpisah , tetapi Anda tidak diharuskan untuk menampilkannya 0. Ketika nilai maksimum yang ndiperlukan meningkat, jumlah angka yang diperlukan meningkat setiap kali Anda mencapai repdigit (karena Anda tidak memiliki cukup angka itu) dan setiap kali Anda mencapai kekuatan 10(ketika Anda membutuhkan nol tambahan). Secara total masing-masing kekuatan 10membutuhkan 10lebih banyak angka daripada yang sebelumnya, yang dapat dihitung sebagai floor(log10(n))*10. Untuk nilai-nilai di nantara kekuatan 10, jumlah repdigits menengah kemudian dapat dihitung sebagai floor(n/((10**floor(log10(n))*10-1)/9))atau sebagai alternatif floor(n*9/(10**floor(log10(n))*10-1)).

Saya menghitung floor(log10(n))melalui loop pada baris pertama. Setiap kali, %2dapatkan ekstra 0dan %3dapatkan ekstra -~. Ini berarti apa 10%2adanya 10*10**floor(log10(n))dan apa %30adanya floor(log10(n)).

Duplikasi 6dan 9memiliki dua efek: pertama, hanya ada 9angka yang diperlukan untuk masing-masing kekuatan 10, dan kedua deteksi repdigit perlu mengabaikan 9repdigits. Untungnya karena mereka satu kurang dari kekuatan 10 ini dapat dicapai dengan mengubah rumus untuk menghasilkan floor((n*9+8)/(10**floor(log10(n))*10)).

Berurusan dengan nol cukup sederhana: ini hanya membutuhkan angka tambahan ketika n<10, yaitu floor(log10(n))==0.

Neil
sumber
2

Mathematica, 83 byte

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

Python 3 , 75 byte

lambda n:sum(max(str(j).count(str(i))for j in range(n+1))for i in range(9))

Cobalah online!

Biarawati Bocor
sumber