Skip to content

Instantly share code, notes, and snippets.

@tokoroten
Created October 13, 2025 18:39
Show Gist options
  • Save tokoroten/14181fb7d95d149b7306b1197dae2d44 to your computer and use it in GitHub Desktop.
Save tokoroten/14181fb7d95d149b7306b1197dae2d44 to your computer and use it in GitHub Desktop.
日本語でLeetCodeみたいなやつをする
=== 日本語Leet変換 ===
【短文テスト】
原文: こんにちは、世界!
変換: こちんには 、 せかい !
原文: プログラミングは楽しいです。
変換: ぷぐらぐんみろは たのでいしす 。
原文: 昨日の天気は晴れでした。
変換: きのうの てんきは はしでれた 。
原文: 私は毎日コーヒーを飲みます。
変換: わしたは まいにち こーーひを のみます 。
============================================================
【長文テスト】
============================================================
--- 長文例 1 ---
原文:
人間は、言語を使ってコミュニケーションを取る能力を持っています。
この能力により、複雑な概念や感情を他者と共有することができます。
また、文字を発明したことで、知識を後世に伝えることも可能になりました。
現代では、インターネットの普及により、世界中の人々と瞬時に情報を交換できるようになっています。
変換:
にげんんは 、 げんごを つっかて こにしんけゅょーみを とる のりうょくを もって います 。 * この のようにくりょり 、 ふつざくな がねんいや かうょじんを たしゃと きょゆうう する ことが でまきす 。 * また 、 もじを はつめい した ことで 、 ちしきを こせいうに つえたる ことも かのうに なしまりた 。 * げんだいでは 、 いたっんねとーの ふにきゅようり 、 せいゅじかうの ひとびとと しゅんじに じうょうほを こかうん できる ように なって います 。
--- 長文例 2 ---
原文:
昔々、ある山奥に一人の老人が住んでいました。
老人は毎朝、山の頂上まで登り、日の出を眺めるのが日課でした。
ある日、老人は山道で不思議な光を見つけました。
その光に導かれて進んでいくと、美しい滝が現れ、そこには虹がかかっていました。
老人は感動して、この景色を村の人々に伝えようと決心しました。
変換:
むかし 々 、 ある やまくおに いち にんの ろじんうが すんで いました 。 * ろじうんは まいあさ 、 やまの ちうじまうょょで のぼり 、 ひのでを なめがる のが にしっでかた 。 * ある ひ 、 ろんうじは さどんうで ふぎしな ひりかを みしつまけた 。 * その ひりかに みびちか れて すんすで いくと 、 うしくつい たきが あわられ 、 そにこは にじが かかって いしまた 。 * ろうんじは かんどう して 、 この けしきを むらの ひとびとに つえうたよと けっしん ししまた 。
--- 長文例 3 ---
原文:
プログラミングとは、コンピュータに対して具体的な指示を与える行為です。
プログラマーは、様々なプログラミング言語を使用して、ソフトウェアやアプリケーションを開発します。
デバッグは開発プロセスの重要な部分であり、エラーを見つけて修正する作業を指します。
優れたプログラマーになるためには、論理的思考力と問題解決能力が必要不可欠です。
変換:
ぷみろんらぐとぐは 、 こたゅーにしぴたんいて ぐたい てきな しじを あえたる こいでうす 。 * ぷろまーぐらは 、 さざままな ぷみぐろらんぐ げごんを しよう して 、 そとうあぇふや あーりんぷけょしを かいはつ します 。 * でっばぐは かいはつ ぷすろせの じううよゅな ぶぶあでんり 、 えーらを みつけて しうせゅい する さうょぎを さします 。 * すれぐた ぷらーぐろまに なる ためには 、 ろんり てき しこう りょくと もんだい かいけつ のりうょくが ひつよう ふかでけつす 。
# -*- coding: utf-8 -*-
import random
from janome.tokenizer import Tokenizer
def scramble_word(word: str) -> str:
"""
4文字以上の単語の場合、最初と最後の文字を除いて中間の文字をランダムに入れ替える
Args:
word: ひらがなの単語
Returns:
入れ替えられた単語
"""
if len(word) < 4:
return word
# 最初と最後の文字を除いた中間部分を取得
first = word[0]
last = word[-1]
middle = list(word[1:-1])
# 中間部分をシャッフル
random.shuffle(middle)
return first + ''.join(middle) + last
def to_hiragana(text: str) -> str:
"""
カタカナをひらがなに変換
Args:
text: 入力テキスト
Returns:
ひらがなに変換されたテキスト
"""
result = []
for char in text:
code = ord(char)
# カタカナの範囲 (0x30A1-0x30F6) をひらがな (0x3041-0x3096) に変換
if 0x30A1 <= code <= 0x30F6:
result.append(chr(code - 0x60))
else:
result.append(char)
return ''.join(result)
def should_attach_to_previous(part_of_speech: str) -> bool:
"""
前の単語に結合すべきかを判定
Args:
part_of_speech: 品詞情報(カンマ区切り)
Returns:
前の単語に結合すべき場合True
"""
if not part_of_speech:
return False
# 品詞情報を分割
pos_parts = part_of_speech.split(',')
main_pos = pos_parts[0] if pos_parts else ''
# 助詞、助動詞、接尾辞は前に結合
attach_pos = ['助詞', '助動詞', '接尾辞']
return main_pos in attach_pos
def japanese_leet(text: str) -> str:
"""
日本語の文章をLeetCode風に変換
1. 形態素解析で単語に分割
2. 全てひらがなに変換
3. 適切に結合(助詞・助動詞は前に結合)
4. 4文字以上の単語の内部をランダムに入れ替え
5. 分かち書きで出力
Args:
text: 入力テキスト
Returns:
変換されたテキスト
"""
tokenizer = Tokenizer()
# 形態素解析
tokens = list(tokenizer.tokenize(text))
# まず結合処理を行う
combined_words = []
for i, token in enumerate(tokens):
surface = token.surface
reading = token.reading
part_of_speech = token.part_of_speech
# 読みがある場合は読みを使用、ない場合は表層形を使用
word = reading if reading else surface
# ひらがなに変換
word_hiragana = to_hiragana(word)
# 前の単語に結合すべきか判定
if i > 0 and should_attach_to_previous(part_of_speech):
# 前の要素と結合
combined_words[-1] += word_hiragana
else:
combined_words.append(word_hiragana)
# 結合された単語に対してシャッフルを実行
result = []
for word in combined_words:
scrambled = scramble_word(word)
result.append(scrambled)
# 分かち書きで結合
return ' '.join(result)
def main():
import sys
import io
# Windows環境でのUTF-8出力設定
if sys.platform == 'win32':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# テスト用の文章
test_texts = [
"こんにちは、世界!",
"プログラミングは楽しいです。",
"昨日の天気は晴れでした。",
"私は毎日コーヒーを飲みます。"
]
print("=== 日本語Leet変換 ===\n")
print("【短文テスト】")
for text in test_texts:
converted = japanese_leet(text)
print(f"原文: {text}")
print(f"変換: {converted}")
print()
# 長文の例
long_texts = [
"""人間は、言語を使ってコミュニケーションを取る能力を持っています。
この能力により、複雑な概念や感情を他者と共有することができます。
また、文字を発明したことで、知識を後世に伝えることも可能になりました。
現代では、インターネットの普及により、世界中の人々と瞬時に情報を交換できるようになっています。""",
"""昔々、ある山奥に一人の老人が住んでいました。
老人は毎朝、山の頂上まで登り、日の出を眺めるのが日課でした。
ある日、老人は山道で不思議な光を見つけました。
その光に導かれて進んでいくと、美しい滝が現れ、そこには虹がかかっていました。
老人は感動して、この景色を村の人々に伝えようと決心しました。""",
"""プログラミングとは、コンピュータに対して具体的な指示を与える行為です。
プログラマーは、様々なプログラミング言語を使用して、ソフトウェアやアプリケーションを開発します。
デバッグは開発プロセスの重要な部分であり、エラーを見つけて修正する作業を指します。
優れたプログラマーになるためには、論理的思考力と問題解決能力が必要不可欠です。"""
]
print("\n" + "="*60)
print("【長文テスト】")
print("="*60 + "\n")
for i, text in enumerate(long_texts, 1):
print(f"--- 長文例 {i} ---")
print(f"原文:\n{text}\n")
converted = japanese_leet(text)
print(f"変換:\n{converted}\n")
print()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment