NScripterでペプシ算

ペプシ算ファイナル - 永字八法の続き。
やってみたんだけど、数が大きくなると簡単に桁溢れして駄目になることがわかった。
なので、飽くまで参考として。

pepsi.lua

NSExec("luasub pepsi")
local pepsis = {}

function pepsi( k1, n, k2 )
	local kind_max = math.floor(k1) -- 種類
	if kind_max < 1 then kind_max = 1 end
	local num = math.floor(n) -- いくつ開封したか
	if num < 1 then num = 1 end
	local kind_now = math.floor(k2) -- 現在そろっている種類数
	if kind_now < 1 then kind_now = 1 end
	
	if num == 1 then -- 1個だけ開封した場合
		if kind_now == 1 then return 1 else return 0 end
	end
	
	if pepsis[kind_max] == nil then pepsis[kind_max] = {} end -- 遅延初期化
	local pepsi_table = pepsis[kind_max]
	if pepsi_table[num] == nil then pepsi_table[num] = {} end -- 遅延初期化
	local pepsi_line = pepsi_table[num]
	if pepsi_line[kind_now] == nil then
		pepsi_line[kind_now] = pepsi( kind_max, num-1, kind_now ) * kind_now
		if kind_now > 1 then
			pepsi_line[kind_now] = pepsi_line[kind_now] + pepsi( kind_max, num-1, kind_now-1 ) * ( kind_max - (kind_now-1))
		end
	end
	return pepsi_line[kind_now]
end

function NSCOM_pepsi()
	local res = NSPopIntRef()
	NSPopComma()
	local kind = NSPopInt()
	NSPopComma()
	local target = NSPopInt()
	local answer = 1
	local mother = 1
	while ( pepsi( kind, answer, kind ) * 100 / mother < target ) do
		answer = answer + 1
		mother = mother * kind
	end
	NSSetIntValue(res, answer)
end

その他

system.lua内で、

NS_dofile("pepsi.lua")

と記述する。

使い方

pepsi命令を追加する。

pepsi %0,%1,%2
pepsi %0,44,90
意味
44種類ある中身の見えないアイテムを、何個買えばコンプリートする確率が90%を超えるか、%0に格納する。

感想

Luaの扱える数値は、そんなに大きくない?