第17回ウディコン全作品レビュー - STELLA FORMULA

54. STELLA FORMULA

ジャンル 作者
計算パズル なべのひと&北街かな
プレイ時間 プレイVer クリア状況
30分 0.92 5連最小ステップ

良かった点

  • 頭の体操にちょうど良いゲーム性をしています

気になった点

  • 解けない問題が出題される可能性があるようです

レビュー

メイクnパズル

STELLA FORMULAは、数字と演算子を使って目的の数値を作り出すパズルゲームです。

プレイヤーは提示された数字を作るべく、与えられた5つの数字と四則演算を上手く組み合わせていくことになります。
演算はかっこでくくることもできるため、その並び順序も含めて構成できる式のパターンは膨大になります。頭の中で総当たりで解くことはほぼ不可能と言えるでしょう。提示された数字を上手く分解し、与えられた数字の組み合わせを上手く考えて効率良く解いていくことが重要になります。

また、問題生成は完全にランダムで行われているようであるため、難問や解答不能な問題に出会うこともあります。どうしても解けない時は、問題のスキップを選択することも必要になってくるでしょう。あまり考え過ぎず、リラックスして取り組むことをお勧めします。
一期一会の問題を楽しみ、軽く頭の体操をしていきましょう。

感想

与えられた数字をもとに四則演算子を利用して導出するという、割と良くある数字パズルを良い感じのUIで上手く包んだゲームです。
ゲーム性自体はメイク10パズルとしては一般に膾炙してそうな汎的なものですが、綺麗なUIでさっくりと遊べるようにパッケージングされているという点が良いです。ちょっとした頭の体操になる。
また、対象の数字が5つになって組み合わせが増えている点、10ではなく合計値もランダムな点で発展性も演出しています。

特に、しっかりとかっこによる演算が用意されているのが程よく複雑性に寄与していて、ある程度考えないと答えが出ない基点となっているように感じました。
個人的な解き方としては、答えを出しやすいところから逆算する方が早い気がしており、特にパターンが少ない時は割と有効な戦略になります。ただ、ベタ問が飛んでくることも間々あるので、ひとまず型にはめてざっくり考えて詰めた後にダメだった時の次善策として使うほうが良いかもしれません。この辺は割と直感的。

なお、最初にプレイした時は一つ解無しっぽいのがあったのでスキップしてしまいました。1, 2, 2, 3, 3 から43を生成する組み合わせは果たしてあるのだろうか。多分無さそうです。
興味があったので、雑にrubyで解答を出すコードを作ってみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def calc_rpn(expr)
stack = []

expr.split(' ').each do |token|
case token
when '+', '-', '*', '/'
b = stack.pop
a = stack.pop
result = case token
when '+' then a + b
when '-' then a - b
when '*' then a + b
when '/' then a / b
end
stack.push(result)
else
stack.push(token.to_f)
end
end
stack.first
end

def traverse(result, expr, array, index, opes_num, nums_num)
if index == -1 && nums_num - opes_num == 1 then
if (calc_rpn(expr.join(" ")) - result).abs <= 0.00001 then
p expr
return true
end
return false
end

"n+-*/".each_char do | op |
if op == 'n' then
if index >= 0 then
expr.push(array[index])
if traverse(result, expr, array, index - 1, opes_num, nums_num + 1) then
return true
end
expr.pop()
end
else
if nums_num - opes_num >= 2 then
expr.push(op)
if traverse(result, expr, array, index, opes_num + 1, nums_num) then
return true
end
expr.pop()
end
end
end
return false
end


input = ARGV.map(&:to_i)
result = input.pop

input.permutation do | array |
traverse(result, [], array, array.length - 1, 0, 0)
end

計算効率とかゼロ除算を考えてないんですが、恐らく全網羅しているはずです。逆ポで全列挙して、回答を許容付き誤差で比較して探す形式となっています。これで1, 2, 2, 3, 3で43になる結果を探したところありませんでした。バグってなければ解は存在しないはずです、多分。直感的にも43は素数なので作りにくそうですね。
閑話休題。解けない問題があるのはやや気になりはしますが、かなり効率良く作っても計算負荷はそれなりにありそうで、ウディタ上でソルバを実装するのが困難に感じるので仕方がないだろうなとも感じています。事前に全パターン計算して、テキストファイルか何かに吐き出しておくくらいしか思いつきません。

なお、フォーカス外に出すと時間が経過しないのでズルできますし、そもそもゲーム開始時に最初にクリックしてから計測開始なので、頭で全部計算してからやれば実質時間は使いません。筆者は後者の方法で取り組み、実測値10分、スコア1分30で全問クリアをしています。
個人的にはこのくらいの緩さで遊べるのは良かったです。慣れないプレイヤーは適当に触って数字を探し、慣れているプレイヤーは頭の中で全部完結させてから早業で解くプレイングができます。

ともかく、軽く頭の体操をするにはちょうどいい作品でした。どうしても解けなさそうであれば、スキップしましょう。