🐈
IDの下一桁が有効か判断する
学習メモ。
スクラップで整理した内容を記事化。
概要
数字だけで成り立つID(例:1234567、など)の下1桁を確認して、その値が有効か無効を判定するプログラムを作成する。
ひとまず、前提条件は以下とする。
- IDは半角数字(0-9)だけで構成されている。
- 検証環境(開発環境やステージング環境)と本番環境で、有効/無効の範囲が異なる。
- ただし、環境の判断は、簡易的なもので判断できるものとする。
- 有効/無効となる数字については、かならず1つ以上、9個未満となるようにする。
- 例:「1」だけ有効、「1-5」まで有効、「0」だけ無効(1-9が有効)など。
スクラップ記事では「下一桁でアタリ/ハズレ判定
」としているので、関数名/変数名はこの内容によせて作られている。
Gleamで書いてみる
v0.21
で確認。
コマンドgleam new determine_last_digit_of_id
で、プロジェクトを作成。
ライブラリを追加
環境変数で値を与えたら変更できるようにしたいので、環境変数を読み込むライブラリを追加する。
$gleam add gleam_erlang
Resolving versions
Downloading packages
Downloaded 1 package in 1.22s
Added gleam_erlang v0.9.3
コード修正
main関数のあるファイルsrc/determine_last_digit_of_id.gleam
を以下のように修正。
gleam_erlang
の情報はこちら。
import箇所
import箇所。
import gleam/io
import gleam/bool
import gleam/int
import gleam/string
import gleam/list
import gleam/erlang/os
import gleam/result
main関数
main関数箇所。当該関数を呼び出すように修正。
また、os.get_env("winning_nums") |> result.unwrap("1,2,3,4,5")
で環境変数winning_nums
から値を読み込み、なかったらデフォルト値を返すようにしている。
pub fn main() {
io.println("[determine_last_digit_of_id!] START")
let winning_nums =
os.get_env("winning_nums")
|> result.unwrap("1,2,3,4,5")
let card_id_list = [
12300, 12301, 12302, 12303, 12304, 12305, 12306, 12307, 12308, 12309,
]
let results =
card_id_list
|> list.map(can_win(_, winning_nums))
results
io.println("[determine_last_digit_of_id!] END")
}
判定の関数
アタリ/ハズレを判定する関数。
pub fn can_win(card_id: Int, winning_nums: String) -> Bool {
let num = card_id % 10
let num_s = int.to_string(num)
let result = string.contains(does: winning_nums, contain: num_s)
let result_str = bool.to_string(result)
let msg =
string.concat([
"Can I win with this cardId [",
int.to_string(num),
"] ? : [",
result_str,
"]",
])
io.debug(msg)
result
}
動作確認
ビルドする。
$ gleam build
Compiling gleam_stdlib
Compiling gleeunit
Compiling determine_last_digit_of_id
Compiled in 8.60s
実行する。
$ gleam run
Compiling determine_last_digit_of_id
Compiled in 2.31s
Running determine_last_digit_of_id.main
[determine_last_digit_of_id!] START
<<"Can I win with this cardId [0] ? : [False]">>
<<"Can I win with this cardId [1] ? : [True]">>
<<"Can I win with this cardId [2] ? : [True]">>
<<"Can I win with this cardId [3] ? : [True]">>
<<"Can I win with this cardId [4] ? : [True]">>
<<"Can I win with this cardId [5] ? : [True]">>
<<"Can I win with this cardId [6] ? : [False]">>
<<"Can I win with this cardId [7] ? : [False]">>
<<"Can I win with this cardId [8] ? : [False]">>
<<"Can I win with this cardId [9] ? : [False]">>
[determine_last_digit_of_id!] END
動作確認(環境変数による指定)
環境変数「winning_nums
」を指定して、実行する。
winning_nums="1,2,3"
としているので、「4」と「5」がFalseとなるはず。
$winning_nums="1,2,3" gleam run
Compiling determine_last_digit_of_id
Compiled in 1.68s
Running determine_last_digit_of_id.main
[determine_last_digit_of_id!] START
<<"Can I win with this cardId [0] ? : [False]">>
<<"Can I win with this cardId [1] ? : [True]">>
<<"Can I win with this cardId [2] ? : [True]">>
<<"Can I win with this cardId [3] ? : [True]">>
<<"Can I win with this cardId [4] ? : [False]">>
<<"Can I win with this cardId [5] ? : [False]">>
<<"Can I win with this cardId [6] ? : [False]">>
<<"Can I win with this cardId [7] ? : [False]">>
<<"Can I win with this cardId [8] ? : [False]">>
<<"Can I win with this cardId [9] ? : [False]">>
[determine_last_digit_of_id!] END
「4」と「5」が「False」になった。
今度は、winning_nums="1,2,3,4,5,6,7,8"
を指定するので「0」と「9」だけ「False」になれば。
$winning_nums="1,2,3,4,5,6,7,8" gleam run
Compiling determine_last_digit_of_id
Compiled in 2.13s
Running determine_last_digit_of_id.main
[determine_last_digit_of_id!] START
<<"Can I win with this cardId [0] ? : [False]">>
<<"Can I win with this cardId [1] ? : [True]">>
<<"Can I win with this cardId [2] ? : [True]">>
<<"Can I win with this cardId [3] ? : [True]">>
<<"Can I win with this cardId [4] ? : [True]">>
<<"Can I win with this cardId [5] ? : [True]">>
<<"Can I win with this cardId [6] ? : [True]">>
<<"Can I win with this cardId [7] ? : [True]">>
<<"Can I win with this cardId [8] ? : [True]">>
<<"Can I win with this cardId [9] ? : [False]">>
[determine_last_digit_of_id!] END
「0」と「9」だけ「False」になった。
ひとまず希望は満たせたかな。
Discussion