Ми приєдналися до LinkLine, провідної телекомунікаційної компанії, яка працює над забезпеченням надійного звʼязку для всіх. Перед командою стоїть велике завдання: користувачі надсилають номери телефонів у найрізноманітніших форматах: з дефісами, пробілами, крапками, дужками й навіть префіксами. Одні номери дійсні, а інші неможливо використати.
Наше завдання - перетворити цей хаос на лад. Ми очистимо дійсні номери й відформатуємо їх належним чином для використання в системі. Водночас ми визначимо й відфільтруємо всі недійсні записи.
Успіх роботи LinkLine залежить від нашої здатності відокремити корисне від непридатного. Чи готові ми взятися за це завдання й підтримувати безперебійний звʼязок?
Впорядкуйте номери телефонів, які вводять користувачі, щоб на них можна було надсилати SMS-повідомлення.
Північноамериканський план нумерації (NANP) - це телефонна система нумерації, яку використовують багато країн Північної Америки, як-от Сполучені Штати, Канада чи Бермудські Острови. Усі країни NANP мають спільний міжнародний код країни: 1.
Номери NANP містять десять цифр: тризначний код зони нумерації, який зазвичай називають кодом зони, а за ним іде семизначний місцевий номер. Перші три цифри місцевого номера утворюють код станції, за яким іде унікальний чотиризначний номер абонента.
Зазвичай формат записують так:
NXX NXX-XXXX
де N - будь-яка цифра від 2 до 9, а X - будь-яка цифра від 0 до 9.
Іноді перед ними також стоїть код країни (позначений як 1 або +1).
Наше завдання - впорядкувати по-різному відформатовані номери телефонів, прибравши розділові знаки та код країни, якщо він є.
Наприклад, усі ці вхідні дані
+1 (613)-995-0253613-995-02531 613 995 0253613.995.0253мають давати однаковий результат
6139950253
Примітка: оскільки ця вправа працює лише з номерами телефонів, які використовують у країнах NANP, дійсним кодом країни вважається лише 1.
Для простоти й читабельності: спробуйте використовувати функції колекцій Scala замість методів String із Java.
Памʼятаймо, що в Scala String неявно є також Seq[Char], тож їх можна викликати так само легко, як і методи String.
Кілька прикладів:
filter замість replaceAll
take, takeRight, drop, head, tail замість substring
Ще одна ідея, яку варто розглянути: перетворити String на List[Char] і потім скористатися зіставленням зі зразком з оператором ::.