В своем xkcd о стандартном формате даты ISO 8601 Рэндалл вырвался в довольно любопытной альтернативной записи:
Большие числа - это все цифры, которые появляются в текущей дате в их обычном порядке, а маленькие цифры - это индексы, основанные на 1, вхождения этой цифры. Таким образом, приведенный выше пример представляет 2013-02-27
.
Давайте определим представление ASCII для такой даты. Первая строка содержит индексы с 1 по 4. Вторая строка содержит «большие» цифры. Третья строка содержит индексы с 5 по 8. Если в одном слоте несколько индексов, они перечислены рядом друг с другом от наименьшего к наибольшему. Если m
в одном слоте имеется не более индексов (т.е. в одной цифре и в одной строке), то каждый столбец должен иметь m+1
ширину символов и выравниваться по левому краю:
2 3 1 4
0 1 2 3 7
5 67 8
Смотрите также сопутствующий вызов для обратного преобразования.
Соревнование
Учитывая дату в xkcd-нотации, выведите соответствующую дату ISO 8601 ( YYYY-MM-DD
).
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вы можете предположить, что ввод является любой действительной датой между годами 0000
и 9999
включительно.
На входе не будет начальных пробелов, но вы можете предположить, что строки дополняются пробелами до прямоугольника, который содержит не более одного завершающего столбца пробелов.
Применяются стандартные правила игры в гольф .
Тестовые случаи
2 3 1 4
0 1 2 3 7
5 67 8
2013-02-27
2 3 1 4
0 1 2 4 5
5 67 8
2015-12-24
1234
1 2
5678
2222-11-11
1 3 24
0 1 2 7 8
57 6 8
1878-02-08
2 4 1 3
0 1 2 6
5 678
2061-02-22
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
3564-10-28
1234
1
5678
1111-11-11
1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30
1
, выше2
, поэтому первая цифра2
.2
выше0
, поэтому вторая цифра0
.3
выше1
,4
выше3
, поэтому мы получаем2013
первые четыре цифры. Теперь5
ниже0
, так что пятая цифра0
,6
и7
оба ниже2
, так что обе эти цифры2
. И, наконец,8
ниже7
, поэтому последняя цифра8
, и мы в конечном итоге2013-02-27
. (Дефисы неявны в нотации xkcd, потому что мы знаем, в каких позициях они появляются.)Ответы:
CJam, 35 байт
Попробуй это здесь . Ожидается, что входные строки будут дополнены пробелами.
объяснение
ll
читает две строки ввода и{1$e>}*
выполняет «сканирование» для второй: он берет все префиксы своего ввода и вычисляет максимум каждого префикса. Для строки ввода"0 1 2 7 8"
это толкает"0001112227778"
. Наш стек теперь выглядит так:Нам нужно заново записать значения в список, используя самих себя
]
; это захватывает наша первая линия, так что мы вытолкнуть его обратно с помощью(
, чтобы получитькак и ожидалось.
eelee+
перечисляет эту строку, затем делает то же самое для третьей входной строки и объединяет результаты, оставляя что-то вроде этого на вершине стека:Теперь наш стек находится
["0001112227778" X]
гдеX
перечисленный выше список.Мы переворачиваем каждую пару в
X
(Wf%
), сортируем пары лексикографически ($
) и оставляем последние 8 пар-8>
. Это дает нам что-то вроде:Это работает, потому что сортировка помещает все пары с ключом
'
(пробел) перед всеми цифрами в порядке возрастания.Это « x- положения» символов
12345678
в первой и третьей строках: нам нужно только извлечь символы из нашей (измененной) второй строки, которые выровнены по вертикали.Для этого мы берем каждую позицию (
Wf=
), указатель на строку, которую мы сделали ранее (\f=
). Теперь у нас"20610222"
в стеке: чтобы добавить тире, сначала мы разбиваем на сегменты длиной два (2/
), печатаем первый сегмент без новой строки ((o
) и соединяем оставшиеся сегменты с помощью тире ('-*
).РЕДАКТИРОВАТЬ : крутой трюк сканирования, Мартин! Сохранено четыре байта.
РЕДАКТИРОВАТЬ 2 : сохранил еще два байта, заменив
eelee+
наl+ee
; это работает, потому что линии все имеют одинаковую длину, и список индексация в CJam автоматически по модулю длине списка, так что индексыn+0
,n+1
,n+2
... красиво карта с0
,1
,2
...РЕДАКТИРОВАТЬ 3 : Мартин сохранил еще один байт на последнем этапе процесса. Приятно!
источник
Пиф,
4843Тестирование
Требуется заполнение пробелами в прямоугольник.
Я не думаю, что это лучший подход, но в основном он записывает среднее значение индекса в строку, на которую указывает верхнее или нижнее значение. Ну, я думаю, у меня было достаточно времени, чтобы поиграть в гольф из большинства очевидных вещей, которые я видел. :П
источник
JavaScript (ES7), 115
Анонимная функция. Используя строки шаблона, есть новая строка, которая важна и включена в число байтов.
Требование: средняя строка ввода не может быть короче первой или последней. Это требование удовлетворяется, когда ввод дополнен пробелами для формирования прямоугольника.
ES6 версия 117 с использованием .map вместо понимания массива
Меньше гольфа
Тестовый фрагмент
источник
Haskell,
125106103 байтаТребуется заполнение пробелами до полного прямоугольника.
Пример использования:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Как это устроено:
источник
JavaScript ES6, 231
Тестовые случаи .
источник
Perl, 154 байта
Разоблаченный и объясненный
источник
JavaScript (ES6), 131 байт
объяснение
Требуется, чтобы ввод был дополнен пробелами для формирования прямоугольника.
Контрольная работа
Показать фрагмент кода
источник
Powershell, 119 байт
Неуправляемый тестовый скрипт:
Выход:
источник
Желе , 38 байт
Попробуйте онлайн!
Помощник только там, чтобы облегчить ввод; это на самом деле полная программа. Обязательно позаботьтесь о :
'''
), а также строки рядом с ними (пусто, там для наглядности).источник