배고픈 사람들을 위한 과학
코드 출현 2015 15일차
1 부
regex
를 사용하여 양콤보 계속하기
올해에는 몇 가지 조합 테마 퍼즐이 등장했습니다.
오늘이 내가 만나는 마지막 날도 아니라는 느낌이 듭니다.
101, 4번?
가능한 조합은 다음과 같습니다.
Ingr. 1 2 3 4
100 0 0 0
0 25 26 49
1 1 1 97
5 95 2 3
내 순진하고 무차별적인 접근 방식은 4개의 중첩 루프를 사용하여 합이 100이 되는 4개의 숫자를 포함하는 배열 목록을 작성하는 것입니다.
Set combos to an empty list
For a from 0 up to and including 100
For b from 0 up to and including 100
For c from 0 up to and including 100
For d from 0 up to and including 100
If a + b + c + d equals 100
Add [a, b, c, d] to combos
정규식을 사용하여 금액 추출
이 입력에서:
Butterscotch: capacity -1, durability -2, flavor 6, texture 3, calories 8
Cinnamon: capacity 2, durability 3, flavor -2, texture -1, calories 3
다음 목록이 필요합니다.
[-1, -2, 6, 3]
[ 2, 3, -2, -1]
간단한 정규 표현식이 필요합니다.
/-*\d+/g
-*
는 0개 이상의 대시와 일치합니다\d+
는 1개 이상의 숫자와 일치합니다JavaScript에서 문자열에서 숫자 목록으로 이동하는 것은 다음과 같습니다.
[...ingredient.matchAll(/-*\d+/g)].map(i => +i[0])
ingredient.matchAll(/-*\d+/g)
각 매치의 세부 정보로 채워진 반복 가능한 목록을 생성합니다[...]
각 목록 항목을 하나 이상의 배열로 확산.map(i => +i[0])
각 목록 항목 배열을 첫 번째 항목의 숫자 강제 값인 일치하는 하위 문자열로 변경합니다작동하는 알고리즘 애니메이션 및 작성
머리를 긁적 거리는 문제 해결 후 마침내 알아 냈습니다.
그리고 그것은 정답을 생성했습니다!
의사 코드 내 알고리즘:
For each 100-teaspoon recipe as a combination of four numbers
Accumulate a number that represents the highest one among all those encountered, starting at 0
Create a 4-element array
For each item in that array
Start with a copy of the amounts of each ingredient
Keep only the amount from each ingredient in the same position as the current iteration of this loop
Multiply the amount by the number of teaspoons in the same position
Add each item together to get a sum
Multiply each amount together, replacing any negative amounts with 0
Compare the resulting product with the current highest number
Return the highest number
내 알고리즘, 애니메이션:
자바스크립트 내 알고리즘:
100_Teaspoon_Recipes.reduce(
(highest, recipe) => Math.max(
highest,
new Array(4)
.fill(null)
.map(
(_, index) =>
ingredients
.map(el => el[index])
.map((el, index) => el * recipe[index])
.reduce((sum, num) => sum + num)
)
.reduce(
(product, num) => product *= num < 0 ? 0 : num
, 1)
), 0)
map()
에스 reduce()
ers 파트 2에서 음수 금액과
calories
를 활용하는지 여부와 방법을 확인하게 되어 기쁩니다!2 부
칼로리를 가져와!
내 알고리즘 업데이트
의사 코드 내 알고리즘:
For each 100-teaspoon recipe as a combination of four numbers
Accumulate a number that represents the highest one among all those encountered, starting at 0
Create a 5-element array
For each item in that array
Start with a copy of the amounts of each ingredient
Keep only the amount from each ingredient in the same position as the current iteration of this loop
Multiply the amount by the number of teaspoons in the same position
Add each item together to get a sum
If the last item in the array equals 500
Remove the last item, as it's not needed to calculate the score
Multiply each amount together, replacing any negative amounts with 0
Compare the resulting product - or 0, if there were not 500 calories - with the current highest number
Return the highest number
자바스크립트 내 알고리즘:
combos.reduce(
(highest, recipe) => {
let totals = new Array(5)
.fill(null)
.map(
(_, index) =>
ingredients
.map(el => el[index])
.map((el, index) => el * recipe[index])
.reduce((sum, num) => sum + num)
)
let score = 0
if (totals[4] == 500) {
score = totals.slice(0,4).reduce(
(product, num) => product *= num < 0 ? 0 : num
, 1)
}
return Math.max(highest, score)
}, 0
)
정답을 생성했습니다!
해냈어!!
map()
및 reduce()
방법 사용! 이 퍼즐은 조합 생성 및 배열 조작에 대한 더 많은 훌륭한 연습을 제공했습니다.
Reference
이 문제에 관하여(배고픈 사람들을 위한 과학), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rmion/science-for-hungry-people-1g87텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)