Daily Challenge #129 - Clay Pigeon Shooting

thepracticaldev profile image dev.to staff ・1 min read

Pete and his mate Phil are out in the countryside shooting clay pigeons with a shotgun - amazing fun. Some of the targets have something attached to create lots of smoke when hit, guaranteed by the packaging to generate 'real excitement!'

They decide to have a competition. 3 rounds, 2 shots each. Winner is the one with the most hits.

For each round you will receive the following format:

[{P1:'XX', P2:'XO'}, true]

That is an array containing an object and a boolean. Pl represents Pete, P2 represents Phil. X represents a hit and O represents a miss. If the boolean is true, any hit is worth 2. If it is false, any hit is worth 1.

Find out who won. If it's Pete, return 'Pete Wins!'. If it is Phil, return 'Phil Wins!'. If the scores are equal, return 'Draw!'.

Note that as there are three rounds, the actual input (x) will look something like this:

[[{P1:'XX', P2:'XO'}, true], [{P1:'OX', P2:'OO'}, false], [{P1:'XX', P2:'OX'}, true]]

Test Cases:

shoot([[{P1:'XX', P2:'XO'}, false], [{P1:'OX', P2:'XX'}, false], [{P1:'OO', P2:'XX'}, true]])

shoot([[{P1:'XX', P2:'XO'}, true], [{P1:'OX', P2:'OO'}, false], [{P1:'XX', P2:'OX'}, true]])

Good luck!

This challenge comes from A.Partridge on CodeWars. Thank you to CodeWars, who has licensed redistribution of this challenge under the 2-Clause BSD License!

Want to propose a challenge idea for a future post? Email yo+challenge@dev.to with your suggestions!

Posted on by:

thepracticaldev profile

dev.to staff


The hardworking team behind dev.to ❤️


Editor guide

A try using JavaScript:

const playerScore = (player) => player.split('').filter(it => it === 'O').length
const calculateScore = (data) => data.reduce((score, [{P1, P2}, double]) => score + (double ? 2 : 1) * playerScore(P1) - playerScore(P2), 0)
const printScore = s => (s === 0 ? "Draw!" : (s > 0 ? "Pete Wins!" : "Phil Wins!"))
const shoot = s => printScore(calculateScore(s))

Oh it seems I took a hit for a miss and the other way around 😉


JS one line

shoot = tc => tc.map(round => [...round[0].P1].reduce((a, b, c, d) => a + ((b === 'X')) * (round[1] + 1), 0)).reduce((a, c) => a + c, 0) > tc.map(round => [...round[0].P2].reduce((a, b, c, d) => a + ((b === 'X')) * (round[1] + 1), 0)).reduce((a, c) => a + c, 0) ? 'Pete Wins!' : (tc.map(round => [...round[0].P1].reduce((a, b, c, d) => a + ((b === 'X')) * (round[1] + 1), 0)).reduce((a, c) => a + c, 0) === tc.map(round => [...round[0].P2].reduce((a, b, c, d) => a + ((b === 'X')) * (round[1] + 1), 0)).reduce((a, c) => a + c, 0) ? 'Draw!' : ('Phil Wins!'))