我的家人解决了一个编程挑战🎁
这是一个关于给一位软件工程师、一位机械工程师和一个蹒跚学步的孩子太多空闲时间会发生什么的故事……
当我看到@cassidoo最新一期电子报中的代码挑战时,我立刻来了兴趣,因为它让我想起了以前练习过的 SAT 题目。题目如下:
You have to order wrapping paper for presents.
Given the length, width, and height of the boxes
you need to wrap,
return the number of square feet (or whatever units you want)
of wrapping paper you need to order.
Extra credit: allow for other shapes
of presents and their dimensions!
因此,求正交面(边长为矩形或正方形的面)的表面积可能如下所示:
function getOrthotopeSurfaceArea(length, width, height) {
let firstVal = length * width * 2
let secondVal = length * height * 2
let thirdVal = height * width * 2
return firstVal + secondVal + thirdVal
}
正如卡西迪所建议的,我们可以通过加入其他形状来增加难度。我想到了球体或克莱因瓶。
但是后来我想,如果我真的要用这种方法包装礼物,该怎么办呢?重叠的部分该怎么处理?还有折叠到两端的那部分多余的布料该怎么折?
这时我转向了我的丈夫,他拥有机械工程学位,所以我猜他肯定很擅长……
使这项挑战更加困难简化问题。
他想出了这个解决方案:
正如你所见,我们家的小女儿帮了他。她告诉我们她写了“A、O、E”。我们记下了这些信息,以备将来之需。结果并没有用上。但我们是一个团队,所以我们的目标是尊重彼此的意见,即使这些意见最终没有被采纳。
基本上,笔记里列出了以下步骤:
-
将长度、宽度和高度按从长到短的顺序重新排列。(这对我来说是编写代码最难的一步。)
-
找出重叠部分,即长度和宽度公差。如果长度或宽度大于 4 英寸,则公差为 2 英寸;否则,公差为长度或宽度的一半。
-
基于这些数值,他写出了两个方程来求解纸张的宽度和长度。
长度 = 最长输入值 + 2(最短值) + 2(长度容差)
宽度 = 最短输入值 + 2(中间值) + 2(宽度容差)
我做的第一件事是编写第一步的代码,也就是如何按大小顺序排列三个整数值。那只是占位符代码——一堆“如果……那么……”的条件语句,应该就够用了,对吧?但随后我丈夫带着所有可能的情况列表回到了房间:
我的天哪,布尔表达式!我真不想把这些都打出来。
所以我最终采用了指针方法来完成这一步。
function arrangeByValue(l, w, h) {
let arrayToSort = [l, w, h]
for (let i = 0; i < arrayToSort.length - 1; i++) {
let firstPointer = arrayToSort[i]
let secondPointer = arrayToSort[i + 1]
if (secondPointer > firstPointer) {
let originalSmallerVal = arrayToSort[i]
arrayToSort[i] = arrayToSort[i + 1]
arrayToSort[i + 1] = originalSmallerVal
}
}
return arrayToSort
}
现在我可以在步骤 2 和步骤 3 的代码中使用该函数了!
我做了以下事情:
function wrapThatGift(length, width, height) {
let arrangedArray = arrangeByValue(length, width, height)
let longest = arrangedArray[0]
let middle = arrangedArray[1]
let shortest = arrangedArray[2]
let widthTolerance
if (middle <= 4) {
widthTolerance = middle * 0.5
}
if (middle > 4) {
widthTolerance = 2
}
let lengthTolerance
if (length <= 4) {
lengthTolerance = length * 0.5
}
if (length > 4) {
lengthTolerance = 2
}
let paperWidth = shortest + 2 * middle + 2 * widthTolerance
let paperLength = longest + 2 * shortest + 2 * lengthTolerance
let wrappingPaperSurfaceArea = paperLength * paperWidth
return `${paperLength} inches by ${paperWidth} inches `
}
首先,我使用之前的函数重新排列了这些值:
let arrangedArray = arrangeByValue(length, width, height)
let longest = arrangedArray[0]
let middle = arrangedArray[1]
let shortest = arrangedArray[2]
然后,我找到了公差:
let widthTolerance
if (middle <= 4) {
widthTolerance = middle * 0.5
}
if (middle > 4) {
widthTolerance = 2
}
let lengthTolerance
if (length <= 4) {
lengthTolerance = length * 0.5
}
if (length > 4) {
lengthTolerance = 2
}
然后,我将这些方程式转换成了代码:
let paperLength = longest + 2 * shortest + 2 * lengthTolerance
let wrappingPaperSurfaceArea = paperLength * paperWidth
并返回了所需的值:
return `${paperLength} inches by ${paperWidth} inches `
瞧!
当我运行node index.jsconsole.logged时wrapThatGift(30, 100, 2)
我找到答案了!
108 inches by 66 inches
原始代码库在这里:https://github.com/Cerchie/crinkle-crinkle
我们非常欢迎大家提出改进建议或其他解决方案!(如果我以后再处理这个问题,我会创建一个 toleranceFinder 函数来简化这部分逻辑)请留言告诉我您的想法。:)
文章来源:https://dev.to/cerchie/my-family-solves-a-code-challenge-14ea

