Pythonで時刻を英語のテキスト表現に変換するプログラムの作り方
はじめに
「8時15分」のような数値的な時刻を、英語では「quarter past eight(8時15分過ぎ)」や「half past nine(9時半)」といった独特のテキスト表現で表します。この記事では、時(hour)と分(minute)の2つの数値を入力として受け取り、それらを自然な英語の時刻表現に変換するPythonプログラムの作り方を解説します。
変換ルールの例
このプログラムが出力する時刻表現は、英語圏で一般的に使われる慣用表現に従います。具体的には以下のとおりです。
- 8:00 → 8 o'clock(8時ちょうど)
- 8:01 → one minute past eight(8時1分過ぎ)
- 8:10 → ten minutes past eight(8時10分過ぎ)
- 8:15 → quarter past eight(8時15分過ぎ)
- 8:28 → twenty-eight minutes past eight(8時28分過ぎ)
- 8:30 → half past eight(8時半)
- 8:40 → twenty minutes to nine(9時20分前)
- 8:45 → quarter to nine(9時15分前)
- 8:47 → thirteen minutes to nine(9時13分前)
たとえば、入力が h = 9、m = 42 だった場合、出力は「eighteen minutes to ten(10時18分前)」になります。
アルゴリズムの考え方
この問題は、分の値によって表現パターンが変わる点がポイントです。解決手順は以下のとおりです。
- 1〜29までの数値と「half(30分)」に対応する英語テキストを格納したリストtextを用意します(全30要素)。
- 分(m)の値に応じて、次のように文字列を組み立てます。
- m = 0 のとき:「{時} o'clock」
- m = 30 のとき:「half past {時}」
- m = 1 のとき:「one minute past {時}」
- m = 15 のとき:「quarter past {時}」
- m = 45 のとき:「quarter to {次の時}」
- m が 30 未満のとき:「{m} minutes past {時}」
- それ以外(m が 30 より大きい)とき:「{60 − m} minutes to {次の時}」
- 組み立てた文字列opを返します。
特に重要なのは、分が30を超える場合は「past(〜過ぎ)」ではなく「to(〜前)」という表現に切り替わり、その際の分数は「60 − 分」で計算するという点です。
Pythonでの実装例
それでは、実際のコードを見てみましょう。
def solve(h, m):
text = ["one", "two", "three", "four", "five", "six", "seven", "eight",
"nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "quarter",
"sixteen", "seventeen", "eighteen", "nineteen", "twenty",
"twenty-one", "twenty-two", "twenty-three", "twenty-four",
"twenty-five", "twenty-six", "twenty-seven", "twenty-eight",
"twenty-nine", "half"]
op = ""
if m == 0:
op = text[h - 1] + " o' clock"
elif m == 30:
op = text[m - 1] + " past " + text[h - 1]
elif m == 1:
op = text[m - 1] + " minute past " + text[h - 1]
elif m == 15:
op = text[m - 1] + " past " + text[h - 1]
elif m < 30:
op = text[m - 1] + " minutes past " + text[h - 1]
elif m == 45:
op = "quarter to " + text[h]
else:
op = text[(60 - m) - 1] + " minutes to " + text[h]
return op
h = 9
m = 42
print(solve(h, m))
コードのポイント
- リストtextは先頭要素(one)がインデックス0に対応するため、現在の時刻hを参照するときは「text[h - 1]」、次の時刻(h+1)を参照するときは「text[h]」を使います。
- 15分は「quarter(4分の1)」、30分は「half(2分の1)」と特別な名称で呼ぶのが英語の時刻表現の特徴です。
- 分が30より大きいケース(例:42分)では、「60 − 42 = 18」を計算し、「eighteen minutes to ten」のように次の時刻までの残り分数を表現します。
実行結果
入力:
h = 9, m = 42
出力:
eighteen minutes to ten
9時42分は10時まであと18分なので、「eighteen minutes to ten(10時18分前)」という結果が正しく得られました。条件分岐の順序やリストのインデックス操作を理解すれば、さまざまな時刻に対応できるシンプルなプログラムです。
-
Pythonでキロメートルをマイルに変換する方法|初心者向けサンプルコード付き解説
本記事では、Pythonを使って「キロメートル(km)」を「マイル(mile)」に変換するプログラムの作成方法を、初心者にもわかりやすく解説します。課題の概要今回扱う問題は次のとおりです。問題文: キロメートル単位で与えられた距離を、マイル単位に変換して出力する。変換には以下の換算式を使用します。1キロメートル = 0.621371 マイル使用する変換公式Miles = kilometer * 0.621371つまり、キロメートルの値に定数「0.621371」を掛けるだけで、マイルへの換算が可能です。それでは、実際のコードを見てみましょう。実装例kilometers = 5.5 # 換算係数:
-
Pythonで16進数の文字列を10進数に変換する方法を解説
この記事では、16進数の文字列を10進数に変換する問題の解決策について詳しく解説します。課題の概要16進数形式の文字列が与えられたとき、それを対応する10進数の値に変換することを目標とします。例えば、16進数の「F」は10進数では「15」に相当します。この問題には主に2つのアプローチがあります。力ずく(ブルートフォース)な手法:int関数を使った明示的な型変換組み込みモジュールを活用する手法:astモジュールのliteral_eval関数を使用方法1:int関数を使った変換最もシンプルで一般的な方法は、Pythonの組み込み関数であるint()を利用するものです。この関数は2つの引数を受け取り