モジュール:学校コード検査/sandbox
表示
これはモジュール:学校コード検査 (差分)のモジュール・サンドボックスページです。 対応するテストケース・サブページ (実行) もご確認ください。 |
モジュールの解説[作成]
require('strict')
local p = {}
--[[
-- 学校コードの検査を行う
-- 文字列idが学校コードとして有効であればtrueを、
-- そうでなければfalseを返す
]]--
function p.check(id, edition)
id = id:match('^%s*([A-H][12][0-4]%d[123][1-9]%d%d%d%d%d%d%d)%s*$')
if not id then
return false -- 異常なフォーマット
end
local sc_type, sc_pref = id:sub(1, 2), id:sub(3, 4) -- 学校種と都道府県番号
if sc_type == 'B2' or sc_type == 'E2' or sc_type == 'G2' or
sc_pref == '00' or sc_pref == '48' or sc_pref == '49' then
return false -- 存在しない学校種もしくは都道府県番号が指定された
end
-- 0以上19以下の整数につき各桁の和を求める関数オブジェクトをsumDigitsに代入
local sumDigits = (function(ed)
local boundary = (ed == '202305') and 10 or 9
-- edが'202305'である場合に限り、入力が10であれば10を返すようにする
return function(num)
return (num > boundary) and (1 + num % 10) or num
end
end)(edition)
-- 最下桁の検査数字を単純に整数に変換し、
-- 最上桁のアルファベットをルールに従って変換し2を乗じた上で加算する
local temp = tonumber(id:sub(13)) + sumDigits((id:byte(1) - 0x40) * 2)
-- 残りの桁をルールに従って変換した上で加算していく
for i = 2, 12 do
temp = temp + sumDigits(tonumber(id:sub(i, i)) * (1 + i % 2))
end
return temp % 10 == 0 -- 加算した結果が10で割り切れれば検査に適合
end
--[[
-- #invoke:で呼び出すための関数
]]--
function p.main(frame)
return p.check(frame.args[1] or '', frame.args.edition) and '' or 'failed'
end
return p