Рубрики
Без рубрики

Talking Clock Challenge

Посмотрите на вызов Talking Clock, созданный пользователем Reddit Fvandepitte. Tagged с помощью Python, режима орг, практики программирования.

  1. Введение
  2. Описание

    1. Входной описание
    2. Выходное описание
    3. Необязательный вызов
  3. Мое решение

    1. Функциональный тест
    2. Анализ ввода
    3. Преобразование интигров в слова

      1. Получение часовой строки
      2. Получение минутной строки
      3. Поиск периода
    4. Сделать все это вместе

Задача можно найти Здесь Анкет

Создайте программу, которая может преобразовать строки времени в текст.

Входной описание

Ввод составляет час (0-23), за которой следует толстая кишка, за которой следует минута (0-59)

00:00
01:30
12:05
14:01
20:29
21:00

Выходное описание

Программа должна выводить время в словах, используя 12 -часовой формат. (12:00 утра)

It's twelve am
It's one thirty am
It's twelve oh five pm
It's two oh one pm
It's eight twenty nine pm
It's nine pm

Необязательный вызов

Сделайте программу на самом деле говорить, используя звуковые клипы, как те, которые найдены Здесь Анкет

Так что у меня есть решение для этого, которое не включает в себя тестирование. Однако я пытался привыкнуть к разработке испытаний. Также я буду использовать метод грамотного программирования для написания программы в этой статье. Другая вещь, которую я хочу обратить внимание, это то, что я почти наверняка перевернул это, я немного ревную, когда пишу.

Функциональный тест

Перво -наперво, следующий кодовый блок – это функциональный тест для этой задачи.

def talkingclock(time):
    hour,minute = map(int, time.split(":"))
    if hour >= 12:
        period = "pm"
    else:
        period = "am"
    numnames = (
        'one','two','three',
        'four','five','six',
        'seven','eight','nine',
        'ten','eleven','twelve')

    if hour > 12:
        hour -= 12
    else:
        pass

    hour_string = numnames[hour-1]
    minute_string = ""



    onetable = ("one","two","three",
                "four", "five", "six",
                "seven","eight","nine")


    teentable = ("ten","eleven","tweleve","thirteen",
                 "fourteen", "fifteen","sixteen",
                 "seventeen","eighteen","nineteen")

    tentable = ("","ten","twenty","thirty","forty","fifty",)

    if minute in range(1,10):
        minute_string = "oh " + onetable[minute-1]
    elif minute in range(10,20):
        minute_string = teentable[minute-10]

    elif minute in range(20,60):
        ones = minute % 10
        tens = minute - ones
        if ones > 0:
            minute_string = tentable[tens//10] + " " + onetable[ones-1]
        else:
            minute_string = tentable[tens//10]


    output = "It's " + hour_string + ' '
    if minute_string == '':
        output += period
    else:
        output += minute_string + ' ' + period

    return output

testtable = [i for i in zip(si.split(),so.split('\n\t'))]

results = [["Input","Expected Output","Actual Output", "Passed"]]

for test in testtable:

    si,so = test
    to = talkingclock(si)
    results.append([si,so,to,so==to])

return results

Этот тест работает, собирая вход выборки и вывода образца, как описано в разделе Challenge, он разделяет их на соответствующие линии и сохраняет их в качестве понимания списка. Я бы здесь использовал кортежи, так как данные никогда не меняются. Однако Python создает объекты генератора, если вы замените квадратные кронштейны в скобках при определении ListComp. В этот момент я был бы так же хорошо, используя отдельную функцию Zip. В любом случае, входная строка подается в функцию TalkingClock, и выходной сигнал сравнивается с выводом теста. Это создает приведенные выше результаты, и если какие -либо из них являются ложными, мы можем посмотреть, на какую линию она происходит, и проверить этот вход отдельно. Хотя это не самое элегантное решение для тестирования, это довольно практичный тест, так как мы получаем хороший таблицу.

Анализ ввода

Вход, который дается говорящие часы, находится в формате (HH: MM) в 24 часа. Для этого мы берем строку и разделяем ее на толстую кишку, используя метод разделения строки. Это производит струны в течение часа и минуты. Затем они превращаются в INT и назначаются в час и минуту переменных соответственно.

hour,minute = map(int, time.split(":"))

Чтобы проверить наши работы анализатора, нам нужно искать три вещи.

  1. Он возвращает значение часа
  2. Возвращает минутное значение
  3. Оба часа и минуты

    DEF TESTPARSER (время): (int, time.split (“:”)) Вернуть час, минута

    th, tm (тест)

    ISINT (MAP (LAMBDA X: Тип (x), (TH, TM)))))

    Результаты = ( («Возвращение часа:», Hashour), («Возвращает минуты:», Hasmin), («Все INTS:», ISINT))

    вернуть результаты

Предполагая, что когда вы запускаете этот тест, они все прошли, мы знаем, что анализатор хороша.

Преобразование интигров в слова

Теперь, когда у нас проповедо о входе в правильную форму, нам нужно обработать его, чтобы выбрать правильные строки.

Получение часовой строки

Получение часовой строки имеет несколько требований.

  1. Часовая строка всегда будет от 1 до 12.
  2. Часовая строка будет английским именем для номеров (например,) один

    NumNames = ( ‘one’, ‘Two’, ‘three’, ‘four’, ‘five’, ‘six’, ‘семь’, ‘восемь’, ‘девять’, ‘ten’ ,’1112′)

    Если час> 12: час еще: проходить

    Hour_String [Hour-1]

    def testhourstring (час): NumNames = ( ‘one’, ‘Two’, ‘three’, ‘four’, ‘five’, ‘six’, ‘семь’, ‘восемь’, ‘девять’, ‘ten’ ,’1112′)

    name = ( ‘one’, ‘два’, ‘three’, ‘four’, ‘пять’, ‘six’, ‘семь’, ‘восемь’, ‘девять’, ‘ten’ ,’1112′)

    Zeroistwelve = (testhourstring (0)) ([TestHourString (i) [(i-1)] для i в диапазоне (1,13)])) ([TestHourString (i) [(i-1)] для i в диапазоне (1,13)]))

    Result = ( (“test”, “Moder”), («0 дает Tweleve:», Zeroistwelve), (“1-13 Учитывает правильное имя:”, OneIsonect), (“13-23 Учитывает правильное имя:”, тринадцатизонект) )

    вернуть результат

Получение минутной строки

Минутная строка немного сложнее, чем часовая строка. Фактически я разбил его на несколько частей

  1. Таблица, которая работает от 1 до 9.
  2. Таблица подростков, которая работает от 10 до 19
  3. Таблица десятков, которая составляет от 10 до 50

Для чисел, которые составляют 1-9, строка изготавливается путем извлечения количества таблицы из-за одной из них и добавления ее к фразе «OH». Поскольку английский ужасен, мне пришлось сделать подросток, потому что цифры, которые составляют 11-19, должны быть особенными и не соответствовать другим числовым стандартам. Наконец, для чисел, которые составляют от 20 до 59, число производится путем извлечения места для десятков, и если у него есть число в пространстве, общая это. Таблица TENS также включает в себя 10, чтобы упростить мою математику за счет того, чтобы сделать кортеж более длинным элементом, что, я думаю, является действительным обменом.

minute_string = ""



onetable = ("one","two","three",
            "four", "five", "six",
            "seven","eight","nine")


teentable = ("ten","eleven","tweleve","thirteen",
             "fourteen", "fifteen","sixteen",
             "seventeen","eighteen","nineteen")

tentable = ("","ten","twenty","thirty","forty","fifty",)

if minute in range(1,10):
    minute_string = "oh " + onetable[minute-1]
elif minute in range(10,20):
    minute_string = teentable[minute-10]

elif minute in range(20,60):
    ones = minute % 10
    tens = minute - ones
    if ones > 0:
        minute_string = tentable[tens//10] + " " + onetable[ones-1]
    else:
        minute_string = tentable[tens//10]






def testminstring(minute):
    minute_string = ""


    onetable = ("one","two","three",
                "four", "five", "six",
                "seven","eight","nine")


    teentable = ("ten","eleven","tweleve","thirteen",
                 "fourteen", "fifteen","sixteen",
                 "seventeen","eighteen","nineteen")

    tentable = ("","ten","twenty","thirty","forty","fifty",)

    if minute in range(1,10):
        minute_string = "oh " + onetable[minute-1]
    elif minute in range(10,20):
        minute_string = teentable[minute-10]

    elif minute in range(20,60):
        ones = minute % 10
        tens = minute - ones
        if ones > 0:
            minute_string = tentable[tens//10] + " " + onetable[ones-1]
        else:
            minute_string = tentable[tens//10]

    return minute_string



singledigit = testminstring(5) == "oh five"


teens = testminstring(15) == "fifteen"

justtens = testminstring(20) == "twenty"

tensandones = testminstring(35) == "thirty five"

doesnone = testminstring(0) == ""

results = (("test","passed"),
           ("Does single digits: ", singledigit),
           ("Does teens: ", teens),
           ("Does just tens: ", justtens),
           ("Does tens: ", tensandones),
           ("Does zero: ", doesnone)
)

return results

В этом тесте использовались некоторые твердые значения, в отличие от теста часов. Однако мне нужно было проверить некоторые конкретные условия, и я решил, что менее надежный тест будет работать здесь лучше. Как и в случае с моими часовыми тестами, вы, вероятно, могли бы протестировать все возможные допустимых входов с помощью списка Comp. Но в этом случае я не уверен, что это будет стоить усилий.

Поиск периода

Чтобы найти период, (AM или PM) – довольно простая задача. Это делается путем принятия часовой переменной и проверить, больше ли она или равна 12. Если так, то период PM, в противном случае это AM. Важно то, что эта часть должна быть запущена перед получением часовой строки, потому что переменная часа изменяется от этой операции. Это может быть смягчено путем хранения исходной ценности, однако я думаю, что это будет просто чрезмерным вопросом.

if hour >= 12:
    period = "pm"
else:
    period = "am"

def testgetperiod(hour):
    if hour >= 12:
        period = "pm"
    else:
        period = "am"
    return period


amworks = all([testgetperiod(t) == 'am' for t in range(0,12)])
pmworks = all([testgetperiod(t) == 'pm' for t in range(12,23)])

results = (("test","passed"),
           ("Am works: ",amworks),
           ("Pm works: ",pmworks),
)

return results

С такой простым, тесты действительно не нужны. Но я хочу оставаться верным таковым тестируемого козла.

Сделать все это вместе

Теперь, когда у нас есть все зависимые части, нам просто нужно соединить их вместе в правильном порядке. Главное, что я ищу здесь, это то, пуста ли минутная строка или нет. Если это так, должно быть только одно пространство между часом и периодом. В одной из моих последних попыток этой проблемы я был споткнулся на этом этапе, осторожно осторожно.

def talkingclock(time):
    hour,minute = map(int, time.split(":"))
    if hour >= 12:
        period = "pm"
    else:
        period = "am"
    numnames = (
        'one','two','three',
        'four','five','six',
        'seven','eight','nine',
        'ten','eleven','twelve')

    if hour > 12:
        hour -= 12
    else:
        pass

    hour_string = numnames[hour-1]
    minute_string = ""



    onetable = ("one","two","three",
                "four", "five", "six",
                "seven","eight","nine")


    teentable = ("ten","eleven","tweleve","thirteen",
                 "fourteen", "fifteen","sixteen",
                 "seventeen","eighteen","nineteen")

    tentable = ("","ten","twenty","thirty","forty","fifty",)

    if minute in range(1,10):
        minute_string = "oh " + onetable[minute-1]
    elif minute in range(10,20):
        minute_string = teentable[minute-10]

    elif minute in range(20,60):
        ones = minute % 10
        tens = minute - ones
        if ones > 0:
            minute_string = tentable[tens//10] + " " + onetable[ones-1]
        else:
            minute_string = tentable[tens//10]


    output = "It's " + hour_string + ' '
    if minute_string == '':
        output += period
    else:
        output += minute_string + ' ' + period

    return output

Теперь с этой версией программы выходная строка не напечатана в STDOUT. Я оставил это по нескольким причинам. Если я решу выполнить дополнительную проблему в будущем, печать непосредственно в Stdout не будет очень полезной. Во -вторых, я хотел, чтобы тесты были как можно более простыми. Если вы заметили, вышеупомянутый раздел никогда не импортируется код, это включает в себя Unittest. Unittest – это очень полезная основа для более сложных тестов, но я не понял, как использовать его для создания красивых таблиц. Я могу посмотреть на использование носа в будущем, но я еще не совсем добрался.

Оригинал: “https://dev.to/zeeter/talking-clock-challenge-17p9”