11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

if文なしでじゃんけん Rust編

Posted at

if文なしでじゃんけん を見て コメント にもあるようにむしろifよりmatchの方が表現力が高いのでは!?と感じたのでmatchも抜いてRustで作ってみました。
※ ちなみにタイトルは元記事に合わせただけでRustではif式とmatch式になります。

コード

main.rs
use std::collections::HashMap;

#[derive(Clone, Copy, PartialEq, Eq, Hash)]
enum RPS {
    Rock,
    Paper,
    Scissors,
}

use RPS::*;

fn main() {

    let emoji_lut = vec![
        (Rock, '✊'),
        (Paper, '🖐'),
        (Scissors, '✌'),
    ].into_iter().collect::<HashMap<RPS, char>>();

    let text_lut = vec![
        ([Rock, Paper], "あなたの負け"),
        ([Rock, Scissors], "あなたの勝ち"),
        ([Paper, Rock], "あなたの勝ち"),
        ([Paper, Scissors], "あなたの負け"),
        ([Scissors, Paper], "あなたの勝ち"),
        ([Scissors, Rock], "あなたの負け"),
    ].into_iter().collect::<HashMap<[RPS; 2], &str>>();

    let hands = &[Rock, Scissors, Paper];
    for me in hands {
        for you in hands {
            println!(
                "[{} vs {}] {}",
                emoji_lut[me],
                emoji_lut[you],
                (me == you).then(|| &"あいこ").or_else(|| text_lut.get(&[*me, *you])).unwrap()
            );
        }
    }
}

Rust Playground
Screenshot_2021-02-26 Rust Playground.png

あいこのパターンを3つ減らすために事前に精査しています。
Rustは型システムが堅実で柔軟なので、条件文なしで綺麗に書けました。

まとめ

他にも初めからじゃんけんを数値として扱ったり enum RPS を数値に変換して計算すれば、今回書いた text_lut のように網羅的にパターンを書く必要がなくなります。
ですが、今回のenumでは型が付いてくるので元記事の文字列で扱ったり、前述した方法より個人的に好きです。

知識や記述の間違いがあればご指摘いただけれると嬉しいです。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?