Ваша задача на этот раз - реализовать вариант expand(1)
утилиты POSIX, который расширяет табуляции до пробелов.
Ваша программа должна взять спецификацию табуляции, а затем прочитать ввод по стандартному вводу и заменить символы табуляции во вводе соответствующим количеством пробелов для перехода к следующей остановке табуляции. Результат должен быть выписан на стандарт .
Табстоп спецификация
Спецификация табуляции состоит либо из одного числа, или разделенного запятыми списка табуляции. В случае одного числа оно повторяется, как если бы его кратные числа встречались в списке через запятую (то есть 4
действует как 4,8,12,16,20,...
). Каждая запись в списке через запятую представляет собой положительное целое число, необязательно с префиксом a +
. +
Префикс указывает на относительную разность к предыдущему значению в списке через запятую. Первое значение в списке должно быть абсолютным (то есть без префикса). В закладках указывается столбец следующего непробельного символа (после развернутой вкладки), причем крайний левый столбец принимается за номер 0. Вкладки всегда должны расширяться как минимум до одного пробела.
Ввод, вывод
Спецификация табуляции должна быть либо принята в качестве первого параметра командной строки для программы, либо считана из стандартной в качестве первой строки ввода (завершается символом новой строки), на ваше усмотрение. После прочтения табуляции оставшиеся входные данные (все входные данные в первом случае) до EOF должны быть обработаны и расширены. Расширенный вывод должен быть выписан в стандартный формат.
Предполагается, что все развернутые таб-стопы и весь ввод имеют максимальную ширину 80 столбцов. Все расширенные вкладки строго увеличиваются.
пример
Спецификация Tabstop 4,6,+2,+8
эквивалентна 4,6,8,16
, и с обоими ввода
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
раскрывается в ( ␣
указывает на пробел)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
Подсчет очков - чистый код-гольф ; самый короткий код выигрывает.
источник
x+($1?i:0)
как короче$1?x+i:x
?:
) может также отмечать начало символа , но, поскольку символ не может начинаться с цифры,:0
все в порядке без пробелов. Или что-то. Это странно. Скобки также важны.t<<x+($1?i:0);i=x
первом утверждении не меняетсяx
, не так ли? Я думаю, что вам нужно изменить это какi=x+($1?i:0);t<<i
i=t=[]
(такi
как гарантированно не понадобится в первый раз); упрощение анализа табуляции и полное{t<<i=$2.to_i+($1?i:0)}
исключениеl
(i
уже содержит это значение). Но хорошо, если не заботиться о том, чтобы табуляция перестала строго увеличиваться: это экономит вам 4 символа, и я могу одолжить их, чтобы сэкономить 2.С, 228 символов
Вот решение C, чтобы начать все с начала. Здесь все еще есть много игры в гольф (посмотрите на все эти
if
и другиеfor
и другиеputchar
...). Протестировано на примере тестового примера, а также с тем же вводом, но4
и8
для спецификации вкладки.источник