2010年06月29日のツイート

Luaでペプシ算 Reboot

NScripterでペプシ算 - 永字八法の焼き直し。

do
	local memo = {}
	-- op = 開けた本数
	-- tp = そろった種類
	-- tpm = 食玩の種類
	math.pepsi = function(tpm, op, tp)
		tp = tp or tpm
		if op == 0 then
			if tp == 0 then return 1 end
			return 0
		end
		memo[tpm] = memo[tpm] or {}
		memo[tpm][op] = memo[tpm][op] or {}
		memo[tpm][op][tp] = memo[tpm][op][tp] or (
			math.pepsi( tpm, op-1, tp-1 ) * ( tpm - tp + 1 ) +
			math.pepsi( tpm, op-1, tp )   *         tp
		) / tpm
		return memo[tpm][op][tp]
	end
	math.pepsi_complete = function(tpm, pro)
		local op = 1
		while true do
			if math.pepsi(tpm, op) < pro then
				op = op + 1
			else
				break
			end
		end
		return op
	end
end

最初に一回だけ上記のスクリプトを実行する。math.pepsi()とmath.pepsi_complete()の二つが出来ているので、使う。多分、pepsi_complete()の方が有用?

math.pepsi()

最大三つの引き数を与える。

  1. 食玩の種類。
  2. 開けた食玩の数。
  3. そろっている食玩の数(省略した場合は、第一引数が採用される)

返り値は、引数の条件になる確率(0以上1以下の数値)

math.pepsi_complete()

二つの引数を与える。

  1. 食玩の種類
  2. 確率のハードル

返り値は、全ての食玩がそろう確率がハードル以上になる開けた食玩の数。

使い方

AKB48の何かが全部そろう確率が95%以上になるには、何枚のCDを買えばよいか。

math.pepsi_complete(48, 0.95)

Luaの考察

以前よりもいいコードが書けたような気がする。
mathの環境を汚すのは好みだろうけどいいよね別に。

Luaでペプシ算 Reboot

NScripterでペプシ算 - 永字八法の焼き直し。

do
	local memo = {}
	-- op = 開けた本数
	-- tp = そろった種類
	-- tpm = 食玩の種類
	math.pepsi = function(tpm, op, tp)
		tp = tp or tpm
		if op == 0 then
			if tp == 0 then return 1 end
			return 0
		end
		memo[tpm] = memo[tpm] or {}
		memo[tpm][op] = memo[tpm][op] or {}
		memo[tpm][op][tp] = memo[tpm][op][tp] or (
			math.pepsi( tpm, op-1, tp-1 ) * ( tpm - tp + 1 ) +
			math.pepsi( tpm, op-1, tp )   *         tp
		) / tpm
		return memo[tpm][op][tp]
	end
	math.pepsi_complete = function(tpm, pro)
		local op = 1
		while true do
			if math.pepsi(tpm, op) < pro then
				op = op + 1
			else
				break
			end
		end
		return op
	end
end

最初に一回だけ上記のスクリプトを実行する。math.pepsi()とmath.pepsi_complete()の二つが出来ているので、使う。多分、pepsi_complete()の方が有用?

math.pepsi()

最大三つの引き数を与える。

  1. 食玩の種類。
  2. 開けた食玩の数。
  3. そろっている食玩の数(省略した場合は、第一引数が採用される)

返り値は、引数の条件になる確率(0以上1以下の数値)

math.pepsi_complete()

二つの引数を与える。

  1. 食玩の種類
  2. 確率のハードル

返り値は、全ての食玩がそろう確率がハードル以上になる開けた食玩の数。

使い方

AKB48の何かが全部そろう確率が95%以上になるには、何枚のCDを買えばよいか。

math.pepsi_complete(48, 0.95)

Luaの考察

以前よりもいいコードが書けたような気がする。
mathの環境を汚すのは好みだろうけどいいよね別に。

2010年06月29日のツイート

Luaでペプシ算 Reboot

NScripterでペプシ算 - 永字八法の焼き直し。

do
	local memo = {}
	-- op = 開けた本数
	-- tp = そろった種類
	-- tpm = 食玩の種類
	math.pepsi = function(tpm, op, tp)
		tp = tp or tpm
		if op == 0 then
			if tp == 0 then return 1 end
			return 0
		end
		memo[tpm] = memo[tpm] or {}
		memo[tpm][op] = memo[tpm][op] or {}
		memo[tpm][op][tp] = memo[tpm][op][tp] or (
			math.pepsi( tpm, op-1, tp-1 ) * ( tpm - tp + 1 ) +
			math.pepsi( tpm, op-1, tp )   *         tp
		) / tpm
		return memo[tpm][op][tp]
	end
	math.pepsi_complete = function(tpm, pro)
		local op = 1
		while true do
			if math.pepsi(tpm, op) < pro then
				op = op + 1
			else
				break
			end
		end
		return op
	end
end

最初に一回だけ上記のスクリプトを実行する。math.pepsi()とmath.pepsi_complete()の二つが出来ているので、使う。多分、pepsi_complete()の方が有用?

math.pepsi()

最大三つの引き数を与える。

  1. 食玩の種類。
  2. 開けた食玩の数。
  3. そろっている食玩の数(省略した場合は、第一引数が採用される)

返り値は、引数の条件になる確率(0以上1以下の数値)

math.pepsi_complete()

二つの引数を与える。

  1. 食玩の種類
  2. 確率のハードル

返り値は、全ての食玩がそろう確率がハードル以上になる開けた食玩の数。

使い方

AKB48の何かが全部そろう確率が95%以上になるには、何枚のCDを買えばよいか。

math.pepsi_complete(48, 0.95)

Luaの考察

以前よりもいいコードが書けたような気がする。
mathの環境を汚すのは好みだろうけどいいよね別に。

2010年06月29日のツイート