Created
October 13, 2025 18:39
-
-
Save tokoroten/14181fb7d95d149b7306b1197dae2d44 to your computer and use it in GitHub Desktop.
日本語でLeetCodeみたいなやつをする
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
=== 日本語Leet変換 === | |
【短文テスト】 | |
原文: こんにちは、世界! | |
変換: こちんには 、 せかい ! | |
原文: プログラミングは楽しいです。 | |
変換: ぷぐらぐんみろは たのでいしす 。 | |
原文: 昨日の天気は晴れでした。 | |
変換: きのうの てんきは はしでれた 。 | |
原文: 私は毎日コーヒーを飲みます。 | |
変換: わしたは まいにち こーーひを のみます 。 | |
============================================================ | |
【長文テスト】 | |
============================================================ | |
--- 長文例 1 --- | |
原文: | |
人間は、言語を使ってコミュニケーションを取る能力を持っています。 | |
この能力により、複雑な概念や感情を他者と共有することができます。 | |
また、文字を発明したことで、知識を後世に伝えることも可能になりました。 | |
現代では、インターネットの普及により、世界中の人々と瞬時に情報を交換できるようになっています。 | |
変換: | |
にげんんは 、 げんごを つっかて こにしんけゅょーみを とる のりうょくを もって います 。 * この のようにくりょり 、 ふつざくな がねんいや かうょじんを たしゃと きょゆうう する ことが でまきす 。 * また 、 もじを はつめい した ことで 、 ちしきを こせいうに つえたる ことも かのうに なしまりた 。 * げんだいでは 、 いたっんねとーの ふにきゅようり 、 せいゅじかうの ひとびとと しゅんじに じうょうほを こかうん できる ように なって います 。 | |
--- 長文例 2 --- | |
原文: | |
昔々、ある山奥に一人の老人が住んでいました。 | |
老人は毎朝、山の頂上まで登り、日の出を眺めるのが日課でした。 | |
ある日、老人は山道で不思議な光を見つけました。 | |
その光に導かれて進んでいくと、美しい滝が現れ、そこには虹がかかっていました。 | |
老人は感動して、この景色を村の人々に伝えようと決心しました。 | |
変換: | |
むかし 々 、 ある やまくおに いち にんの ろじんうが すんで いました 。 * ろじうんは まいあさ 、 やまの ちうじまうょょで のぼり 、 ひのでを なめがる のが にしっでかた 。 * ある ひ 、 ろんうじは さどんうで ふぎしな ひりかを みしつまけた 。 * その ひりかに みびちか れて すんすで いくと 、 うしくつい たきが あわられ 、 そにこは にじが かかって いしまた 。 * ろうんじは かんどう して 、 この けしきを むらの ひとびとに つえうたよと けっしん ししまた 。 | |
--- 長文例 3 --- | |
原文: | |
プログラミングとは、コンピュータに対して具体的な指示を与える行為です。 | |
プログラマーは、様々なプログラミング言語を使用して、ソフトウェアやアプリケーションを開発します。 | |
デバッグは開発プロセスの重要な部分であり、エラーを見つけて修正する作業を指します。 | |
優れたプログラマーになるためには、論理的思考力と問題解決能力が必要不可欠です。 | |
変換: | |
ぷみろんらぐとぐは 、 こたゅーにしぴたんいて ぐたい てきな しじを あえたる こいでうす 。 * ぷろまーぐらは 、 さざままな ぷみぐろらんぐ げごんを しよう して 、 そとうあぇふや あーりんぷけょしを かいはつ します 。 * でっばぐは かいはつ ぷすろせの じううよゅな ぶぶあでんり 、 えーらを みつけて しうせゅい する さうょぎを さします 。 * すれぐた ぷらーぐろまに なる ためには 、 ろんり てき しこう りょくと もんだい かいけつ のりうょくが ひつよう ふかでけつす 。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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