2일 차: 수학은 없을 것이라고 들었습니다(1부).
9983 단어 goadventofcodecodenewbietdd
문제를 확인하는 것부터 시작하겠습니다.
--- Day 2: I Was Told There Would Be No Math ---
The elves are running low on wrapping paper, and so they need
to submit an order for more. They have a list of the dimensions
(length l, width w, and height h) of each present, and only
want to order exactly as much as they need.
Fortunately, every present is a box
(a perfect right rectangular prism), which makes calculating
the required wrapping paper for each gift a little easier:
find the surface area of the box,
which is 2*l*w + 2*w*h + 2*h*l. The elves also need a little
extra paper for each present: the area of the smallest side.
For example:
A present with dimensions 2x3x4 requires 2*6 + 2*12 + 2*8 =
52 square feet of wrapping paper plus 6 square feet of slack,
for a total of 58 square feet.
A present with dimensions 1x1x10 requires 2*1 + 2*10 + 2*10 =
42 square feet of wrapping paper plus 1 square foot of slack,
for a total of 43 square feet.
All numbers in the elves' list are in feet. How many total
square feet of wrapping paper should they order?
그리고 우리 입력에서 빠른 정점을 찍겠습니다(길이 때문에 꽤 많이 줄였습니다. 1000줄이 있습니다).
3x11x24
13x5x19
1x9x27
24x8x21
6x8x17
19x18x22
10x9x12
12x2x5
...
이것이 이 과제의 1부입니다. 다음으로 문제를 더 작고 관리하기 쉬운 덩어리로 나누는 작업으로 넘어갑니다.
먼저
input.txt
에서 입력을 로드하고 전체 공개합니다. 이 작은 기능은 각 솔루션의 시작 부분에서 사용되지만 이 문서 이후에는 더 이상 포함하지 않겠습니다.func LoadInput(path string) string {
input, err := os.ReadFile(path)
if err != nil {
log.Fatal(err)
}
return string(input)
}
이제 입력을 문자열로 얻었으므로 각 현재가 슬라이스로 표시되도록 분할해야 합니다.
이를 위한 테스트는 다음과 같습니다.
func TestMakePresentSlice(t *testing.T) {
assert.Equal(t, []string{
"3x11x24",
"13x5x19",
"1x9x27",
"24x8x21",
}, MakePresentSlice("3x11x24\n13x5x19\n1x9x27\n24x8x21"))
}
실행
go test
은 이제 계속해서 수정해야 하는 실패한 테스트를 생성합니다.func MakePresentSlice(str string) []string {
return strings.Split(str, "\n")
}
이제 테스트가 통과되었으므로 다음 단계는 슬라이스의 각 요소에 대한 포장지의 양을 계산할 수 있는 함수에 대한 테스트를 작성하는 것입니다.
이 프로세스의 일부로 값을 문자열에서 int로 변환할 것입니다.
우리의 테스트는 다음과 같을 것입니다.
func TestCalculatePresentArea(t *testing.T) {
assert.Equal(t, 58, CalculatePresentArea("2x3x4"))
assert.Equal(t, 43, CalculatePresentArea("1x1x10"))
}
테스트 케이스를 작성할 때 지침에서 가능한 한 많은 예제를 사용하려고 합니다.
다음은 선물당 필요한 포장지 피트를 계산하는 방법입니다.
func CalculatePresentArea(str string) int {
s := strings.Split(str, "x")
var sides []int
for _, sideString := range s {
side, _ := strconv.Atoi(sideString)
sides = append(sides, side)
}
sort.Ints(sides)
return sides[0]*sides[1]*3 + sides[0]*sides[2]*2 + sides[1]*sides[2]*2
}
이것은 우리가 이 함수에 전달하는 각 선물이 문자열 값에서 int로 각 면을 변환한 다음 슬라이스에 모든 면을 저장하기 때문에 작동합니다.
그런 다음 슬라이스를 오름차순으로 정렬합니다. 이것이 첫 번째 계산
sides[0]*sides[1]*3
에 3을 곱한 이유입니다. 가장 작은 면의 영역인 필요한 추가 포장지를 추가하기 때문입니다.테스트가 통과되었으므로 슬라이스의 각 요소를 올바르게 계산할 수 있습니다. 남은 작업은 문자열 슬라이스(이미 함수를 작성함)를 반복하고 모든 결과를 합산하는 것입니다.
func main() {
input := LoadInput("./input.txt")
presents := MakePresentSlice(input)
total := 0
for _, present := range presents {
total += CalculatePresentArea(present)
}
fmt.Println(total)
}
내 입력에 대한 결과는
1588178
이며 이는 정답이며 TDD의 또 다른 작은 승리입니다.
Reference
이 문제에 관하여(2일 차: 수학은 없을 것이라고 들었습니다(1부).), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/damiensedgwick/day-2-i-was-told-there-would-be-no-math-part-1-1j88텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)