Mock Exam 2 - Merging and Squashing

Здравейте! Това е цялата задача:

We have the following operations defined for two-digit numbers. There are two possible ways of merging them:

  1. Merging ab and cd produces bc
  • 42 merged with 17 produces 21
  • 17 merged with 42 produces 74
  1. Squashing ab and cd produces a(b+c)d - the middle digit is the sum of b and c
  • 42 squashed with 17 produces 437
  • 39 squashed with 57 produces 347 (9 + 5 = 14, we use only the 4)

You have a sequence of N two-digit numbers. Your task is to merge and squash each pair of adjacent numbers.

Input

All input data is read from the standard input

  • On the first line, you will receive an integer N
  • On the next N lines you will receive N two-digit numbers
    • Each number will be on a separate line

Output

The output data is printed on the standard output

  • On the first output line print the merged numbers
    • There should be N - 1 of them
    • Separate them by spaces
  • On the second output line print the squashed numbers
    • There should be N - 1 of them
    • Separate them by spaces

Constraints

  • 2 <= N <= 1000
  • Numbers will consist of two non-zero digits
  • The input data will always be correct and there is no need to check it explicitly

По отношение на Merge, написах код:

но ми се струва много сложен. Моля Ви за помощ за по-просто решение. Благодаря! :slight_smile:

Здравей!

Това, което ми хрумва на мен (това не значи, че е единствения начин или даже, че е добър) е в един цикъл първо да си добавиш всичките “числа” към един списък. И после в друг цикъл да почнеш да обхождаш този списък. В този цикъл, просто вземаш втория символ от първото “число” и първия символ от второто “число” и ги “залепяш” и така ще получиш първото merge-нато число и него го добавяш към някакъв списък с merge-натите числа. След това ги събираш тези същите “числа”, но не забравяй, че ако сбора надхвърля 9 трябва по някакъв начин да вземем само втората цифра. И като вземем първия символ на първото “число”, сбора от тези двете и втория символ от второто “число” и ги слепим всичките би трябвало да получим и резултата от sqaush-ването, който можем да добавим в друг списък. И т.н. докато не ни свършат числата в списъка.

Поздрави,
Коко

Здравей,

Твоят начин е чрез итериране по цифрите на въведените числа е по-лесен и го направих. Сега се мъча да приложа итерацията със Squashing :slight_smile:

Поздрави,
Петър

Здрасти,

Прилагам примерно решение с функции и малко List Comprehension за алтернативен подход.
Коментираният код помага за генериране на 1000 рандом двуцифрени числа, несъдържащи цифрата 0, за помощ при тестване на бързина примерно.

Много ти благодаря! Аз се справих с помощта на идеята на Коко и със Squashed модула. Ще разгледам внимателно и ако имам въпроси ще те питам. :slight_smile:

Поздрави,
Петър

Здравей! Много елегантно решение с няколко реда и само един цикъл. Моето решение мина в джъдж, но е доста по-дълго, защото има два цикъла - по един за Merged и Squashed. Явно дефинирането на функции е много мощен инструмент, но не съм стигнал дотам и затова няма да задавам излишни въпроси. :)Стигнах обаче до извода, че подготовката за Alpha program exam изисква поне един месеца сериозно решаване на задачи.

Поздрави,
Петър