Форум программистов, компьютерный форум, киберфорум
Другие языки программирования
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
1

Неаккуратная телефонная книга

04.05.2019, 23:46. Показов 1283. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решение есть, пост для тех кому тоже интересно решить задачу. Решения предлагаю прятать под спойлер. Язык любой по усмотрению (хотя задача "чисто перловая"). Итак, оригинал постановки задачи здесь.
Входные данные:
Кликните здесь для просмотра всего текста
Код
"/+1-541-754-3010 156 Alphand_St. <J Steeve>
133, Green, Rd. <E Kustur> NY-56423 ;+1-541-914-3010;
+1-541-984-3012 <P Reed> /PO Box 530; Pollocksville, NC-28573
:+1-321-512-2222 <Paul Dive> Sequoia Alley PQ-67209
+1-741-984-3090 <Peter Reedgrave> _Chicago
:+1-921-333-2222 <Anna Stevens> Haramburu_Street AA-67209
+1-111-544-8973 <Peter Pan> LA
+1-921-512-2222 <Wilfrid Stevens> Wild Street AA-67209
<Peter Gone> LA ?+1-121-544-8974
<R Steell> Quora Street AB-47209 +1-481-512-2222!
<Arthur Clarke> San Antonio $+1-121-504-8974 TT-45120
<Ray Chandler> Teliman Pk. !+1-681-512-2222! AB-47209,
<Sophia Loren> +1-421-674-8974 Bern TP-46017
<Peter O'Brien> High Street +1-908-512-2222; CC-47209
<Anastasia> +48-421-674-8974 Via Quirinal Roma
<P Salinger> Main Street, +1-098-512-2222, Denver
<C Powel> *+19-421-674-8974 Chateau des Fosses Strasbourg F-68000
<Bernard Deltheil> +1-498-512-2222; Mount Av.  Eldorado
+1-099-500-8000 <Peter Crush> Labrador Bd.
+1-931-512-4855 <William Saurin> Bison Street CQ-23071
<P Salinge> Main Street, +1-098-512-2222, Denve
/+5-541-754-3010 156 Alphandria_Street. <Jr Part>
1333, Green, Road <F Fulgur> NW-46423 ;+6-541-914-3010!
+5-541-984-3012 <Peter Reeves> /PO Box 5300; Albertville, SC-28573
:+5-321-512-2222 <Paulo Divino> Boulder Alley ZQ-87209
+3-741-984-3090 <F Flanaghan> _Chicago Av.
:+3-921-333-2222 <Roland Scorsini> Bellevue_Street DA-67209
+8-111-544-8973 <Laurence Pantow> SA
+8-921-512-2222 <Raymond Stevenson> Joly Street EE-67209
<John Freeland> Mantow ?+2-121-544-8974
<Robert Mitch> Eleonore Street QB-87209 +2-481-512-2222?
<Arthur Paternos> San Antonio $+7-121-504-8974 TT-45121
<Ray Charles> Stevenson Pk. !+7-681-512-2222! CB-47209,
<JP Gorce> +9-421-674-8974 New-Bern TP-16017
<P McDon> Revolution Street +2-908-512-2222; PP-47209
<Elizabeth Corber> +8-421-674-8974 Via Papa Roma
<C Saborn> Main Street, +15-098-512-2222, Boulder
<Colin Marshall> *+9-421-674-8974 Edinburgh UK
<Bernard Povit> +3-498-512-2222; Hill Av.  Cameron
+12-099-500-8000 <Pete Highman> Ontario Bd.
+8-931-512-4855 <W Mount> Oxford Street CQ-23071
<Donald Drinkaw> Moon Street, +3-098-512-2222, Peterville
"

Постановка задачи: У нас есть телефонная книга, в которой записаны номер телефона, имя и адрес корешей. Порядка в записях нет. Более того, там присутсвуют различные мусорные символы, не несущие полезной информации. Известно что номер телефона имеет вид "+<код>-xxx-xxx-xxxx" где код -- это одно или двуразрядное число, х -- цыфры. Также известно что имя кореша заключено в собки: <имя_кореша>. Вся остальная полезная! информация это его адрес, но адрес у нас с подвыподвертом. Например "Alphand_St." это два раздельных слова "Alphand" и "St.", TT-45121 это тоже валидная часть адреса. Необходимо написать функцию, которая на вход берет номер телефона и формирует ответ следующего вида:
1. "Error => Not found: 5-555-555-5555" если такой номер не найден
2. "Error => Too many people: 1-098-512-2222" если таких номеров более одного
3. "Phone => 8-421-674-8974, Name => Elizabeth Corber, Address => Via Papa Roma" если такой номер один
Решение на языке rust:
Кликните здесь для просмотра всего текста
Код
fn phone(dir: &str, num: &str) -> String {
    let mut candidates: Vec<_> = dir
        .lines()
        .filter(|s| {s.contains(&format!("{}{}", '+', num))})
        .collect();

    match candidates.len() {
        0 => format!("Error => Not found: {}", num),
        1 => {
            let mut ret: String = format!("Phone => {}, ", num);
            let tmp_str: String = candidates.pop().unwrap().replace(num, "");
            let name: &str = &tmp_str[tmp_str.find('<').unwrap() + 1..tmp_str.find('>').unwrap()];
            ret.push_str(&format!("Name => {}, ", &name));
            ret.push_str(&format!(
                "Address => {}",
                tmp_str
                    .replace(name, "")
                    .chars()
                    .filter(|&ch| ch.is_alphabetic() || ch.is_digit(10) || VALID_CHARS.contains(ch))
                    .collect::<String>()
                    .split(|ch| ch == ' ' || ch == '_')
                    .filter(|s| !s.is_empty())
                    .collect::<Vec<_>>()
                    .join(" ")
            ));
            ret
        }
        _ => format!("Error => Too many people: {}", num),
    }
}


Добавлено через 6 минут
тесты для проверки:
Код
test("48-421-674-8974", "Phone => 48-421-674-8974, Name => Anastasia, Address => Via Quirinal Roma");
test("1-921-512-2222", "Phone => 1-921-512-2222, Name => Wilfrid Stevens, Address => Wild Street AA-67209");
test("1-908-512-2222", "Phone => 1-908-512-2222, Name => Peter O'Brien, Address => High Street CC-47209";
test("1-541-754-3010", "Phone => 1-541-754-3010, Name => J Steeve, Address => 156 Alphand St.");
test("1-098-512-2222", "Error => Too many people: 1-098-512-2222");
test("8-421-674-8974", "Phone => 8-421-674-8974, Name => Elizabeth Corber, Address => Via Papa Roma");
test("5-555-555-5555", "Error => Not found: 5-555-555-5555");
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2019, 23:46
Ответы с готовыми решениями:

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

Телефонная книга
Здравствуйте! Есть такое задание: по списку содержащему фамилии, имена и отчества, рабочий и...

Телефонная книга
В общем, ребят, мне надо сделать подобие телефонной книги. Для записи контактов определить...

Телефонная книга
Подскажите, пожалуйста, где поправить. На вход подается строка: 'ADD Name phone1,phone2' var cmd...

3
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
10.05.2019, 21:49 2
Haskell, используя только базовый пакет. Не вполне понял какие ещё символы кроме цифробуквенных могут быть в адресе,
но это всегда можно поправить указав их в legalChars (последняя строчка кода)
Кликните здесь для просмотра всего текста
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import Data.Char
import Text.ParserCombinators.ReadP
 
phone :: String -> String -> String
phone dir num = 
    case filter (not . null) $ map (readP_to_S delPhNum) $ lines dir of
        [] -> "Error => Not found: " ++ num
        [[(l,r)]] -> case readP_to_S extrName $ l ++ r of
                        [((a,n),b)] -> 
                            let addr = unwords $ words $ map legalC $ a ++ b
                            in concat [ "Phone => ",num, ", Name => ", n,
                                ", Address => ",addr]
                        _ -> "Error => Name not found"
        _ -> "Error => Too many people: " ++ num
  where delPhNum = manyTill get $ string  $ '+':num
        extrName = do
            l <- manyTill get (char '<')
            n <- manyTill get (char '>')
            return (l,n) 
        legalC c | isAlphaNum c || c `elem` legalChars = c
                 | otherwise = ' '
        legalChars = " .-"
1
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
16.05.2019, 00:13  [ТС] 3
Curry, круто! Haskell как всегда -- загадочный набор иероглифов, а код прочитать доступно лишь избранным Text.* -- это из Prelude или что-то свое/сторонне?
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
16.05.2019, 00:22 4
Цитата Сообщение от zeroalef Посмотреть сообщение
это из Prelude или что-то свое/сторонне?
Я же написал : "используя только базовый пакет",т.е. те модули что ставятся вместе с GHC. Ничего стороннего.
Цитата Сообщение от zeroalef Посмотреть сообщение
код прочитать доступно лишь избранным
Тем кто учебник осилил.
0
16.05.2019, 00:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2019, 00:22
Помогаю со студенческими работами здесь

Телефонная книга
import pickle import sys address_book_data = {} #создаем словарь def...

Телефонная книга
помогите найти хоть пример кода программа телефонная книга,имеет менюшку ее...

Класс Телефонная Книга
Доброго времени суток форумчане! Получил следующее задание, но столкнулся с проблемой.. 1)...

Работа с файлами. Телефонная книга
Вечер добрый. задание: А. Создать файл, содержащий сведения о телефонах абонентов. Каждая записаь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru