Files
freeCodeCamp's Camper Bot cc87f4455d chore(i18n,learn): processed translations (#54077)
Co-authored-by: Naomi Carrigan <nhcarrigan@gmail.com>
2024-03-25 16:31:40 +00:00

9.6 KiB
Raw Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5e44412c903586ffb414c94c Арифметичний форматор 23 462359 arithmetic-formatter

--description--

У початковій школі вчать вирішувати математичні приклади вертикально, аби було простіше. Наприклад, «235 + 52» перетворюється на:

  235
+  52
-----

Закінчіть функцію arithmetic_arranger, яка отримує список рядків з математичними прикладами та послідовно повертає їх у вертикальному вигляді. В разі потреби функція повинна приймати другий аргумент. Коли другий аргумент встановлено на True, відповіді повинні відображатися.

Наприклад

Виклик функції:

arithmetic_arranger(["32 + 698", "3801 - 2", "45 + 43", "123 + 49"])

Вихідні дані:

   32      3801      45      123
+ 698    -    2    + 43    +  49
-----    ------    ----    -----

Виклик функції:

arithmetic_arranger(["32 + 8", "1 - 3801", "9999 + 9999", "523 - 49"], True)

Вихідні дані:

  32         1      9999      523
+  8    - 3801    + 9999    -  49
----    ------    ------    -----
  40     -3800     19998      474

Правила

Функція поверне правильне перетворення, якщо надані приклади відформатовані правильно. В іншому випадку буде повернений рядок, який описує помилку, важливу для користувача.

  • Ситуації, які повернуть помилку:
    • Функції надано забагато прикладів. Ліміт становить 5 прикладів. Якщо їх більше, то повернеться 'Error: Too many problems.'
    • Функція приймає відповідні оператори: додавання та віднімання. Множення та ділення поверне помилку. Інші оператори, які не згадані тут, тестовані не будуть. Повернеться помилка "Error: Operator must be '+' or '-'."
    • Кожне число (операнд) повинне містити лише цифри. В іншому випадку функція поверне 'Error: Numbers must only contain digits.'
    • Кожен операнд (тобто число з кожної сторони оператора) може мати максимум чотири цифри по ширині. В іншому випадку рядок помилки видасть 'Error: Numbers cannot be more than four digits.'
  • Якщо користувач надав правильний формат прикладу, то перетворення буде дотримуватись таких правил:
    • Повинен бути лише один пробіл між оператором і найдовшим із двох операндів; оператор буде на тому ж рядку, що й другий операнд; обоє операндів будуть в тому порядку, як і надано (перший буде зверху, а другий буде знизу).
    • Числа повинні бути вирівняні за правим краєм.
    • Між кожним прикладом повинно бути чотири пробіли.
    • Знизу кожного прикладу повинна бути риска. Риска повинна йти по всій довжині прикладу індивідуально. (На прикладі вище видно, як це повинно виглядати.)

--hints--

arithmetic_arranger(["3801 - 2", "123 + 49"]) має повернути 3801 123\n- 2 + 49\n------ -----.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["3801 - 2", "123 + 49"]), '  3801      123\\n-    2    +  49\\n------    -----')`);
  }
})

arithmetic_arranger(["1 + 2", "1 - 9380"]) має повернути 1 1\n+ 2 - 9380\n--- ------.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["1 + 2", "1 - 9380"]), '  1         1\\n+ 2    - 9380\\n---    ------')`);
  }
})

arithmetic_arranger(["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]) має повернути 3 3801 45 123\n+ 855 - 2 + 43 + 49\n----- ------ ---- -----.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]), '    3      3801      45      123\\n+ 855    -    2    + 43    +  49\\n-----    ------    ----    -----')`);
  }
})

arithmetic_arranger(["11 + 4", "3801 - 2999", "1 + 2", "123 + 49", "1 - 9380"]) має повернути 11 3801 1 123 1\n+ 4 - 2999 + 2 + 49 - 9380\n---- ------ --- ----- ------.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["11 + 4", "3801 - 2999", "1 + 2", "123 + 49", "1 - 9380"]), '  11      3801      1      123         1\\n+  4    - 2999    + 2    +  49    - 9380\\n----    ------    ---    -----    ------')`);
  }
})

arithmetic_arranger(["44 + 815", "909 - 2", "45 + 43", "123 + 49", "888 + 40", "653 + 87"]) має повернути 'Error: Too many problems.'.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["44 + 815", "909 - 2", "45 + 43", "123 + 49", "888 + 40", "653 + 87"]), 'Error: Too many problems.')`);
  }
})

arithmetic_arranger(["3 / 855", "3801 - 2", "45 + 43", "123 + 49"]) має повернути "Error: Operator must be '+' or '-'.".

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["3 / 855", "3801 - 2", "45 + 43", "123 + 49"]), "Error: Operator must be '+' or '-'.")`);
  }
})

arithmetic_arranger(["24 + 85215", "3801 - 2", "45 + 43", "123 + 49"]) має повернути 'Error: Numbers cannot be more than four digits.'.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["24 + 85215", "3801 - 2", "45 + 43", "123 + 49"]), "Error: Numbers cannot be more than four digits.")`);
  }
})

arithmetic_arranger(["98 + 3g5", "3801 - 2", "45 + 43", "123 + 49"]) має повернути 'Error: Numbers must only contain digits.'.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["98 + 3g5", "3801 - 2", "45 + 43", "123 + 49"]), "Error: Numbers must only contain digits.")`);
  }
})

arithmetic_arranger(["3 + 855", "988 + 40"], True) має повернути 3 988\n+ 855 + 40\n----- -----\n 858 1028.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["3 + 855", "988 + 40"], True), "    3      988\\n+ 855    +  40\\n-----    -----\\n  858     1028")`);
  }
})

arithmetic_arranger(["32 - 698", "1 - 3801", "45 + 43", "123 + 49", "988 + 40"], True) має повернути 32 1 45 123 988\n- 698 - 3801 + 43 + 49 + 40\n----- ------ ---- ----- -----\n -666 -3800 88 172 1028.

({
  test: () => {
    runPython(`
from unittest import TestCase

TestCase().assertEqual(arithmetic_arranger(["32 - 698", "1 - 3801", "45 + 43", "123 + 49", "988 + 40"], True), "   32         1      45      123      988\\n- 698    - 3801    + 43    +  49    +  40\\n-----    ------    ----    -----    -----\\n -666     -3800      88      172     1028")`);
  }
})

--seed--

--seed-contents--

def arithmetic_arranger(problems, show_answers=False):

    return problems

print(f'\n{arithmetic_arranger(["32 + 698", "3801 - 2", "45 + 43", "123 + 49"])}')

--solutions--

def arithmetic_arranger(problems, result=False):

    lin1 = ""
    lin2 = ""
    lin3 = ""
    lin4 = ""

    if len(problems) > 5:
        return 'Error: Too many problems.'
    for problem in problems:
        [num1, sym, num2] = problem.split()
        sign = ['+', '-']
        if sym not in sign:
            return ("Error: Operator must be '+' or '-'.")
        if len(num1) > 4 or len(num2) > 4:
            return ("Error: Numbers cannot be more than four digits.")
        if not num1.isnumeric() or not num2.isnumeric():
            return ("Error: Numbers must only contain digits.")

        lin1 += "  " + num1 + "    " if len(num1) >= len(
            num2) else " " * (len(num2) + 2 - len(num1)) + num1 + "    "
        lin2 += sym + " " + num2 + "    " if len(num2) >= len(
            num1) else sym + " " * (len(num1) - len(num2) + 1) + num2 + "    "
        nmax = (len(num1) + 2) if len(num1) >= len(num2) else (len(num2) + 2)
        lin3 += "-" * nmax + "    "
        op = int(num1) + int(num2) if sym == "+" else int(num1) - int(num2)
        lin4 += (" " * (nmax - len(str(op)))) + str(op) + "    "

    arranged_problems = lin1.rstrip() + "\n" + lin2.rstrip(
    ) + "\n" + lin3.rstrip()
    if result:
        arranged_problems += "\n" + lin4.rstrip()

    return arranged_problems