背景
在法国以及可能在欧盟其他地区,任何可供出售的食品都必须在其包装上列出其成分,并按重量百分比降序排列。但是,除非成分由文字或封面上的图像突出显示,否则不必指示确切的百分比。
例如,我的罗勒番茄酱在包装上仅显示一些大红色西红柿和美丽的罗勒叶,具有以下指示:
成分:西红柿80%,洋葱片,罗勒1.4%,海盐,蒜泥,生蔗糖,特级初榨橄榄油,黑胡椒。
听起来很美味,但是…… 我到底要吃多少洋葱?
挑战
给定重量百分比降序列表(最终不完整),输出可能在配方中找到的最小和最大重量百分比的完整列表。
- 您可以编写函数或完整程序。
- 该输入可以是任何合理的形式(数字或字符串列表的阵列,例如)。分数值应至少支持小数点后一位。如果丢失一个重量百分比可以在任何一致和明确的方式来表示(
0
,'?'
或者null
,例如)。你可以假定输入总是会关联到一个有效的配方([70]
和[∅, ∅, 50]
无效,例如)。 - 所述输出可以是任何合理的形式(一个阵列两者的最小和最大重量百分比,或双峰的单个列表的,例如)。最小百分比和最大百分比可以任意顺序(
[min, max]
并且[max, min]
都可以接受)。确切的重量百分比无需与其他百分比进行不同的处理,可以用相等的最小和最大值表示。
适用于代码高尔夫球的标准规则:在您键入代码时,我的面食正在冷却,因此最短的提交者获胜。
例子
由于此问题比乍看之下要困难得多,因此,这是一些情况的逐步解决方案。
[40, ∅, ∅]
咱们分别调用x
和y
两名失踪的百分比。
- 因为它紧随第一成分之后为40%,
x
所以本身不能高于40%。[40, [?, 40], [?, ?]]
- 这两个缺失百分比之和始终为60%。所以 :
- 如果
x
取其最大值,则y
取其最小值,因此为60%-40%= 20%。[40, [?, 40], [20, ?]]
- 如果
x
取其最小值,则y
取其最大值。但x
不能低于y
,因此在这种情况下x
=y
= 60%/ 2 = 30%。[40, [30, 40], [20, 30]]
- 如果
[70, ∅, ∅, 5, ∅]
让我们分别叫x
,y
和z
三个缺失的百分比。
- 的最小和最大百分比
z
必须在0%到5%之间。让我们z
暂时假设= 0%。这两个缺失百分比之和始终为25%。所以 :[70, [?, ?], [?, ?], 5, [0, 5]]
- 如果
y
取其最小值 5%,则x
取其最大值,即25%-5%= 20%。[70, [?, 20], [5, ?], 5, [0, 5]]
- 如果
y
取其最大值,则x
取其最小值。但x
不能低于y
,因此在这种情况下x
=y
= 25%/ 2 = 12.5%。[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- 如果
- 让我们验证一下,假设现在
z
等于5%,一切都很好。这两个缺失百分比的总和始终为20%。所以 :- 如果
y
取其最小值 5%,则x
取其最大值,即20%-5%= 15%。这种情况已包含在先前计算的范围内。 - 如果
y
取其最大值,则x
取其最小值。但是x
不能低于y
,因此在这种情况下x
=y
= 20%/ 2 = 10%。该案例已经包含在的先前计算范围内y
,但不包含在之中x
。[70, [10, 20], [5, 12.5], 5, [0, 5]]
- 如果
测试用例
Input: [∅]
Output: [100]
Input: [70, 30]
Output: [70, 30]
Input: [70, ∅, ∅]
Output: [70, [15, 30], [0, 15]]
Input: [40, ∅, ∅]
Output: [40, [30, 40], [20, 30]]
Input: [∅, ∅, 10]
Output: [[45, 80], [10, 45], 10]
Input: [70, ∅, ∅, ∅]
Output: [70, [10, 30], [0, 15], [0, 10]]
Input: [70, ∅, ∅, 5, ∅]
Output: [70, [10, 20], [5, 12.5], 5, [0, 5]]
Input: [30, ∅, ∅, ∅, 10, ∅, ∅, 5, ∅, ∅]
Output: [30, [10, 25], [10, 17.5], [10, 15], 10, [5, 10], [5, 10], 5, [0, 5], [0, 5]]
5
完全无关
—
魔术
我想补充的输入到输出的一步一步的解释
—
凯文·克鲁伊森
[40, ∅, ∅]
,并[70, ∅, ∅, 5, ∅]
让事情有点更清晰。在不查看测试用例的情况下应该明确挑战,目前情况并非如此。如果我正确理解以下内容[40, ∅, ∅]
:100%需要60以上,再除以这两个∅
。第一个∅
必须为30或更高(否则第二个∅
将在其之上,当按顺序排列时这不可能)。此外,它不能在上方40
,因此第一个∅
变为[30,40]
,第二个变为[(100-40-40=)20, (100-40-30=)30]
。
一致
—
l4m2 '18年
[min,max]
/ [max,min]
或混合允许?
@ l4m2混合
—
黑洞
[min,max]
并[max,min]
可以接受边界,但是由于它不会导致模棱两可的结果,因此我想这是可以的。
也许我缺少了一些东西,但是为什么
—
DLosc '18年
[70, 12, 11, 5, 2]
第二个例子不起作用?如果确实有效,则的最小值x
将小于12.5
。