Słyszałem, że twój kod może działać szybciej, jeśli wcinasz go w odwrotnej kolejności, dzięki czemu kompilator może przetwarzać go jak wzorzec projektu drzewa od samego początku „gałęzi”. Pomaga to, ponieważ grawitacja przyspieszy czas kompilacji kodu, a wydajność struktury danych ulegnie poprawie. Oto przykład ze skryptów Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Ale z jakiegoś powodu Notatnik nie ma ustawienia automatycznego robienia tego, więc potrzebuję programu, który by to dla mnie zrobił.
Opis
Zgłoszenia muszą przyjmować fragment kodu jako dane wejściowe, odwracać wcięcia i generować wynikowy kod.
Odbywa się to zgodnie z następującą procedurą:
Podziel kod na linie. Każda linia rozpocznie się od zera lub więcej spacji (nie będzie tabulatorów).
Znajdź wszystkie unikalne poziomy wcięć w kodzie. Na przykład w powyższym przykładzie byłoby to
0 4 8 12
Odwróć kolejność tej listy poziomów wcięć i zamapuj listę odwróconą na oryginalną. Trudno to wytłumaczyć słowami, ale na przykład wyglądałoby to tak
0 — 12 4 — 8 8 — 4 12 — 0
Zastosuj to mapowanie do oryginalnego kodu. W tym przykładzie linia z wcięciem 0-przestrzeni zostanie wcięta o 12 spacji, 4 spacje zamieniają się w 8 spacji itp.
Wejście wyjście
Dane wejściowe i wyjściowe można podać w dowolny sposób (STDIN / STDOUT, parametr funkcji / wartość zwracana itp.); jeśli twój język nie obsługuje wprowadzania wielowierszowego (lub po prostu nie chcesz), możesz |
zamiast tego użyć znaku do oddzielenia linii.
Dane wejściowe będą się składały tylko z drukowanych znaków ASCII + i nie będą zawierać pustych linii.
Przypadki testowe
Wejście:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Dane wyjściowe: powyższy przykładowy kod.
Wejście:
a
b
c
d
e
f
g
h
Wynik:
a
b
c
d
e
f
g
h
Wejście:
1
2
3
2
1
Wynik:
1
2
3
2
1
Wejście:
foo
Wynik:
foo