codewars

[codewars] 問題と解答 Rock Paper Scissors Lizard Spock[kata7]

[codewars] 問題と解答 Rock Paper Scissors Lizard Spock[kata7]

codewars
codewars

皆さんこんにちは
最近codewarsというものを発見しました。普段のleetcodeと合わせてこちらもやっていこうと思います

codewars初心者の方、codewarsとは何かわからない方、やり方、始め方はこちらに詳しく書きました

コツコツcodewarsとleetcodeと合わせてやっていこうと思います

※ここに記載の自分のコードや他の方のコードは自分が勝手に設けた制限時間内で書いたもの且つ投稿日当時のものです。動く動かない関わらずタイムアウトになったらギブアップしています

  • 問題「Rock Paper Scissors Lizard Spock」
  • 自分のコード
  • 他の方のコード

問題「Rock Paper Scissors Lizard Spock」

Rock Paper Scissors Lizard Spock

DESCRIPTION:
In this kata, your task is to implement an extended version of the famous rock-paper-scissors game. The rules are as follows:

ジャンケンのような条件分岐を書けというもの

Scissors cuts Paper
Paper covers Rock
Rock crushes Lizard
Lizard poisons Spock
Spock smashes Scissors
Scissors decapitates Lizard
Lizard eats Paper
Paper disproves Spock
Spock vaporizes Rock
Rock crushes Scissors

Task:

Given two values from the above game, return the Player result as "Player 1 Won!", "Player 2 Won!", or "Draw!".

Inputs

Values will be given as one of "rock", "paper", "scissors", "lizard", "spock".

自分のコード

愚直にやる場合

function rpsls(pl1,pl2){
//Your Magnificent Code here
  switch(pl1){
      case "rock":
        switch(pl2){
            case "scissors":
            case "lizard":
              return "Player 1 Won!"
            case "spock":
            case "paper":
              return "Player 2 Won!"
            default:
              return "Draw!"
        }
        break;
      case "paper":
          switch(pl2){  
            case "rock":
            case "spock":
              return "Player 1 Won!"
            case "lizard":
            case "scissors":
              return "Player 2 Won!"
            default:
              return "Draw!"
          }
        break;
      case "scissors":
          switch(pl2){  
            case "lizard":
            case "paper":
              return "Player 1 Won!"
            case "spock":
            case "rock":
              return "Player 2 Won!"
            default:
              return "Draw!"
          }
      case "lizard":
          switch(pl2){  
            case "spock":
            case "paper":
              return "Player 1 Won!"
            case "rock":
            case "scissors":
              return "Player 2 Won!"
            default:
              return "Draw!"
          }
        break;
      case "spock":
        switch(pl2){  
            case "rock":
            case "scissors":
              return "Player 1 Won!"
            case "paper":
            case "lizard":
              return "Player 2 Won!"
            default:
              return "Draw!"
          }
          break;
      default:
        new Error("not provied")
  }
}

簡潔にやる場合

function rpsls(pl1,pl2){
//Your Magnificent Code here
  const map = {
    "rock": ["scissors", "lizard"],
    "paper": ["rock", "spock"],
    "scissors": ["lizard", "paper"],
    "lizard": ["spock", "paper"],
    "spock": ["rock", "scissors"],
  }
  if(map[pl1].includes(pl2)) return `Player 1 Won!`
  if(map[pl2].includes(pl1)) return `Player 2 Won!`
  return "Draw!"
}

他の方のコード

const M = [ [ 0, 1,-1, 1,-1], //scissors
            [-1, 0, 1,-1, 1], //paper
            [ 1,-1, 0, 1,-1], //rock
            [-1, 1,-1, 0, 1], //lizard
            [ 1,-1, 1,-1, 0]];//spock

const R = ['scissors', 'paper', 'rock', 'lizard', 'spock'];

const rpsls = (p1, p2) =>!(r = M[R.indexOf(p1)][R.indexOf(p2)]) && 'Draw!' || `Player ${r>0&&1||2} Won!`;

ではまた-