GPT 系のトークナイザはバイトペアエンコーディングを使います。1文字ずつから始め、最も多い隣どうしのペアを新しい記号へ繰り返しマージします。
wordsの各単語を文字に分割します。繰り返し現れる単語は複数回数えます。- すべての単語で、隣接する記号のペアをすべて数えます。
- 最も頻度の高いペアを選びます。同数なら、(1つ目の記号、2つ目の記号)を文字列として比較して最小のものを選びます。
- そのペアの出現を左から右へすべてマージした記号に置き換え、マージした記号を記録します。
- これを
num_merges回繰り返します。2つ以上の記号を持つ単語がなくなったら早めに終了します。
bpe_merges(words, num_merges) を実装してください。
入力
words: 学習用の単語(小文字)。
num_merges: 学習するマージの回数。
出力
マージした記号を学習した順に返してください。
制約
1 ≤ 単語数 ≤ 1,000、1 ≤ 各単語の長さ ≤ 30
0 ≤ num_merges ≤ 200
例
入力:
words = ["low", "lower", "lowest"]
num_merges = 2
期待される出力:
["lo", "low"]
解説
ペア:"l o" と "o w" がどちらも3回です。同数なので "l o" を選び("l" < "o")、"lo" になります。次に "lo w" が3回現れ、"low" になります。結果:["lo", "low"]。
入力:
words = ["aaa"]
num_merges = 3
期待される出力:
["aa", "aaa"]
解説
"aaa" にはペア "a a" が2回あります。左から右へマージすると "aa" + "a" になります。次に "aa a" が "aaa" にマージされ、単語は1つの記号だけになるので、3回目のマージは何もしません。結果:["aa", "aaa"]。
参考資料
-
例 1 未実行入力:
words = ["low", "lower", "lowest"] num_merges = 2期待される出力:["lo", "low"]あなたの出力 -
例 2 未実行入力:
words = ["aaa"] num_merges = 3期待される出力:["aa", "aaa"]あなたの出力
提出時に非公開テスト4件も実行されます。
Pythonオンラインコンパイラ&デバッガー
Pythonコードをオンラインで実行・デバッグできます。サーバーモードでブレークポイントとステップ実行を使え、インストールは不要です。
🐍 このPythonオンライン実行環境について
CodeUtility Python Executor は、ブラウザ上でPythonコードを記述・実行・テストできるツールです — セットアップやインストールは不要です。安全なサンドボックス上で動作し、 3.10 から 3.13 までの実際のPythonバージョンをサポートします。
初めてPythonを学ぶ場合でも、ちょっとしたスニペットを試すときでも、ロジックをデバッグするときでも、 このツールは高速で集中できるコーディング環境を提供します。 内蔵コンソールで自由に試し、結果をすぐに確認できます。
Pythonの練習や素早いプロトタイピングのために軽量なオンラインIDEが必要な、初心者、学生、開発者に最適です。
同じ実行環境で、複数ファイル対応エディター、分離された実行ターミナル、ランタイム別ライブラリ、永続ワークスペース、共有、リアルタイム共同作業を利用できます。
この実行環境の使い方
ランタイムを選択し、ファイルを開くか作成してコードを記述し、[実行]を選択します。出力はターミナルに表示されます。サインインしたユーザーは、ワークスペースにファイルを保存し、ライブラリをインストールして、共有を通じて共同作業できます。
- バージョンを選択して現在のファイルを編集するか、ワークスペース内の別のファイルを開きます。
- コードを実行し、求められた場合はターミナルに入力して、保存された実行履歴を確認します。
- 複数のコードスニペットが必要な作業では、ライブラリ、ワークスペースツール、共有、チャットを利用します。
💡 上のエディタで試せるPythonの基礎とサンプル
1. 変数と定数の宣言
Pythonは動的型付けなので、型を明示的に宣言する必要はありません。組み込みの定数キーワードはありませんが、慣例として定数はすべて大文字で書きます。
# 変数
x = 10
pi = 3.14
name = "Alice"
is_active = True
# 定数(慣例)
MAX_USERS = 100
APP_NAME = "CodeUtility"
# 定数も再代入は可能(強制されない)
MAX_USERS = 200 # ⚠️ 技術的には可能だが非推奨
2. 条件分岐
if、elif、else ブロックでロジックを制御します。Python 3.10以降では、match-case をswitch-caseの代替として使えます。
# 従来の if-elif-else
x = 2
if x == 1:
print("一")
elif x == 2:
print("二")
else:
print("その他")
別案: match-case(Python 3.10+)
# Python 3.10+ が必要
x = 2
match x:
case 1:
print("一")
case 2:
print("二")
case _:
print("その他")
3. ループ
for はシーケンスの反復に使い、while は条件が真の間実行されます。
for i in range(3):
print(i)
count = 3
while count > 0:
print(count)
count -= 1
4. リスト
リストは順序を持つ可変のコレクションです。インデックスで要素にアクセスできます。
fruits = ["りんご", "バナナ"]
print(fruits[0])
print(len(fruits))
5. リストの操作
リストの追加・削除・スライス・反転ができます。内包表記を使うと簡潔に反復処理を書けます。
fruits.append("さくらんぼ")
fruits.insert(1, "キウイ")
fruits.remove("バナナ")
fruits.pop()
print(fruits[1:3])
print(fruits[::-1])
squares = [x*x for x in range(5)]
6. コンソール入出力
input() でユーザーから読み取り、print() で出力を表示します。
\n(改行文字)を使うか、print() を複数回呼び出すことで複数行を表示できます。
# 入力を読む
name = input("あなたの名前を入力してください: ")
print("こんにちは", name)
# 複数行を出力
print("1行目\n2行目\n3行目")
# あるいは print を複数回使う
print("A行")
print("B行")
print("C行")
7. 関数
関数はコードを整理し、再利用を可能にします。引数や戻り値を使いましょう。
def greet(name):
return "こんにちは " + name
print(greet("Alice"))
8. 辞書
キーと値のペアを保持します。キーは一意で、キーを使って値にアクセスします。
person = {"name": "Bob", "age": 25}
print(person["name"])
print(person.get("email", "未設定"))
9. 例外処理
try と except でエラーを捕捉し、適切に処理します。
try:
x = 1 / 0
except ZeroDivisionError:
print("0で割ることはできません")
10. ファイル入出力
open() を使ってファイルの読み書きを行います。
with open("data.txt", "w") as f:
f.write("こんにちは、世界")
with open("data.txt", "r") as f:
print(f.read())
11. 文字列操作
Pythonの文字列には、strip()、replace()、split() など強力なメソッドがあります。
text = " Hello World "
print(text.strip())
print(text.upper())
print(text.replace("Hello", "Hi"))
print(text.split())
12. クラスとオブジェクト
クラスで再利用可能な設計図を定義します。オブジェクトの初期化には __init__ を使います。
class Person:
def __init__(self, name):
self.name = name
def greet(self):
return "こんにちは、私は " + self.name
p = Person("Alice")
print(p.greet())
🐞 Pythonコードをオンラインでデバッグする方法
オンラインPythonデバッガーなら、PythonやIDEをインストールせずにロジックエラーを調査できます。サーバーモードでPython 3.10〜3.13を使用します。
- ランタイムメニューからサーバー版Pythonを選択します。
- 行番号の横をクリックしてブレークポイントを設定します。
- Debugを選択し、最初に一致するブレークポイントまで実行します。
- 現在行と変数を確認し、Continue、Step Over、Step Into、Step Outを使います。
- 終了するときはStopを選択します。
再現可能な小さなコードから始め、値が想定外になる直前にブレークポイントを置きましょう。サーバーモードではworkspaceのファイルやインストール済みライブラリも使えます。