🐈

IDの下一桁が有効か判断する

2022/05/29に公開

学習メモ。
スクラップで整理した内容を記事化。

概要

数字だけで成り立つ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