Инвертировать метод Формат.
Format
Метод класса String (или эквивалент, такие как sprintf
) доступен в большинстве языков. В основном он принимает строку «Формат», которая может содержать заполнители с некоторым дополнительным форматированием и ноль или более значений для вставки вместо этих заполнителей.
Ваша задача - реализовать обратную функцию на выбранном вами языке.
API
Имя метода должно быть либо format1
или deformat
.
Вход : 1-й параметр будет строкой «Формат», как и в оригинальном методе форматирования. Вторым параметром будет проанализированная строка (см. Примеры ниже). Никаких других параметров не требуется и не допускается.
Вывод : массив (или эквивалент вашего языка выбора) значений, которые были извлечены соответственно с заполнителями в формате.
Заполнители являются {0}
, {1}
, {2}
и т.д.
В случае плохого формата вы можете выдать ошибку или вернуть все, что захотите.
В случае неверного ввода вы можете выдать ошибку или вернуть все, что захотите. Недопустимый ввод таким образом, что не может быть сгенерирован с помощью String.Format , используя тот же формат строки, например: '{0}{0}', 'AAB'
.
Примеры
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
неоднозначность
В случае двусмысленности вы можете вернуть любой подходящий ответ. Например:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
Еще несколько правил
- Чтобы сделать это проще, нет необходимости поддерживать форматирование. Вы можете забыть все о ведущих нулях, десятичной запятой или вопросах округления. Просто сгенерируйте значения в виде строк.
- Чтобы сделать это нетривиальным, регулярные выражения не допускаются .
- Вам не нужно заботиться о фигурных скобках на входе (т. Е. 2-й входной параметр не будет содержать
{
s или}
s).
выигрыш
Это код-гольф ! (следует читать как «Это Спарта!») правильная функция, имеющая самую короткую длину, выигрывает. Стандартные лазейки запрещены.
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
, что если бы нам вместо этого далиdeformat('{0}{1}{0}', 'AAAA')
?['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
? Если так, то есть дешевое решение, если каждая строка не появится хотя бы дважды.deformat('{0}_{1}_{0}', 'A_BB_A')
?Ответы:
Haskell, 220 символов
Разрывы, если вы используете несколько представлений для одного и того же шаблона (
{1}
vs{01}
) - не обеспечивает их равенство, отбрасывая соответствия для всех, кроме одного представления.19 символов можно сохранить, опуская,
mapKeys((0+).read)$
если правильное упорядочение совпадений свыше 10 шаблонов не имеет значения, или может потребоваться заполнение до той же длины, или если допустимо упорядочение строк в шаблонах. В любом случае, если шаблон опущен в первом аргументе, он также опущен в результате.Удаление
!!0
из конца делаетformat1
возвращает список всех решений, а не только первое.до игры в гольф:
источник
read
оставляет вас с неоднозначным типом. Хаскель не знает, какой тип заказа для чтения ключей.+0
Формирует число, из которого Haskell уже может сделать произвольный выбор и использует целые числа.Рубин, 312 символов
5 символов могут быть сохранены путем предпочтения совпадений нулевой длины, принятия
ABBA
решения['', 'ABBA']
, а не предпочтительного решения вопроса. Я решил интерпретировать примеры как подразумеваемую часть спецификации.источник
Питон, 208 символов, хотя и неполный.
Функция обрабатывает обе строки одновременно, пока не найдет открывающую скобку во входной строке, обозначающую заполнитель.
Затем он предполагает, что заполнитель уже расширен, и пытается продвинуть индекс выходной строки после него, просматривая список найденных значений.
Если он не был расширен, он добавляет новую запись в список значений и начинает добавлять символы из выходной строки, пока не достигнет символа после заполнителя во входной строке.
Когда он достигает конца входной строки, он возвращает найденные значения.
Он хорошо работает для простых входов, но имеет ряд проблем:
Требуется известный разделитель после каждого заполнителя во входных данных, поэтому он не работает с заполнителями рядом друг с другом, т. Е. "{0} {1}". Вот почему мне нужно было добавить пробел к обеим строкам.
Предполагается, что первые экземпляры каждого заполнителя располагаются по порядку, например, "{ 0 } { 1 } {1} {0} { 2 }".
Это работает только для первых 10 заполнителей, поскольку предполагается, что они все 3 символа длиной.
Это не обрабатывает неоднозначные случаи вообще :(
источник
Код C ++ 11, 386 символов
Функция format1 имеет 2 строки в качестве входных данных (const char *) и возвращает хэш-карту с целочисленными ключами (шаблон) и значением является идентифицированная строка. Если ничего не найдено или есть какая-либо ошибка, возвращается пустое хеш-изображение.
Использование:
Выход:
Пример 2:
Выход:
Шаблоны представлены в десятичном представлении, входные данные больше, чем
MAXINT
будут переполнены, но это все еще работает.Несмотря на то, что в других языках программирования есть небольшие решения, это самый маленький C ++ - пока! :)
Это код перед игрой в гольф:
источник