DEV Community 👩‍💻👨‍💻

Cover image for Rock Paper Scissors
Robert Mion
Robert Mion

Posted on

Rock Paper Scissors

Advent of Code 2022 Day 2

Part 1

  1. It was bound to happen eventually
  2. Learning my ABCs and 123s
  3. Going from A to Z, so to speak
  4. My algorithm in JavaScript

It was bound to happen eventually

"Want to learn programming?" they say.
"Why not build a simple game?" they say.
"How about Rock Paper Scissors?" they say.

AoC has avoided it seven years. Until now.

How exciting!

Learning my ABCs and 123s

  • A and X and 1 for Rock
  • B and Y and 2 for Paper
  • C and Z and 3 for Scissors

Opponent's point of view:

  • A beats Z
  • C beats Y
  • B beats X

Player's point of view:

  • X beats C
  • Y beats A
  • Z beats B

And the formula for a round's score:

  • Amount above for what player chose, plus...
  • 0 for player loss
  • 3 for tie
  • 6 for player win

Going from A to Z, so to speak

I need to turn this:

A Y
B X
C Z
Enter fullscreen mode Exit fullscreen mode

Into this:

8
1
6
Enter fullscreen mode Exit fullscreen mode

In order to get 15.

Starting with the first round:

A Y
Enter fullscreen mode Exit fullscreen mode

I could use a few dictionaries to map winners and amounts:

const elf = { A: 'Z', C: 'Y', B: 'X' }
const player = { X: 'C', Y: 'A', Z: 'B' }
const score = { X: 1, Y: 2, Z: 3 }
Enter fullscreen mode Exit fullscreen mode

Three conditions:

if (player[col2] == col1) { 
  // player wins 
} else if (elf[col1] == col2) {
  // elf wins
} else {
  // 'twas a draw
}
Enter fullscreen mode Exit fullscreen mode

Would this work on the first round?

A Y
player[Y] == 'A' // true
player wins: 6
Y = 2
6 + 2 = 8
Success!
Enter fullscreen mode Exit fullscreen mode

Great! Second round?

B X
player[X] == 'C' // false
elf[B] == 'X' // true
player loses: 0
X = 1
1 + 0 = 1
Success!
Enter fullscreen mode Exit fullscreen mode

Great! Third round?

C Z
player[Z] == 'C' // false
elf[C] == 'Z' // false
draw: 3
Z = 3
3 + 3 = 6
Success!
Enter fullscreen mode Exit fullscreen mode

It seems this algorithm and data structure will help me solve Part 1!

My algorithm in JavaScript

const elf = { A: 'Z', C: 'Y', B: 'X' }
const player = { X: 'C', Y: 'A', Z: 'B' }
const score = { X: 1, Y: 2, Z: 3 }
return input
  .split('\n')
  .reduce((total, round) => {
    let [col1, col2] = round.split(' ')
    if (player[col2] == col1) { 
      return total += score[col2] + 6
    } else if (elf[col1] == col2) {
      return total += score[col2]
    } else {
      return total += score[col2] + 3
    }
  }, 0)
Enter fullscreen mode Exit fullscreen mode

Part 2

  1. Just what I need
  2. My algorithm in JavaScript

Just what I need

An expectedly clever switch of the rules!

  • X needs me to lose
  • Y needs me to draw
  • Z needs me to win

How will I decide what I play?

I'll reference example round one again:

A Y
Enter fullscreen mode Exit fullscreen mode

Y needs me to draw (pick the same thing as my opponent).

What draw's to an A? X

How might I represent that - and losing and winning - as a data structure?

{
  A: { X: 'Z', Y: 'X', Z: 'Y' },
  B: { X: 'X', Y: 'Y', Z: 'Z' },
  C: { X: 'Y', Y: 'Z', Z: 'X' },
}
Enter fullscreen mode Exit fullscreen mode

Here I've mapped the first column to the second column to the player's necessary choice.

Trying round one again:

A Y
A: Y: X
Y is a draw = 3
X = 1
3 + 1 = 4
Success!
Enter fullscreen mode Exit fullscreen mode

Trying round two:

B X
B: X: X
X is a loss = 0
X = 1
0 + 1 = 1
Success!
Enter fullscreen mode Exit fullscreen mode
C Z
C: Z: X
Z is a win = 6
X = 1
6 + 1 = 7
Success!
Enter fullscreen mode Exit fullscreen mode

It seems this algorithm and data structure will help me solve Part 2!

My algorithm in JavaScript

const move = {
  A: { X: 'Z', Y: 'X', Z: 'Y' },
  B: { X: 'X', Y: 'Y', Z: 'Z' },
  C: { X: 'Y', Y: 'Z', Z: 'X' },
}
const score = { X: 1, Y: 2, Z: 3 }
const outcome = { X: 0, Y: 3, Z: 6 }
return input
  .split('\n')
  .reduce((total, round) => {
    let [col1, col2] = round.split(' ')
    return total += score[move[col1][col2]] + outcome[col2]
  }, 0)
Enter fullscreen mode Exit fullscreen mode

I did it!!

  • I solved both parts!
  • I worked my way toward solutions by writing what I observed and thought, correcting myself along the way!
  • I was surprised that my code for Part 2 is shorter than my code for Part 1! I didn't need all the conditions!

This was my funnest time playing Rock Paper Scissors!

Top comments (0)

DEV

Thank you.

 
Thanks for visiting DEV, we’ve worked really hard to cultivate this great community and would love to have you join us. If you’d like to create an account, you can sign up here.