モジュールの解説[作成]
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