Обзор:
Ваша задача состоит в том, чтобы взять CSV-вход в key=value
формате и выстроить его в более организованном порядке (см. Ниже).
Входные данные:
Всегда через стандартный ввод . Записи всегда будут в следующей форме key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- Предварительно не будет списка возможных ключей, вы должны найти их во входном тексте.
- Конец ввода будет сигнализироваться
EOF
любой реализацией,EOF
подходящей для вашей ОС.
Выход:
Первая строка вашего вывода будет список всех клавиш в алфавитном порядке (даже если ключи все цифры). После этого распечатайте каждую запись в том же формате CSV с соответствующим цифровым заголовком без указанных ключей. Таким образом, для приведенного выше примера правильным выводом будет:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
ВОПРОСЫ-ОТВЕТЫ:
- Должен ли я беспокоиться о неправильно отформатированном вводе?
- Нет. Ваша программа может делать все, что захочет (генерировать исключение, игнорировать и т. Д.), Если входные данные отформатированы неправильно, например, строка
foo,bar,baz
- Нет. Ваша программа может делать все, что захочет (генерировать исключение, игнорировать и т. Д.), Если входные данные отформатированы неправильно, например, строка
- Как мне обработать экранирование специальных символов?
- Вы можете предположить, что не будет никаких дополнительных данных
,
или=
данных, которые не являются частьюkey=value
формата."
не имеет никакого особого значения в этом конкурсе (даже при том, что это имеет в традиционном CSV).также не является особенным в любом случае.
- Строки должны соответствовать следующему регулярному выражению:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Следовательно, ключи и значения будут совпадать
[^=,]+
- Следовательно, ключи и значения будут совпадать
- Вы можете предположить, что не будет никаких дополнительных данных
- Как насчет
CRLF
противLF
?- Вы можете выбрать любой разделитель, подходящий для вашей платформы. Большинство языков обрабатывают это без специального кода разграничения.
- Нужно ли выводить запятые, если последние несколько столбцов не существуют?
- Да. Смотрите пример.
- Разрешены ли анализаторы CSV или другие подобные внешние инструменты?
- Нет. Вы должны проанализировать данные самостоятельно.
Ответы:
GolfScript, 64 символа
Код представляет собой простую реализацию в GolfScript, вы можете проверить пример в Интернете .
Аннотированный код:
источник
Perl 6: 119 символов, 120 байт
Де-golfed:
источник
Perl, 129/121
129 байт, без командной строки:
Как указывает @Dennis ниже, вы можете получить это значение до 120 + 1 = 121, используя -n:
По сути, для каждой строки мы разделяем запятые, чтобы получить список пар. Для каждой пары мы делим знак равенства, чтобы получить ключ и значение. Мы устанавливаем пару ключ / значение в% h и локальный хэш-адрес. Первый используется для определения списка ключей. Последний используется для запоминания значений для этой строки.
источник
-n
переключатель вместоfor(<>){...}
. 2. Расщепление[, ]
вместо использованияchomp
. 3. Опуская точку с запятой после фигурных скобок.while (<>) { ... }
весь скрипт, поэтому нет необходимости в блоке END. Просто удалитеfor(<>){
в начале и}
в конце сценария.}
конец скрипта, а не тот, который соответствуетfor
циклу. Кроме того, вы можете сохранить еще один символ, используя вместо него новую строку\n
.JavaScript ( ES5 )
191183179168 байтПредполагая, что код запускается в командной строке spidermonkey:
Результат:
Эта прокладка может быть использована в браузере для симуляции пауков
readline
иprint
:Ungolfed:
источник
alert
вместо этогоconsole.log
и сохранить несколько байтов таким образом.readline
иprint
для фактического stdin / outBash + coreutils,
188138 байтВыход:
источник
Хаскелл,
357334g
выполняет синтаксический анализ - он разбивает входные данные на строки и отображает каждую строку в список(key,value)
пар.k
, объединяя все ключи в список и удаляя дубликаты, создает список со всеми уникальными ключами, которые я позже смогу использовать для сортировки. Я делаю это, создавая «Set» внутриmain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) для каждой строки, а затем беря каждую(key,value)
пару из строки и помещая ее в свое место в списке (foldl
). Строка 1 из примера приводит к выводу[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, который я объединяю в одну строку (",quux,bar,"
), объединяю с другими строками и печатаю.источник
Python 2,7 - 242 байта
BLEH
Обратите внимание, что вторым слоем отступа является символ табуляции, а не четыре пробела, как в SE.
Ungolfed:
источник
Python 3:
200195192189187источник
k4 (40? 51? 70? 46?)
основное выражение
он принимает и возвращает список строк
чтобы соответствовать спецификации, мы могли бы сделать интерактивно
который принимает входные данные от стандартного ввода и выводит вывод на стандартный вывод
для автономного приложения, принимающего входные данные из канала, мы можем сделать это:
Несмотря на то, что вы готовы рассматривать мою существующую оболочку k-as-фильтра awq.k как приемлемый инструмент для такого рода головоломок, мы можем сделать это:
или 46 символов или 40, в зависимости от того, как вы посчитали спор о кавычках
источник
q
команда? Является лиawq.k
опубликована где - нибудь?C # - 369
(в LINQPAD)
Ungolfed
Проверка строки ввода
Выход
источник
CRLF
противLF
FAQ). К сожалению, у меня нет копии Visual Studio для тестирования.