首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算巨魔通行费以安全通过

计算巨魔通行费以安全通过
EN

Code Golf用户
提问于 2014-10-10 18:03:23
回答 6查看 1.7K关注 0票数 12

https://puzzling.stackexchange.com/q/626启发

在你的冒险中,你到达了一系列的7座桥梁,你必须跨越。每座桥下都住着一个巨魔。为了过桥,你必须先给巨魔一些蛋糕,作为你携带的蛋糕数量的百分比。因为这些是善良的巨魔,他们会把一定数量的蛋糕还给你。

在每一天开始的时候,当地的巨魔王设定了每个旅行者必须缴纳的蛋糕税,还有巨魔蛋糕的退款--每个巨魔必须返还给旅行者的蛋糕数量。

你的工作是计算出当天在给定条件下通过所有7座巨魔桥所需的最小月饼数量。

假设:

  1. 两个输入参数:百分比蛋糕税(整数从0到100)和特罗尔蛋糕退款。
  2. 没有人,即使是巨魔,也不想要被另一个巨魔部分吃掉的蛋糕。如果你只剩下一小部分蛋糕,巨魔就会得到它。
  3. 如果巨魔接受蛋糕税,但又不得不把所有的蛋糕还给你(剩下的蛋糕和以前一样或更少),它就会生气,吃掉你和你的蛋糕。
  4. 每个巨魔必须至少保留一个完整的蛋糕。
  5. 你最多只能带100个蛋糕。
  6. 你需要结束的一天,你目前的位置或在所有7座桥的另一边。

挑战:

编写一个完整的程序,输出当前一天旅行的最少蛋糕数量,如果今天无法安全旅行,则为零--你将等待明天的数字。

输入应作为stdin、命令行参数或文件输入传递。

最短代码(字节计数)获胜。

示例:

25%蛋糕税,2巨无霸蛋糕退款。

从19个蛋糕开始

巨魔前1:(19 * 0.75) = 14.25

巨魔后1:(14 + 2) = 16

巨魔前2:(16 * 0.75) = 12

巨魔后2:(12 + 2) = 14

等。

19蛋糕-> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8

18份蛋糕-> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8(规则3)

对于18个蛋糕,最后的巨魔将不能保留任何蛋糕。因此,25%/2天的蛋糕的最低数量是19。

代码语言:javascript
复制
input: 25 2
output: 19

示例2:

90%蛋糕税,1块蛋糕退款

100份蛋糕-> 11 -> 2 -> 1(规则4)

第三个巨魔没有留下蛋糕。因此,即使从最大数量的蛋糕开始,90%/1天的旅行也是不可能的。

代码语言:javascript
复制
input: 90 1
output: 0

数据

建立一个输入和输出值的快速图表。我很惊讶这是不是“平滑”(如钟状曲线或类似的),有几个明显的岛屿。

有兴趣的人的数据。列分为5%间隔,行是单位1蛋糕退款间隔(excel旋转图像)。你可以看到没有超过28个蛋糕的退款。

代码语言:javascript
复制
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EN

回答 6

Code Golf用户

发布于 2014-10-13 02:07:20

APL (39)

代码语言:javascript
复制
T R←⎕⋄⊃Z/⍨{⍵(⊢×>)R+⌊⍵×1-T÷M}⍣7¨Z←⍳M←100

解释:

  • T R←⎕:从键盘读取两个数字,并将它们存储在T (tax)和R (return)中。
  • Z←⍳M←100:将数字100存储在M中,将从1100的所有数字存储在Z中。
  • {.}⍣7¨:对于Z中的每个元素,7次运行以下函数:
    • R+⌊1-T÷M:计算出需要支付多少蛋糕,
    • ⍵(⊢×>):如果巨魔最终得到的蛋糕比他开始的多,那么这个数量乘以1,如果不是,则乘以0。

  • ⊃Z/⍨:对于Z中的每个元素,用该函数给出的数字进行复制。(因此函数返回0的所有数字都消失了。)然后从该列表中选择第一项。如果列表最后为空,这将给出0
票数 4
EN

Code Golf用户

发布于 2014-10-16 11:51:40

C,83字节

代码语言:javascript
复制
int cake(int perc_taken, int given_back)
{
    int startcake = floor(100.f/perc_taken*given_back+1);
    for(int i = 0; i < 6; i++)
    {
        startcake = ceil((startcake-given_back) * 100.f/(100 - perc_taken));
    }
    return startcake;
}

如果它有效,它适用于所有可能的开始蛋糕,而不仅仅是从1到100。

编辑:它能工作。高尔夫球:

代码语言:javascript
复制
n(int p,int g) {int s=100./p*g+1,i=0;for(;i++<6;){s=ceil((s-g)*100./(100-p));}return s;}

以“最多100个蛋糕”为限:

代码语言:javascript
复制
n(int p,int g) {int s=100./p*g+1,i=0;for(;i++<6;){s=ceil((s-g)*100./(100-p));}return s>100?0:s;}

91字节

票数 3
EN

Code Golf用户

发布于 2014-10-12 22:07:45

CJam,36字节

代码语言:javascript
复制
q~:R100:H*\d:T/i){R-H*HT-/m]}6*_H)<*
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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