首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何找到伪币?

如何找到伪币?
EN

Code Golf用户
提问于 2023-02-14 09:26:36
回答 4查看 244关注 0票数 7

你是财务主管,你已经收到一枚伪币进入国库的消息。你只知道假币比原来的要轻。

知道你总共有多少硬币,并且只使用一个平衡秤,你需要确定最低数量的重量,以确定哪一个硬币是伪造的,然后才能从国库消失。

您的函数必须只接受一个整数(大于1),并且必须输出2件事情:

  • 没有幸运机会的最小重量数
  • 如何找到伪币的步骤

步骤-当你使用平衡秤的时候

如果没有幸运的机会,就意味着你的数字必须是所需的最低步骤中的最大值。例如,假设你有5个硬币:

  1. 你可以按2,2和1将他们分成3组(这不是一个步骤)
  2. 2.1如果它们相等,那么剩下的硬币是假的2.2。如果其中一组较轻,那么伪币就属于那一组。
  3. 称重每枚剩余硬币(这是一步) 3.1较轻的硬币是伪币

因此,没有幸运机会的最小称重数是2,但幸运机会是1,因为我们可以在第2步找到假币。

输出步骤必须易于理解。请添加如何读取输出步骤的详细说明。例如,前面的示例可以如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
[5(2,2) 2(1,1)] - 2

其中:

  • [] -意味着可能的场景
  • x(y,z) - x是指在前一步之后剩下的硬币,(y,z)是指我正在称重的天平的每一边有多少枚硬币(来自x)。
  • 'space' -表示下一步/方案
  • - x --指没有幸运机会的最小重量数。

下面是8的一个示例。输出可以如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
[8(3,3) [2(1,1)] [3(1,1)]] - 2

在第一步之后,我们有两种不同的场景,因为:

  1. 如果3组中的2组相等,那么伪币就在2枚硬币组中。
  2. 如果3组中的2组不相等,那么伪币就在3组中的一组上。

在每个场景中,只要称两枚不同的硬币就足以找到假币。不管情况如何,没有幸运机会的最小重量数是2。

以下是2至9枚硬币的可能产出:

代码语言:javascript
代码运行次数:0
运行
复制
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种不同的场景。您可以输出其中任何一个:

代码语言:javascript
代码运行次数:0
运行
复制
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

每种编程语言中最短的代码获胜!

EN

回答 4

Code Golf用户

发布于 2023-02-16 06:57:51

Python,77字节

-4来自@TheThonnu

代码语言:javascript
代码运行次数:0
运行
复制
f=lambda n:n<4and[1]or(m:=-~n//3,p:=n-2*m,f(m),f(p),max(f(m)[-1],f(p)[-1])+1)

在网上试试!

如果输入为2或3,则返回[1],这意味着只需要一个琐碎的称重,否则返回一个5元组(此步骤中每边要称的硬币数、此步骤中要放置的硬币数、如果有较轻的边则与硬币的较轻边一起执行的步骤,如果刻度平衡,最坏情况下所需的步骤数)。自然是元组的第三和第四元素。

票数 3
EN

Code Golf用户

发布于 2023-02-16 09:58:53

木炭,44字节

代码语言:javascript
代码运行次数:0
运行
复制
⊞υNW⊖⌈υ«≔⊕÷⊖ι³θ≔⁺⁻υ⟦⊕ι⟧⟦θ⁻⊕ι⊗θ⟧υ⟦⪫⟦⊕ιθL↨ι³⟧ 

在网上试试!链接是详细的代码版本。输出三个整数集:剩馀硬币、要称重的硬币(每边)、最坏情况下的剩余称重数。说明:灵感来自@ParclyTaxel的Python答案。

代码语言:javascript
代码运行次数:0
运行
复制
⊞υN

n硬币开始。

代码语言:javascript
代码运行次数:0
运行
复制
W⊖⌈υ«

重复,直到只剩下1硬币。

代码语言:javascript
代码运行次数:0
运行
复制
≔⊕÷⊖ι³θ

计算一下要称多少硬币。

代码语言:javascript
代码运行次数:0
运行
复制
≔⁺⁻υ⟦⊕ι⟧⟦θ⁻⊕ι⊗θ⟧υ

更新剩余硬币的可能数量。

代码语言:javascript
代码运行次数:0
运行
复制
⟦⪫⟦⊕ιθL↨ι³⟧ 

输出硬币左,硬币称重和步骤左。

票数 2
EN

Code Golf用户

发布于 2023-04-10 11:29:13

Mathematica,106个字节

@Parcly Taxel的答案改性

黄金版,在网上试试!

代码语言:javascript
代码运行次数:0
运行
复制
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版本

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/257803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档