Pythonで文字列コマンドのゴールパーサー解釈を求めるプログラム
ゴールパーサー(Goal Parser)とは
ゴールパーサーは、与えられた文字列コマンドを特定のルールに従って解釈するプログラムです。コマンドは以下の要素で構成されます。
- アルファベット「G」
- 開き括弧と閉じ括弧のペア「()」
- 「(al)」(これらが任意の順序で並びます)
ゴールパーサーは、これらを次のように解釈します。
- 「G」→ 文字列「G」
- 「()」→ 文字列「o」
- 「(al)」→ 文字列「al」
そして、解釈された文字列は元の出現順序のまま連結されます。つまり、文字列コマンドが与えられたとき、そのゴールパーサーによる解釈結果を求めるのがこの問題の目的です。
例えば、入力が command = "G()()()(al)(al)" の場合、出力は「Goooalal」となります。
解決のための手順
この問題を解くには、以下の手順に従います。
- 空の文字列 s を用意します。
- i を 0 から command の長さ - 1 まで繰り返します。
- command[i] が「(」でも「)」でもない場合、s に command[i] を連結します。
- command[i] が「(」であり、かつ command[i+1] が「)」であり、i+1 < len(command) を満たす場合、s に「o」を連結します。
- command[i] が「(」の場合は、次の反復へ進みます。
- command[i] が「)」の場合も、次の反復へ進みます。
- 最後に s を返します。
Pythonでの実装例
理解を深めるために、以下の実装を見てみましょう。
def solve(command):
s = ""
for i in range(len(command)):
if command[i] != "(" and command[i] != ")":
s += command[i]
if command[i] == "(" and i + 1 < len(command) and command[i+1] == ")":
s += "o"
if command[i] == "(":
continue
if command[i] == ")":
continue
return s
command = "G()()()(al)(al)"
print(solve(command))
入力
"G()()()(al)(al)"
出力
Goooalal
別のアプローチ:replaceメソッドを活用する
実は、Pythonの文字列置換メソッド replace() を使えば、より簡潔に記述することもできます。
def solve(command):
return command.replace("()", "o").replace("(al)", "al")
この方法では、パターン「()」と「(al)」が互いに重なり合わないため、置換の順序に関係なく正しい結果が得られます。計算量はいずれの方法も O(n) で、文字列の長さに対して線形時間で処理できます。
-
Pythonでポリゴンの面積を求める方法:靴ひも公式を使った実装
はじめに2次元平面上に、単純な多角形(ポリゴン)の頂点を時計回りまたは反時計回りの順に並べた座標リストが与えられたとします。このとき、その多角形の面積を計算するのが本記事の目的です。例えば、入力が points = [(0, 0), (0, 5), (3, 5), (3, 0)] のような場合、これは幅3・高さ5の長方形を表しているため、出力は 15.0 となります。解法の考え方:靴ひも公式(Shoelace Formula)この問題は、有名な靴ひも公式(測量士の公式)を使うことで効率的に解けます。隣り合う2頂点ごとに外積 x1*y2 - y1*x2 を計算し、それらをすべて足し合わせて絶対値
-
Pythonで多角形の外周(周囲長)を求めるプログラム
問題の概要2次元平面上にある単純な多角形(自己交差しないポリゴン)の頂点が、順序付きの点のリストとして与えられているとします。このとき、その多角形の外周(周囲長)を求めることが目的です。例として、入力が points = [(0, 0), (0,5), (3, 5), (3,0)] の場合を考えてみましょう。このときの出力は 16 になります。これは、図からも分かるように、長さ3の辺が2本、長さ5の辺が2本存在するためです。したがって、2×5 + 2×3 = 16 となります。アルゴリズムの考え方この問題は、「隣接する2つの頂点間の距離をすべて計算して合計する」というシンプルなアプローチで解く