你是财务主管,你已经收到一枚伪币进入国库的消息。你只知道假币比原来的要轻。
知道你总共有多少硬币,并且只使用一个平衡秤,你需要确定最低数量的重量,以确定哪一个硬币是伪造的,然后才能从国库消失。
您的函数必须只接受一个整数(大于1),并且必须输出2件事情:
步骤-当你使用平衡秤的时候
如果没有幸运的机会,就意味着你的数字必须是所需的最低步骤中的最大值。例如,假设你有5个硬币:
因此,没有幸运机会的最小称重数是2,但幸运机会是1,因为我们可以在第2步找到假币。
输出步骤必须易于理解。请添加如何读取输出步骤的详细说明。例如,前面的示例可以如下所示:
[5(2,2) 2(1,1)] - 2
其中:
[]
-意味着可能的场景x(y,z)
- x
是指在前一步之后剩下的硬币,(y,z)
是指我正在称重的天平的每一边有多少枚硬币(来自x
)。'space'
-表示下一步/方案- x
--指没有幸运机会的最小重量数。下面是8
的一个示例。输出可以如下所示:
[8(3,3) [2(1,1)] [3(1,1)]] - 2
在第一步之后,我们有两种不同的场景,因为:
在每个场景中,只要称两枚不同的硬币就足以找到假币。不管情况如何,没有幸运机会的最小重量数是2。
以下是2至9枚硬币的可能产出:
2 --> [2(1,1)] - 1
3 --> [3(1,1)] - 1
4 --> [4(2,2) 2(1,1)] - 2
5 --> [5(2,2) 2(1,1)] - 2
6 --> [6(2,2) 2(1,1)] - 2
7 --> [7(3,3) 3(1,1)] - 2
8 --> [8(3,3) [2(1,1)] [3(1,1)]] - 2
9 --> [9(3,3) 3(1,1)] - 2
你可以输出任何可能的步骤,如何找到假币。例如,对于10
,我们有5种不同的场景。您可以输出其中任何一个:
10 --> [10(5,5) 5(2,2) 2(1,1)] - 3
10 --> [10(4,4) [2(1,1)] [4(2,2) 2(1,1)]] - 3
10 --> [10(3,3) [3(1,1)] [4(2,2) 2(1,1)]] - 3
10 --> [10(2,2) [2(1,1)] [6(3,3) 3(1,1)]] - 3
10 --> [10(1,1) 8(3,3) [2(1,1)] [3(1,1)]] - 3
每种编程语言中最短的代码获胜!
发布于 2023-02-15 22:57:51
发布于 2023-02-16 01:58:53
发布于 2023-04-10 03:29:13
黄金版,在网上试试!
Module[{m,p,fm,fp,maxF},If[n<4,{1},m=-⌈BitNot[n]/3⌉;p=n-2*m;{m,p,f@m,f@p,Max[Last@*f@m,Last@*f@p]+1}]]
Ungolfed版本
f[n_] := Module[
{m, p, fm, fp, maxF},
If[n < 4,
{1},
m = -Ceiling[BitNot[n]/3];
p = n - 2*m;
fm = f[m];
fp = f[p];
maxF = Max[Last[fm], Last[fp]] + 1;
{m, p, fm, fp, maxF}
]
]
f[73]//Print
https://codegolf.stackexchange.com/questions/257803
复制