Kaç tane karton basamağa ihtiyacım var?


32

Bir sayı görüntülemek için kartondan rakamları hazırlamam gerekiyor ( örnek ). Hangi numarayı göstermem gerektiğini önceden bilmiyorum - bildiğim tek şey daha büyük olmadığı n.

Kaç tane karton rakam hazırlamalıyım?

Örnek: n = 50

0 ... 50 aralığında herhangi bir sayıyı görüntülemek için aşağıdaki sayılara ihtiyacım var:

  1. 0 sayısını veya başka bir tur numarasını görüntülemek için sıfır
  2. İlgili sayıları görüntülemek için basamak 1, 2, 3 ve 4'ün iki kopyası
  3. Rakamların en az önemli basamağı olarak görünmeleri için basamak 5, 6, 7 ve 8'in bir kopyası
  4. 9 rakamına asla ihtiyaç duyulmaz, çünkü bunun yerine ters basamak 6'yı kullanabilirim

Toplam: 13 hane

Test durumları (her satır "input; output" biçiminde bir test durumudur)

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'dan başka bir rakam çevrilebilir mi?
feersum

Hayır (örneğe bakın)
anatolyg

Yani iki 1, 7 yapmak için
kaplanamaz

2
... ve iki sıfır 8 yapamaz. Bu çirkin olurdu.
anatolyg

Muhtemelen garip bir soru, ancak bunlar 'karton' rakamları olduğu için, gerekli toplamı kurtarmak için çift taraflı basılabilirler mi? Örnekte, örneğin 6'ya ve 0'a asla ihtiyaç duymazsınız.
Weckar E.

Yanıtlar:


16

Jöle , 9 bayt

‘ḶDœ|/ḟ9L

Çevrimiçi deneyin!

Nasıl çalışır

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

14
Çok hızlı>. <Yemin ederim, evrendeki bilinen her meydan okuma için bir Jelly cevabınız var ve meydan okumadan hemen sonra bunları göndermek için bir botunuz var. : P Güzel cevap.
HyperNeutrino

10
@HyperNeutrino Bence bot test görevlerini zorluyor ve bir bilgisayar kullanarak mümkün olan her jöle programını deniyor.
NieDzejkob

1
@HyperNeutrino Bu hissi biliyorsunuz ... özellikle de çözümünüz ise 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Outgolfer Erik,

Bir an için ḟ9 parçanın geçerliliğinden şüphelendim, sonra 6 <9 fark ettim, böylece 6s sayısı her kombinasyonda toplam 6s ve 9s sayısından daha az olamaz.
Nader Ghanbari

7

Python 2,49 bayt

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

Çevrimiçi deneyin!

Sakar bir aritmetik formül. Olduğunu varsayalım nbir dahilinde uyuyor intbir şekilde Leklenmez.

9 en kullanılmayan yaparak ele alınabileceği ediliyor işaret ederek 5 bayt kaydetmek için Neil sayesinde n*9+8yerine n*9+9, böylece, diyelim ki, 999*9+8=89999000 devredilir etmez.


@ovs Bu pek işe yaramadı, ilk haneyi bilmek yeterli değil. Örneğin 33333, beş 3'lü ama 22222sadece dört gerektirir. n*9[0] caziptir, ancak 1ondan başlayan sayılar için başarısız olur 111...
xnor

Hesaplamalarıma göre (Toplu cevabım'a bakınız) kullanmaktan (n*9+8)/10**len(`n`)kaçınmak için muhtemelen kullanabilirsiniz min.
Neil

7

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

Laikoni sayesinde 6 bayt kurtarıldı

Nimi sayesinde 1 4 6 bayt kaydedildi

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

Çevrimiçi deneyin!


3
1.) maximum[a,b]aynıdır max a b. 2.) Liste kavramaları genellikle filtermax d$sum[1|x<-show a,x==b]
şunlardan

1
Sen yerini alabilecek gbir pointfree fonksiyonu sabitin ile: sum.(#[-9..]).
nimi

@ Nimi anlamsız bir fonksiyonun ne anlama geldiğini bilmiyorum, ama ne önerdiğini anlıyorum. Yanılıyorsam söyle.
Buğday Sihirbazı,

1
... ve length[x|x<-...]bir sum[1|x<-...].
nimi

1
İşlevler adsız olabilir, bu yüzden gerek yok g=(ama belki TIO sürümüne dahil etmek istersiniz).
nimi

5

Mathematica, 49 bayt

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

Güzel! Bu benim cevabımı temel alıyor mu?
J42161217

5

JavaScript (ES6), 60 53 bayt

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

Bir çeşit sahte özyinelemeli çözüm. Bu, rakam eklemeyi gerektiren sayıları oluşturur:

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

ve sonra girişin kaç tanesinden daha az olduğunu sayar. Mutlu bir mucize ile, rakamın kaldırılması 9aslında fonksiyondan birkaç byte'ı kaldırır , çünkü daha sonra sıra şöyle üretilebilir (tamsayı bölünerek):

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

10'un altındaki sayıların hala sıfırı gerektirdiği gerçeğini göz önüne almak zorundayız, ancak bu n > 9 ? 0 : 1sonuca eklemek kadar basit .

Test durumları


n>9^1Muhtemelen olabilirn<10
CalculatorFeline

@CalculatorFeline Eh, bu truegiriş için verir 0, bu yüzden bunu yapmak için biraz tereddüt ediyorum.
ETHproductions

0>9yanlış, false^11 ...?
Hesap MakinesiFeline

Evet @CalculatorFeline, ben tereddüt olduğum söylüyorum çıktı boolean truenumarası yerine 1.
ETHproductions

4

Toplu iş, 67 bayt

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

Bu sorunun standart formülasyonunda, ayrı 6ve 9rakamlara ihtiyacınız vardır , ancak görüntülemeniz gerekmez 0. nGereken maksimum değer arttıkça, bir repdiite her ulaştığınızda (bu sayıya yeteri kadar sahip değilsinizdir) ve her zaman 10(fazladan bir sıfıra ihtiyacınız olduğunda) gücüne ulaştığınızda gerekli sayıların sayısı artar . Toplam Her enerji olarak 10ihtiyaç 10olarak caluclated edilebilir bir önceki daha numaraları, floor(log10(n))*10. n10'luk güçler arasındaki değerler için, ara sıraların sayısı daha sonra floor(n/((10**floor(log10(n))*10-1)/9))veya alternatif olarak hesaplanabilir floor(n*9/(10**floor(log10(n))*10-1)).

floor(log10(n))İlk satırdaki döngü aracılığıyla hesaplarım . Her seferinde, %2bir ekstra kazanır 0ve %3bir ekstra kazanır -~. Bu, 10%2olduğu 10*10**floor(log10(n))ve %30olduğu anlamına gelir floor(log10(n)).

Çoğaltılması 6ve 9iki etkisi vardır: birincisi, sadece 9her bir güç için gerekli sayılar vardır 10ve ikincisi repdigit saptamanın, 9repdigitleri görmezden gelmesi gerekir. Neyse ki onlar 10'luk bir güçten daha az olduklarından, bu sonuçta ortaya çıkacak formülü ayarlayarak başarılabilir floor((n*9+8)/(10**floor(log10(n))*10)).

Sıfır ile başa çıkmak oldukça basittir: bu sadece zaman ekstra bir rakamı gerektirir n<10, yani floor(log10(n))==0.


2

Mathematica, 83 bayt

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.