[codewars] 問題と解答 Rock Paper Scissors Lizard Spock[kata7]
皆さんこんにちは
最近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!"
}
他の方のコード
- 確かに Drawは一番最初に返すべきだな
- 下のこれは面白い
https://www.codewars.com/kata/reviews/57d29cd2a56edb4187000054/groups/61d5964eaa01b700014a3e43
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!`;
ではまた-