计算纸牌屋中的纸牌数量

calculate number of cards in a house of cards

背景故事:

所以我儿子随机来找我,问我如何写一个代数(?)表达式来计算根据指定的级别数制作纸牌屋需要多少张纸牌。我相当确定这实际上不是作业问题;如果他需要帮助,他通常会向我展示工作表。

"assumptions"是

a) 每层之间横放卡片,用于支撑;一张卡作为两张 "peaks" 之间的 "bridge" b) 最底层(地面层)下面没有任何水平卡片,因为 floor/table 本身就是支撑。

例如,单层只有 2 张卡片:/\

再举个例子:3层共15张卡片(请原谅我的烂图!)

   /_\
 /_\ /_\
/ \/ \/ \

好吧,我不擅长这种事情。我只知道 基础 代数,但我认为自己是一个相当不错的(但不是 "pro")程序员。但是无论如何,对于一个纯代数公式,我无法想出一个公式来计算 all 张卡片,但我确实想出了一个公式来计算卡片的数量基于上述假设的给定层:2v + (v - 1)

好吧,可能有一个 better/simplified 方程,而且,这只是针对给定的层,而不是所有层。因此,例如第 1 层(顶层),v=1,因此卡的数量为 2。或者对于第 3 层,v=3,因此卡的数量为 8(因此此公式计算水平支撑作为给定层的一部分)。

而且..这就是我对纯代数的了解。然而!使用一些计算机代码(javascript 是我使用的),我能够根据上面的等式创建一个函数,return 卡片的数量:

function getNumHouseCards(layers) {
    var layers = layers || 1;
    var cards = 0;
    for (var v = 1; v <= layers; v++) {
        cards += (2 * v) + (v - 1);
    }
    return cards;
}

与函数中的 returned 值相比,我对卡片进行了一些手动计数,这似乎是合法的,所以我应该很高兴,但是..我觉得这可以做得更好。所以..

问题:

如何改进?我想首先,有一种方法可以只用代数表达式来写这个,还是真的需要编码来回答这样的问题?在任何一种情况下,我都觉得我把它复杂化了(好吧,至少我做的部分是这样......)

这个表达式覆盖它:

(y代表牌张数,x表示层数)


在 JavaScript 中实现,并将输出与您的方法的输出进行比较:

function yourNumberOfCards(layers) {
    var layers = layers || 1;
    var cards = 0;
    for (var v = 1; v <= layers; v++) {
        cards += (2 * v) + (v - 1);
    }
    return cards;
}

function myNumberOfCards(layers) {
  return (3 * Math.pow(layers, 2)) / 2 + (layers / 2);
}

for (let i = 1; i <= 10; i++) {
  const yours = yourNumberOfCards(i);
  const mine = myNumberOfCards(i);
  
  console.log(yours + (yours === mine ? " == " : " != ") + mine);
}

我是怎么到那里的?我计算了前几个值,然后 运行 WolframAlpha 上的多项式插值。

I am not sure about the algebraic formula but got a pattern

start = 2 (basic 1 level) then as and how you need to increase a level the extra cards will be 5 (level 2) so total is 5+2=7, then for level 3 you need 8(level 3) cards extra from level 2 that would be 7+8=15. So summing up we can write this, basically it forms a simple progression. we need to find the sum of progression. Here is a formula for number of cards for a given height or level,

    2 + ((10+(n-1)3)*(n/2))

    where n is the level or height.

example : level 1, n=1 => 7

  /_\  -> level 1
 /\ /\ -> level 0

example : level 2, n=2 => 15

  /_\     -> level 2
 /_\/_\   -> level 1
/ \/ \/ \ -> level 0

所有这些评论都是很好的反馈,但其中大多数在 2 或 1 处存在缺陷。这个等式有效,但你需要了解 sigmas,所以查一下,这个有效。

               x-1.         x-1
           Y=(2sigma x+1)+(sigma x+1)-x
               n=0.         n=0

这意味着您添加 x to x-1 and addition of this to x-2

直到达到零并将其乘以二。这将找到交叉卡的卡数。另一部分找到平牌的牌。它通过添加 x+x-1+x-1

来实现

直到你像顶部一样达到零,然后减去x,因为随着层数的增加,你将不得不从每个平面层拿走一张牌,因为x是层数,所以这个有效每一次。