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
使い方
pepsi命令を追加する。
pepsi %0,%1,%2
- 例
- pepsi %0,44,90
- 意味
- 44種類ある中身の見えないアイテムを、何個買えばコンプリートする確率が90%を超えるか、%0に格納する。
感想
Luaの扱える数値は、そんなに大きくない?