Twoim zadaniem tym razem jest zaimplementowanie wariantu expand(1)
narzędzia POSIX , który rozszerza tabulatory na spacje.
Twój program ma wziąć specyfikację tabstop, a następnie wczytać dane wejściowe w standardzie i zastąpić znaki tabulacji w danych wejściowych odpowiednią ilością spacji, aby przejść do następnego tabstop. Wynik należy zapisać na standardowe wyjście .
Specyfikacja Tabstop
Specyfikacja tabstop składa się z pojedynczej liczby lub listy tabulatorów oddzielonej przecinkami. W przypadku pojedynczej liczby jest ona powtarzana tak, jakby jej wielokrotność wystąpiła na liście oddzielonej przecinkami (tzn. 4
Działa jak 4,8,12,16,20,...
). Każdy wpis na liście oddzielonej przecinkami jest dodatnią liczbą całkowitą, opcjonalnie poprzedzoną znakiem +
. +
Przedrostek oznacza względną różnicę w stosunku do poprzedniej wartości w oddzielone przecinkami. Pierwsza wartość na liście musi być bezwzględna (tzn. Bez prefiksu). Tabstopsy określają kolumnę następnego znaku spacji (następującą po rozwiniętej karcie), przy czym kolumna znajdująca się najdalej z lewej strony przyjmuje numer 0. Tabulatory powinny zawsze rozwijać się do co najmniej jednej spacji.
Wejście wyjście
Specyfikację tabstop należy albo przyjąć jako pierwszy parametr programu do wiersza poleceń, albo odczytać ze standardu jako pierwszy wiersz wprowadzania (zakończony nowym wierszem), według własnego uznania. Po odczytaniu tabstopu pozostałe dane wejściowe (wszystkie dane wejściowe, w poprzednim przypadku) do momentu przetworzenia i rozszerzenia EOF. Rozszerzone dane wyjściowe należy zapisać na standardowe wyjście.
Zakłada się, że wszystkie rozwinięte tabstopsy i wszystkie dane wejściowe mają maksymalnie 80 kolumn szerokości. Wszystkie rozszerzone tabstopsy ściśle się zwiększają.
Przykład
Specyfikacja Tabstop 4,6,+2,+8
jest równoważna 4,6,8,16
z obydwoma danymi wejściowymi
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
jest rozwinięty do ( ␣
wskazuje spację)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
Punktacja jest czystym golfem ; najkrótszy kod wygrywa.
źródło
x+($1?i:0)
jako krótszy$1?x+i:x
?:
) może również oznaczać początek symbolu , ale ponieważ symbol nie może zaczynać się cyfrą,:0
bez spacji jest OK. Lub coś. To dziwne. Wydaje się, że nawiasy są również kluczowe.t<<x+($1?i:0);i=x
pierwszym stwierdzeniu się nie zmieniax
, prawda? Myślę, że musisz to odwrócić, ponieważi=x+($1?i:0);t<<i
i=t=[]
(ponieważi
gwarantuje się, że nie będzie potrzebny za pierwszym razem); uproszczenie parsowania tabulatorów{t<<i=$2.to_i+($1?i:0)}
il
całkowite wyeliminowanie (i
już posiada tę wartość). Ale miło, że nie przejmuję się tym, że karta przestaje się zwiększać: to oszczędza ci 4 znaki i mogę pożyczyć, aby uratować 2.C, 228 znaków
Oto rozwiązanie C na początek. Jest jeszcze wiele do zrobienia golfa (patrzeć na te wszystkie
if
s ifor
s iputchar
s ...). Testowane na przykładzie testcase, a także z tego samego wkładu, ale4
i8
w specyfikacji karty.źródło