我需要几个硬纸板数字?


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

否(请参见示例)
anatolyg

因此,两个1不能叠加成7,那么
user253751 '17

2
...并且两个零不能成为8。这太丑了。
anatolyg

可能是一个尴尬的问题,但是由于这些是“纸板”数字,是否可以将它们双面打印以节省所需的总数?在该示例中,例如,您永远不需要6和0。
Weckar E.

Answers:


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
暴民埃里克(Erik the Outgolfer)

我暂时怀疑ḟ9部分的有效性,然后我意识到6 <9,所以6s的数量不能少于每个组合中6s和9s的总和。
Nader Ghanbari

7

Python 2,49个字节

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

在线尝试!

笨拙的算术公式。假设n适合一个,int因此L不会附加。

感谢Neil指出可以通过执行n*9+8而不是来处理9的未使用来节省5个字节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

Haskell117 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]
Laikoni

1
您可以g使用无点函数文字替换:sum.(#[-9..])
nimi 2015年

@nimi我不知道什么是无点函数常量,但是我想我明白您的建议。告诉我我是否错。
小麦巫师

1
... length[x|x<-...]sum[1|x<-...]
nimi 2015年

1
函数可以是未命名的,因此不需要g=(但是您可能希望将其包括在TIO版本中)。
nimi 2015年

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

一种hacky递归解决方案。这将生成需要添加数字的数字:

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了input 0,所以我有点犹豫。
ETH生产

0>9是假的,false^1是1 ...?
CalculatorFeline

@CalculatorFeline是的,我是在犹豫是否要输出布尔值true来代替number 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

在这个问题的标准制定,需要分离69数字,但是不需要显示0。随着所需最大值的n增加,每次到达一个位数时(因为该数字不够用)和一次幂10(每次需要额外的零)时,所需数字的数量就会增加。总的来说,每一个幂的10需求都需要10比前一个更大的数字,可以将其计算为floor(log10(n))*10。对于n在10的幂之间的值,则中间repdigit的数量可以计算为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%2is 10*10**floor(log10(n))%30is floor(log10(n))

的复制69有两个作用:第一,仅存在9用于每个功率所需标记10,并且其次将纯位数检测需要忽略9repdigits。幸运的是,由于它们小于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)&


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.