Python
 Computer >> コンピューター >  >> プログラミング >> Python

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. 1〜29までの数値と「half(30分)」に対応する英語テキストを格納したリストtextを用意します(全30要素)。
  2. 分(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 {次の時}」
  3. 組み立てた文字列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分前)」という結果が正しく得られました。条件分岐の順序やリストのインデックス操作を理解すれば、さまざまな時刻に対応できるシンプルなプログラムです。

  1. Pythonでキロメートルをマイルに変換する方法|初心者向けサンプルコード付き解説

    本記事では、Pythonを使って「キロメートル(km)」を「マイル(mile)」に変換するプログラムの作成方法を、初心者にもわかりやすく解説します。課題の概要今回扱う問題は次のとおりです。問題文: キロメートル単位で与えられた距離を、マイル単位に変換して出力する。変換には以下の換算式を使用します。1キロメートル = 0.621371 マイル使用する変換公式Miles = kilometer * 0.621371つまり、キロメートルの値に定数「0.621371」を掛けるだけで、マイルへの換算が可能です。それでは、実際のコードを見てみましょう。実装例kilometers = 5.5 # 換算係数:

  2. Pythonで16進数の文字列を10進数に変換する方法を解説

    この記事では、16進数の文字列を10進数に変換する問題の解決策について詳しく解説します。課題の概要16進数形式の文字列が与えられたとき、それを対応する10進数の値に変換することを目標とします。例えば、16進数の「F」は10進数では「15」に相当します。この問題には主に2つのアプローチがあります。力ずく(ブルートフォース)な手法:int関数を使った明示的な型変換組み込みモジュールを活用する手法:astモジュールのliteral_eval関数を使用方法1:int関数を使った変換最もシンプルで一般的な方法は、Pythonの組み込み関数であるint()を利用するものです。この関数は2つの引数を受け取り