200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
|
|
1 | |
Неаккуратная телефонная книга04.05.2019, 23:46. Показов 1283. Ответов 3
Метки нет (Все метки)
Решение есть, пост для тех кому тоже интересно решить задачу. Решения предлагаю прятать под спойлер. Язык любой по усмотрению (хотя задача "чисто перловая"). Итак, оригинал постановки задачи здесь.
Входные данные: Кликните здесь для просмотра всего текста
Код
"/+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
|
04.05.2019, 23:46 | |
Ответы с готовыми решениями:
3
Телефонная книга Телефонная книга Телефонная книга Телефонная книга |
Модератор
|
||||||
10.05.2019, 21:49 | 2 | |||||
Haskell, используя только базовый пакет. Не вполне понял какие ещё символы кроме цифробуквенных могут быть в адресе,
но это всегда можно поправить указав их в legalChars (последняя строчка кода) Кликните здесь для просмотра всего текста
1
|
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
|
|
16.05.2019, 00:13 [ТС] | 3 |
Curry, круто! Haskell как всегда -- загадочный набор иероглифов, а код прочитать доступно лишь избранным Text.* -- это из Prelude или что-то свое/сторонне?
0
|
Модератор
|
|
16.05.2019, 00:22 | 4 |
Я же написал : "используя только базовый пакет",т.е. те модули что ставятся вместе с GHC. Ничего стороннего.
Тем кто учебник осилил.
0
|
16.05.2019, 00:22 | |
16.05.2019, 00:22 | |
Помогаю со студенческими работами здесь
4
Телефонная книга Телефонная книга Класс Телефонная Книга Работа с файлами. Телефонная книга Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |