Go 言語で「基礎プログラミング演習 I 〜100 本ノック上級編」を解いてみる-No.84「トランプを切る」

はじめに

「基礎プログラミング演習 I 〜100 本ノック上級編」を解いてみます。

取り扱う問題は以下のサイトを引用させていただきました。

検証環境

$ uname -moi
x86_64 unknown GNU/Linux

$ head -n 2 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"

$ go version | head -n 1
go version go1.16.3 linux/amd64

問題

No. 84 トランプを切る

トランプをランダムに順番を変えて表示するプログラムを作成せよ。トランプは 4 つのスート(マーク)、1〜13 までの数字の 52 枚である。トランプを表現する配列を作り、適当に順序を入れ替えていけばよい。適当に順序を入れ替えるには、例えば 2 つの入れ替えるカードを乱数を使って選び、それらを入れ替える操作を何回も繰り返せばよい。

# 【実行例、表示の方法はこの通りでなくてもよい】
$ ./knock84
ダイヤ5
クローバーA
クローバー7
ダイヤ8
クローバー10
ダイヤK
ダイヤ4
スペード9
ハートQ
(以下略)

回答

knock84.go

package main

import (
    "fmt"
    "math/rand"
    "strconv"
)

func main() {
    marks := []string{
        "ダイヤ",
        "ハート",
        "スペード",
        "クローバー",
    }

    numbers := make([]int, 13)
    for i := range numbers {
        numbers[i] = i + 1
    }

    cards := make([]string, 0, 52)
    for _, mark := range marks {
        for _, number := range numbers {
            cards = append(cards, mark+strconv.Itoa(number))
        }
    }

    rand.Shuffle(len(cards), func(i, j int) {
        cards[i], cards[j] = cards[j], cards[i]
    })

    for _, c := range cards {
        fmt.Println(c)
    }
}

実行

$ go run knock84.go
スペード13
スペード1
クローバー5
クローバー13
ハート1
ハート10
クローバー8
スペード12
ハート6
スペード9
ハート12
ダイヤ3
スペード3
ハート3
クローバー2
ダイヤ10
ダイヤ2
スペード4
クローバー3
クローバー7
ダイヤ1
スペード5
ハート4
クローバー12
ダイヤ6
ハート7
スペード2
クローバー1
ハート13
スペード11
ダイヤ12
ダイヤ7
クローバー6
ハート11
スペード10
ダイヤ11
ハート5
クローバー4
ハート2
ダイヤ9
クローバー11
クローバー10
ダイヤ13
ダイヤ5
ダイヤ8
ダイヤ4
スペード7
ハート8
ハート9
スペード8
クローバー9
スペード6

# 件数を確認
$ go run knock84.go | wc -l
52

# 並べ替えてみる
$ go run knock84.go | sort
クローバー1
クローバー10
クローバー11
クローバー12
クローバー13
クローバー2
クローバー3
クローバー4
クローバー5
クローバー6
クローバー7
クローバー8
クローバー9
スペード1
スペード10
スペード11
スペード12
スペード13
スペード2
スペード3
スペード4
スペード5
スペード6
スペード7
スペード8
スペード9
ダイヤ1
ダイヤ10
ダイヤ11
ダイヤ12
ダイヤ13
ダイヤ2
ダイヤ3
ダイヤ4
ダイヤ5
ダイヤ6
ダイヤ7
ダイヤ8
ダイヤ9
ハート1
ハート10
ハート11
ハート12
ハート13
ハート2
ハート3
ハート4
ハート5
ハート6
ハート7
ハート8
ハート9

ひとこと

変数をいくつか定義しましたが、変数を極力減らしても良かったかなと思いました。

Posted by genzouw