mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-04-12 19:00:43 -04:00
583 lines
16 KiB
Markdown
583 lines
16 KiB
Markdown
---
|
||
id: 5e444136903586ffb414c94d
|
||
title: Калькулятор часу
|
||
challengeType: 23
|
||
forumTopicId: 462360
|
||
dashedName: time-calculator
|
||
---
|
||
|
||
# --description--
|
||
|
||
Напишіть функцію під назвою `add_time`, яка приймає два обов’язкових параметри та один необов’язковий параметр:
|
||
|
||
- початковий час в 12-годинному форматі (закінчується на AM чи PM)
|
||
- проміжок часу, який позначає кількість годин та хвилин
|
||
- (необов’язково) перший день тижня, байдуже на регістр
|
||
|
||
Функція повинна додати проміжок часу до початкового часу та повернути результат.
|
||
|
||
Якщо результатом буде наступний день, то після часу має бути `(next day)`. Якщо результат буде за декілька днів, то після часу має бути `(n days later)`, де n — це кількість днів.
|
||
|
||
Якщо функції задано довільний параметр першого дня тижня, то вивід має показувати день тижня у результаті. День тижня у виводі повинен бути після часу та перед кількістю днів.
|
||
|
||
Нижче наведені приклади різних випадків, які має опрацьовувати функція. Слідкуйте за інтервалами та пунктуацією в результатах.
|
||
|
||
```py
|
||
add_time('3:00 PM', '3:10')
|
||
# Returns: 6:10 PM
|
||
|
||
add_time('11:30 AM', '2:32', 'Monday')
|
||
# Returns: 2:02 PM, Monday
|
||
|
||
add_time('11:43 AM', '00:20')
|
||
# Returns: 12:03 PM
|
||
|
||
add_time('10:10 PM', '3:30')
|
||
# Returns: 1:40 AM (next day)
|
||
|
||
add_time('11:43 PM', '24:20', 'tueSday')
|
||
# Returns: 12:03 AM, Thursday (2 days later)
|
||
|
||
add_time('6:30 PM', '205:12')
|
||
# Returns: 7:42 AM (9 days later)
|
||
```
|
||
|
||
Не імпортуйте бібліотеки Python. Припустимо, що початковий час є дійсним часом. Хвилини у проміжку часу будуть цілим числом меншим за 60, але години можуть бути будь-яким числом.
|
||
|
||
# --hints--
|
||
Виклик `add_time('3:30 PM', '2:12')` має повернути `'5:42 PM'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
import time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_same_period(self):
|
||
actual = time_calculator.add_time("3:30 PM", "2:12")
|
||
expected = "5:42 PM"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "3:30 PM", "2:12" to return "5:42 PM"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Виклик `add_time('11:55 AM', '3:12')` має повернути `'3:07 PM'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_different_period(self):
|
||
actual = time_calculator.add_time("11:55 AM", "3:12")
|
||
expected = "3:07 PM"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "11:55 AM", "3:12" to return "3:07 PM"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Очікується, що в кінці часу буде `'(next day)'`, якщо це наступний день.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_next_day(self):
|
||
actual = time_calculator.add_time("9:15 PM", "5:30")
|
||
expected = "2:45 AM (next day)"
|
||
self.assertEqual(actual, expected, 'Expected time to end with "(next day)" when it is the next day.')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Очікується, що час зміниться з `AM` на `PM` о `12:00`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_period_change_at_twelve(self):
|
||
actual = time_calculator.add_time("11:40 AM", "0:25")
|
||
expected = "12:05 PM"
|
||
self.assertEqual(actual, expected, 'Expected period to change from AM to PM at 12:00')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
|
||
Виклик `add_time('2:59 AM', '24:00')` має повернути `'2:59 AM (next day)'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_twenty_four(self):
|
||
actual = time_calculator.add_time("2:59 AM", "24:00")
|
||
expected = "2:59 AM (next day)"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "2:59 AM", "24:00" to return "2:59 AM (next day)"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Виклик `add_time('11:59 PM', '24:05')` має повернути `'12:04 AM (2 days later)'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_two_days_later(self):
|
||
actual = time_calculator.add_time("11:59 PM", "24:05")
|
||
expected = "12:04 AM (2 days later)"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "11:59 PM", "24:05" to return "12:04 AM (2 days later)"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Виклик `add_time('8:16 PM', '466:02')` має повернути `'6:18 AM (20 days later)'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_high_duration(self):
|
||
actual = time_calculator.add_time("8:16 PM", "466:02")
|
||
expected = "6:18 AM (20 days later)"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "8:16 PM", "466:02" to return "6:18 AM (20 days later)"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Очікується, що буде додано `0:00`, щоб повернути початковий час.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_no_change(self):
|
||
actual = time_calculator.add_time("5:01 AM", "0:00")
|
||
expected = "5:01 AM"
|
||
self.assertEqual(actual, expected, 'Expected adding 0:00 to return initial time.')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
|
||
Виклик `add_time('3:30 PM', '2:12', 'Monday')` має повернути `'5:42 PM, Monday'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_same_period_with_day(self):
|
||
actual = time_calculator.add_time("3:30 PM", "2:12", "Monday")
|
||
expected = "5:42 PM, Monday"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "3:30 PM", "2:12", "Monday" to return "5:42 PM, Monday"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
|
||
Виклик `add_time('2:59 AM', '24:00', 'saturDay')` має повернути `'2:59 AM, Sunday (next day)'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_twenty_four_with_day(self):
|
||
actual = time_calculator.add_time("2:59 AM", "24:00", "saturDay")
|
||
expected = "2:59 AM, Sunday (next day)"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "2:59 AM", "24:00", "saturDay" to return "2:59 AM, Sunday (next day)"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Виклик `add_time('11:59 PM', '24:05', 'Wednesday')` має повернути `'12:04 AM, Friday (2 days later)'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_two_days_later_with_day(self):
|
||
actual = time_calculator.add_time("11:59 PM", "24:05", "Wednesday")
|
||
expected = "12:04 AM, Friday (2 days later)"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "11:59 PM", "24:05", "Wednesday" to return "12:04 AM, Friday (2 days later)"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
Виклик `add_time('8:16 PM', '466:02', 'tuesday')` має повернути `'6:18 AM, Monday (20 days later)'`.
|
||
|
||
```js
|
||
({
|
||
test: () => {
|
||
pyodide.FS.writeFile('/home/pyodide/time_calculator.py', code);
|
||
pyodide.FS.writeFile('/home/pyodide/test_module.py', `
|
||
import unittest
|
||
time_calculator
|
||
from importlib import reload
|
||
|
||
reload(time_calculator)
|
||
|
||
|
||
class UnitTests(unittest.TestCase):
|
||
maxDiff = None
|
||
def test_high_duration_with_day(self):
|
||
actual = time_calculator.add_time("8:16 PM", "466:02", "tuesday")
|
||
expected = "6:18 AM, Monday (20 days later)"
|
||
self.assertEqual(actual, expected, 'Expected calling "add_time()" with "8:16 PM", "466:02", "tuesday" to return "6:18 AM, Monday (20 days later)"')
|
||
`);
|
||
const testCode = `
|
||
from unittest import main
|
||
import test_module
|
||
from importlib import reload
|
||
|
||
reload(test_module)
|
||
t = main(module='test_module', exit=False)
|
||
t.result.wasSuccessful()
|
||
`;
|
||
const out = __pyodide.runPython(testCode);
|
||
assert(out);
|
||
}
|
||
})
|
||
```
|
||
|
||
# --seed--
|
||
|
||
## --seed-contents--
|
||
|
||
```py
|
||
def add_time(start, duration):
|
||
|
||
|
||
|
||
|
||
|
||
return new_time
|
||
```
|
||
|
||
# --solutions--
|
||
|
||
```py
|
||
def add_time(start, duration, day=''):
|
||
start_arr = start[0:-3].split(':')
|
||
dur_arr = duration.split(':')
|
||
tail = ''
|
||
# converting to 24h format
|
||
if 'AM' in start:
|
||
if start_arr[0] == '12':
|
||
start_arr[0] = '00'
|
||
elif 'PM' in start:
|
||
if start_arr[0] == '12':
|
||
start_arr[0] = '12'
|
||
else:
|
||
start_arr[0] = f'{int(start_arr[0]) + 12}'
|
||
|
||
# adding minutes
|
||
sum_m = int(start_arr[1]) + int(dur_arr[1])
|
||
if sum_m > 59:
|
||
|
||
if (sum_m - 60 * (sum_m//60)) < 10:
|
||
mins = f'0{(sum_m - 60 * (sum_m//60))}'
|
||
dur_arr[0] = int(dur_arr[0]) + sum_m//60
|
||
|
||
else:
|
||
mins = sum_m - 60 * (sum_m//60)
|
||
dur_arr[0] = int(dur_arr[0]) + sum_m//60
|
||
else:
|
||
if sum_m < 10:
|
||
mins = f'0{sum_m}'
|
||
else:
|
||
mins = sum_m
|
||
|
||
#adding hours
|
||
sum_h = int(start_arr[0]) + int(dur_arr[0])
|
||
if sum_h < 24:
|
||
hours= sum_h
|
||
#time_24 = f'{hours}:{mins}'
|
||
else:
|
||
days_after = sum_h//24
|
||
if days_after == 1:
|
||
hours = sum_h - 24
|
||
tail = ' (next day)'
|
||
else:
|
||
hours = sum_h - 24 * days_after
|
||
tail = f' ({days_after} days later)'
|
||
|
||
#converting back to AM/PM
|
||
if hours == 0:
|
||
hours = 12
|
||
time = f'{hours}:{mins} AM'
|
||
final_time = f'{time}{tail}'
|
||
elif hours < 12:
|
||
time = f'{hours}:{mins} AM'
|
||
final_time = f'{time}{tail}'
|
||
else:
|
||
if hours > 12:
|
||
hours = hours - 12
|
||
time = f'{hours}:{mins} PM'
|
||
final_time = f'{time}{tail}'
|
||
|
||
#days of the week
|
||
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
|
||
if day:
|
||
day = day.capitalize()
|
||
if not tail:
|
||
final_time = f'{time}, {day}'
|
||
elif tail == ' (next day)':
|
||
index = week.index(day) + 1
|
||
if index == 7:
|
||
index = 0
|
||
week_day = f', {week[index]}'
|
||
final_time = f'{time}{week_day}{tail}'
|
||
elif tail:
|
||
index = (week.index(day) + days_after) % 7
|
||
week_day = f', {week[index]}'
|
||
final_time = f'{time}{week_day}{tail}'
|
||
|
||
|
||
print('\n')
|
||
print(final_time)
|
||
print('\n')
|
||
return final_time
|
||
|
||
```
|