Вы знаете, как получить сообщение голосовой почты, и соединение этого человека было не очень хорошим, и вы пытаетесь выяснить, как перезвонить им, но вы не уверены, что это «5» или «8». сказал?
Вот этот вызов.
Хорошая новость заключается в том, что звонящий дважды считывает их номер, но он искажается в обоих местах.
Ваша программа должна принимать следующие данные:
5551231234 / 5551231234
Где первые десять цифр - это первый раз, когда телефонный номер произносится в голосовой почте, а второй набор - во второй раз, когда он произносится. Только ... это будет выглядеть примерно так:
555?ABC1_36? / 55?522_1?234
- Цифра, за которой следует знак вопроса, означает, что эта цифра лучше всего подходит (например, «5?» Означает «вероятно, 5, сравните с повтором»).
- Подчеркивание указывает на известную отсутствующую цифру, что-то слишком размытое от статики, чтобы вообще его можно было расшифровать.
- Буквы - это просто буквы. Обращайтесь с ними как с соответствующими цифрами
- ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
- Все примеры ввода используют заглавные буквы (вы можете спокойно пропустить вызов ToUpper ())
- Если ваш язык работает лучше в нижнем регистре, вы можете свободно использовать строчные буквы для ввода и пропустить вызов ToLower (). Просто отметьте это в своем ответе.
Вы можете дополнительно принять следующие суждения:
5? / _ -> 5 //5 is the best guess we have, use it
5? / 5? -> 5 //uncertain, but matching
5? / 4? -> ? //conflict
5 / 4 -> ? //conflict
5? / 4 -> 4 //solid information overrides possible value
5 / 4? -> 5 //solid information overrides possible value
_ / _ -> ? //no information available
Кроме того, вы можете предположить, что все входные данные будут содержать десятизначные номера телефонов, не включая вопросительные знаки. Входные данные, не 1234567 / 1234567
состоящие из десяти цифр (например ), могут рассматриваться как неразрешимые (вывод Falsey) или выдавать ошибку.
вход
Одна строка символов 0-9A-Z _?/
, как описано выше.
Выход
Если его можно проанализировать по одному действительному десятизначному номеру телефона, выведите номер телефона. В противном случае выведите некоторую форму индикации ошибки (например, -1, false или пустую строку).
Самые короткие победы, как обычно.
Примеры входных данных:
1234567890 / 1234567890
1234567890? / 1234567890
123456789_ / 1234567890
1234567890? / 123456789_
1234567890 / 1234567890?
1234567890 / 123456789_
123456789_ / 1234567890?
1234567890? / 1234567890?
1234567890? / 1234567891?
123456789_ / 123456789_
555CALLUS1 / 5552255871
404_12?6039 / 4041?1560_9
_GETREVENGE / 16?36?_2838_
1?691460_50 / 16_14609?50
61?08977211 / 612?897725?1
40?0INSTA__ / 8?00_NSTI?LL
3985_534?10 / 39?8?5053_10
7__7294?737 / 7797299?_37
28?897_384?1 / _8?89763861
271168090_ / 27116800?09
6802?148343 / 67?01148343
94_11628?2?6? / 9491162_47?
17?4285_689 / 1__26?52689
6_311?95_38 / 6731194?7?38
380?7DRAGON / 3807378?5?66
4?647_93236 / 5646?6?9__36
365?268898_ / 366267?7?984
GRATEDBATE / IRATEDBATE
5307_079?93 / ____8_____
535_3_0255 / 52?5_3_024?5
55_____088 / 54?2397207?7?
6_48398_95 / _946?398?6_5?
_0_312_3_1 / 81?53123?1?71
____1_____ / 64?255?508?61
8427820607 / 6?424?8?__6?07
50_3707__6 / 52?8375?74?56
615___8255 / 62?526?983?2?1?
__652618__ / 8365261__0
149___933_ / 1_9677?92?31
___7?281562 / 3438?28154?2
5?7?7?___8?3?7?4 / 57_855837_
605_272481 / 605427__81
86?569__731 / 88560?0?7721
1__91654?15 / 17?9?9165715
800NWABODE / 80069ABI?DE
8___9017_0 / 8_2494?12?9_
_024?5?91?470 / 304?17908?7_
42510704_2 / 4_51070492
9338737_89 / 93_873PLUS
327762_401 / 327_MASH01
33093_2058 / 3309_12058
4061_33578 / 40619_3578
559_383197 / 559938_197
94_9746084 / 9459746_84
1_37655238 / 163POLKA_T
_672FRIZZY / 767237499_
8_76318872 / TIP63188_2
51_8404321 / 5178404_21
358_030314 / 358603_314
2597_85802 / 25979_5802
77141_1408 / 7714_91408
330858_457 / 330_586457
4686079_39 / 46_6079239
86457508_6 / 8_45750826
523226626_ / _23BANNANA
_ISSY_ISSY / 44__9548?79?
6?00B_YJILT / 800289KILL?
2?52803___0 / 1526?0390?61?
FI?ND___T?HE / EAS?T?EREGGS?
0_231?95_38 / 0723194?7?38
0?647_39236 / 0646?6?3__36
025?267798_ / 06?6265?9?984
0061_33578 / _0619_3578
Я только гарантировал, что каждый возможный крайний случай покрыт (первые 11 записей), но кроме этого, он в значительной степени случайный.
Обновить
Четыре записи внизу добавлены с ведущими нулями (по предложению Джонатана Аллана).
Правильный вывод для входных выборок:
Основываясь на выводе записи Джонатана Аллана (форматированный вывод был идеальным).
" / "
, или мы можем просто принять их как два стандартных ввода?Ответы:
Желе , 84 байта
+4 байта - я думаю, что он, вероятно, должен вести себя одинаково во всех случаях, поэтому я преобразовал целочисленные значения поиска клавиатуры с использованием цифр
+49Ọ
.Функция, которая принимает строку в указанном формате и возвращает номер телефона в виде списка символов или ноль, если он недействителен. Как программа это печатается, как если бы это была строка.
Как это работает, они могут повторить число больше раз
(например
"123456789_ / 123456789_ / 1234567890"
)... или даже сказать это только один раз, и определенная логика будет применяться.
Попробуйте онлайн! или посмотрите все примеры входных данных .
Как?
источник
55_____088 / 54?2397207?7?
следует исправить5523972088
: все недостающие цифры присутствуют, а неопределенные цифры справа доступны слева. Все упрощенные случаи работают, хотя.Python 2 ,
314307274 байтаПопробуйте онлайн!
источник
Python 3,
549530509453449410406394393391 байтЯ уверен, что это можно улучшить, но это начало:
Я использую
str.translate
для букв и функцию-обертку,g
чтобы сделать входные данные в формате, в котором я хочу их. Фактическая функцияf
является рекурсивной и не работает для неоднозначных входных данных. У меня все еще есть много повторений, так что я уверен, что есть много возможностей для улучшения.Улучшения:
str.isnumeric
в качестве аргументаT==q!=O
)not(e or z)
вe+z in(e,z)
.(E,Z)
источник
map(chr,range(65,91))
хотя.JavaScript (ES6),
180190188 байтИзменить:
+10+9 байт, чтобы соответствовать правилу ложного выводаПринимает две входные строки в синтаксисе карри
(a)(b)
. Возвращает либоfalse
либо строку, представляющую угаданный номер телефона.Как это устроено
Шаг № 1 - Разбор входных строк
Сначала мы определим
F()
функцию, которая переводит строку в массив целых чисел, применяя следующие правила:Что, наоборот, можно интерпретировать следующим образом:
Мы применяем
F()
к обоимa
иb
. Это дает нам пару целых чисел (x, y) для каждой цифры в номере телефона, что соответствует двум возможным интерпретациям.Шаг № 2 - угадывание цифр
Для каждой пары (x, y) мы вычисляем:
Если x == 0 , это означает, что оба ввода являются символами подчеркивания. Итак, цифра в этом случае неизвестна.
Если x! = 0 , мы можем безопасно вывести цифру, если выполняется одно из следующих условий:
Последние два условия могут быть объединены с
!(d % x)
. Отсюда и окончательная формула:Если это правда, мы конвертируем x обратно в предполагаемую цифру, вычисляя (x - 1) И 15 .
Контрольные примеры
(Только 50 первых, потому что фрагмент консоли не может поддерживать больше истории вывода.)
Показать фрагмент кода
источник
1234567890? / 1234567890?
должен решить1234567890
. Прямо сейчас ваш код выводит,123456789?
который даже менее информативен, чем ввод.Assume: 5? / 5? -> 5 //uncertain, but matching
Perl 5 , 211 байт
... без отступа и \ n новых строк
Попробуйте онлайн!
источник
83652618?0
), а не какую-то ложь или значение ошибки.?
указывающий на то, что нет способа разрешить недостающую информацию, которая затем должна перейти к разделу «Вывод»:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Сетчатка,
150140136 байтСохранено несколько байтов благодаря Kritixi Lithos
Попробуйте онлайн!
Объяснение:
Первая строка преобразует все
?
входные данные в#
и все буквы в их числовые эквиваленты. Затем мы удаляем пробелы и/
из ввода. Следующие две строки относятся к случаям «предположение против определенности» (например5? \ 4
, будут заменены на4 \ 4
). После удаления всех#
s в строках 8 и 9 рассматриваются_
случаи «число против » (_ \ 3
становится3 \ 3
). Затем, если обе половины строки совпадают, мы сохраняем первые 10 цифр. В противном случае номер телефона недействителен, поэтому мы удаляем все.Альтернативное 160-байтовое решение, которое работает для телефонных номеров произвольной длины (и равного размера): TIO
источник
(/|_)
чтобы[/_]
спасти 1 байт. Кроме того, я думаю, что вы можете использовать;
вместо того,x
чтобы[^x]
стать\w
PHP,
251236 байтпринимает данные из командной строки; запустить
-nr
или попробовать это онлайн .сломать
golfings
preg_replace
первый: -8 байтjoin
: -2$$k
вместо$t[$k]
: -5источник
PHP, 200 + 8 байт
вдохновленный решением Arnaulds .
принимает входные данные из аргументов командной строки; запустить
-nr
или попробовать это онлайн .изменения, соответствующие ограничению вывода ошибок: (выведите
X
неполное число):|48
(-3 байта)echo chr(...);
на$r.=...;echo$r>1e10?X:$r;
(+11 байт)сломать
golfings
preg_replace_callback
(-10 байт)join
разделитель (-7)$x
задание в конец (-2)источник
Perl 5
-pl
, 173 байтаПопробуйте онлайн!
источник