段ボールの桁数はいくつ必要ですか?


32

数字を表示するために、段ボール製の数字を準備する必要があります()。どの数字を表示する必要があるかは事前にわかりません。知っているのは、それがを超えないことだけnです。

段ボールの数字を何桁用意すればよいですか?

例: n = 50

0 ... 50の範囲の数字を表示するには、次の数字が必要です。

  1. ゼロ、数値0またはその他のラウンド数を表示するため
  2. 対応する数字を表示するための数字1、2、3、4の2つのコピー
  3. 数字5、6、7、8の1つのコピー。数字の最下位桁として表示される場合
  4. 代わりに逆の数字6を使用できるため、数字9は必要ありません。

合計: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

いいえ(例を参照)
アナトリグ

したがって、2つの1を重ねて7を作成することはできません
-user253751

2
...そして、2つのゼロで8を作ることはできません。それはいでしょう。
アナトリグ

おそらく厄介な質問ですが、これらは「段ボール」の数字なので、必要な合計を節約するために両面印刷できますか?この例では、たとえば6と0を一緒に使用する必要はありません。
ウェッカー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いい答えです。
ハイパーニュートリノ

10
@HyperNeutrinoボットはチャレンジからテストケースを抽出し、スーパーコンピューターを使用してあらゆる可能なゼリープログラムを試行します。
-NieDzejkob

1
@HyperNeutrinoあなたは気持ちを知っています...特にあなたの解決策があれば0rDŒr€ẎQṪÞẎḟ9ĠẎL
エリックアウトゴルファー

ḟ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が追加されないようにします。

9つの未使用行うことで処理される可能性がされていることを指摘により5つのバイトを保存するためのニールのおかげでn*9+8するのではなくn*9+9、そのようには、たとえば、999*9+8=89999000にロールオーバーされません。


@ovsこれはまったく機能しません。最初の数字を知るだけでは十分ではありません。たとえば、333335つの3が22222必要ですが、必要なのは4つだけです。n*9[0]は魅力的ですが、で始まる数値と1それ未満の数値では失敗します111..
xnor

私の計算(私のバッチの回答を参照)により、おそらくを使用(n*9+8)/10**len(`n`)しないようにすることができますmin
ニール

7

ハスケル117 114 108 95 89 88 87 84 82 63バイト

Laikoniのおかげで6バイト節約

nimiのおかげで1 4 6バイト節約

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ポイントフリー関数リテラルで置き換えることができます:sum.(#[-9..])
-nimi

@nimi pointfree関数リテラルが何であるかはわかりませんが、あなたが提案していることはわかると思います。私が間違っているかどうか教えてください。
小麦ウィザード

1
...およびlength[x|x<-...]ですsum[1|x<-...]
-nimi

1
関数には名前をg=付けることができないため、関数は不要です(ただし、TIOバージョンに含めることもできます)。
nimi


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まあ、それはtrueinput を提供する0ので、私はそれをすることに少し抵抗があります。
-ETHproductions

0>9偽、false^11 ...?
電卓

@CalculatorFelineはい、数値の代わりにブール値を出力するのをためらっていますtrue1
-ETHproductions

4

バッチ、67バイト

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

この問題の標準定式化では69数字と数字が必要ですが、を表示する必要はありません0n必要な最大値が増加すると、repdigitに到達するたびに(十分な数がないため)必要な数字の数が増加し、10(余分なゼロが必要な場合)の累乗に達するたびに増加します。合計では、それぞれの累乗に1010、前の数字よりも多くの数字が必要floor(log10(n))*10です。n10の累乗の間の値の場合、中間のrepdigitsの数は、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))

の複製には2つの効果が6あり9ます。1つ目910、の各累乗に必要な数字のみであり、2つ目は、repdigit検出がrepdigitsを無視する必要があること9です。幸いなことに、それらは10のべき乗よりも1つ少ないため、数式を調整してを得ることができます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)&


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.