Święte wojny toczyły się o spacje kontra karty. (I oczywiście przestrzenie, będąc obiektywnie lepszymi, wygrały.) - Alex A.
S OMe PEO P le jeszcze śmieci do w ccept że WHI c h Cl e arly Ś upreme. Właśnie otrzymaliśmy do pliku przy użyciu INCOR re ct, b reklamę i inf e formularz rior whi t espace, a teraz t he cd e NTS pliku r e skażony i zniszczony.
Ty decydujesz, że równie dobrze możesz pokazać osobie, która przesłała ci plik, jak bardzo się mylą - gwałtownie.
Opis
Jak sugeruje tytuł, Twoim wyzwaniem jest pobranie pliku zawierającego jedną lub więcej kart:
this is an evil tab onoes
i bezwzględnie rozbija je na kawałki:
this is an evil tab
o
n
o
e
s
Zauważ, że oprogramowanie Stack Exchange zamienia dosłowne tabulatory na cztery spacje (ponieważ ma rację), więc tabulatory w tym poście będą wyświetlane jako cztery spacje. Dane wejściowe do programu będą jednak zawierać rzeczywiste zakładki.
Wyzwanie
Rozwiązanie powinno przyjmować pojedynczy ciąg jako dane wejściowe, które mogą zawierać ASCII do drukowania, znaki nowej linii i tabulatory. Na wejściu zawsze będzie przynajmniej jedna zakładka.
Dane wyjściowe powinny być tego samego łańcucha, przy zastosowaniu następujących reguł:
Rozpocznij kursor od współrzędnych (0,0) i kierunku w prawo. Współrzędne to (kolumna, rząd), indeksowane od zera, a kierunek to kierunek, w którym należy przesuwać kursor po wydrukowaniu znaku.
Dla każdego znaku w ciągu:
Jeśli jest to nowa linia, przejdź do współrzędnych (0, n), gdzie n to liczba nowych linii w ciągu (do tej pory) i zresetuj kierunek w prawo.
Jeśli jest to tabulator, wypisz dwie spacje, obróć kursor o 90 stopni zgodnie z ruchem wskazówek zegara i wypisz jeszcze dwie spacje, skutecznie „dzieląc” tab na pół. Oto wizualny przykład, w którym karta jest reprezentowana jako,
--->
a spacje jako·
:foo--->bar--->baz
staje się
foo··· · b a r · · zab··
W przeciwnym razie po prostu wypisz znak na kursor i przesuń kursor o jeden krok w bieżącym kierunku.
Ponieważ czytasz ciąg znaków od początku do końca, możliwe jest, że będziesz musiał napisać „na wierzchu” istniejących znaków - to jest w porządku. Na przykład dane wejściowe
foo--->bar
spaces are superior
powinien dać wynik
foo
b
spaces are superior
r
Możesz wybrać, czy „zepsute karty” powinny zastępować inne znaki - pierwotna intencja była taka, że nie, ale specyfikacja była dwuznaczna, więc to twoja decyzja.
Ponadto, po zastosowaniu tych zasad, możesz również
dodaj lub usuń tyle spacji, ile chcesz.
dodaj maksymalnie jeden końcowy znak nowej linii.
Dane wejściowe nigdy nie będą zawierać spacji końcowych; nigdy nie będzie zawierał wiodących ani końcowych znaków nowej linii. Zawsze możesz również założyć, że nigdy nie będziesz musiał pisać do kolumny lub wiersza mniejszej niż 0 (tj. Poza ekranem).
Przypadek testowy
Karty w tym przypadku testowym są reprezentowane jako, --->
ponieważ w przeciwnym razie SE je pożera.
Wkład:
Test case. Here's a tab--->there's a tab--->everywhere a tab--->tab--->this is some more text
blah
blah
blah blah blah blah blah blah--->blaah--->blaah--->blah--->blaaaaah--->blah--->blah--->blah--->blah--->blah
Wydajność:
Test case. Here's a tab
blah
blah t
blah blah blah blah blah blah
blaablah
r b
e l b
h 'h a l
a sa a a
l l h h
this is some mobe tbxt
haalhalb
b a
a b
t
bat a erehwyreve
Fantazyjna animacja:
Zasady
- To jest code-golf , więc wygra najkrótszy kod w bajtach!
(0,0)
, masz na myśli, że najpierw musimy wyczyścić konsolę, czy masz na myśli jedynie domyślną pozycję kursora?