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
źródło
Odpowiedzi:
CJam,
43 39 3635 bajtówTo wygląda na zbyt długo. Jestem pewien, że nie optymalizuję wystarczająco!Jak to działa:
Podstawową ideą jest podzielenie danych wejściowych na nowy wiersz, obliczenie liczby wiodących spacji w każdej linii, sortowanie i uzyskiwanie unikalnych liczb, kopiowanie tej tablicy i odwracanie kopii, transliteracja oryginalnych liczb w kolejności za pomocą tych dwóch tablic, a następnie ostatecznie utworzenie ostatni ciąg przy użyciu tych informacji.
Najdłuższą częścią jest ustalenie, ile wiodących spacji jest w każdej linii, ponieważ CJam nie ma łatwego sposobu na zrobienie tego.
Rozszerzenie kodu:
I w duchu pytania. Prawdziwe rozszerzenie kodu:
7 bajtów zaoszczędzonych dzięki Martinowi i 1 bajt dzięki Dennisowi
Wypróbuj online tutaj
źródło
{}#
ma błąd: zwraca liczbę całkowitą, ale powinien zwrócić wartość Long. Jak na ironię,i
(rzut na liczbę całkowitą) to rozwiązuje. 2. Ponieważ""#
nie ma tego samego błędu,_Sm0=#
jest o jeden bajt krótszy.Python 2 -
137131 bajtówPobiera dane wejściowe za pomocą
|
zamiast\n
.Wyjaśnienie
Pierwsze trzy linie są dość proste. Zrób listę wszystkich linii na wejściu, zdefiniuj funkcję, która mówi, ile ma wiodących białych znaków w ciągu, i ułóż posortowaną listę wartości, które funkcja wydziela dla każdego wiersza na wejściu.
Ostatnia linia jest o wiele przyjemniejsza.
źródło
()
save 4 zaraw_
)f(s)for s in i
powinno byćmap(f,i)
.d=[];d+=set(L)
jest krótszą wersjąd=sorted(set(L))
.JavaScript, ES6,
113 103101 bajtówJestem prawie pewien, że można grać w golfa przynajmniej trochę dalej, ale proszę bardzo.Nigdy bym nie pomyślał, że będzie 101-bajtowe rozwiązanie JS, pokonujące Pythona!
Tworzy to metodę o nazwie,
f
którą można wywołać za pomocą ciągu wejściowego. Jeśli korzystasz z najnowszej przeglądarki Firefox, masz ciągi szablonów i możesz wywołać metodę jakW przeciwnym razie możesz też nazwać to tak
lub wypróbuj poniższy fragment:
źródło
\s
znakiem spacji) i usuwając nawiasy wokółx
funkcji replace.(x)
: /b
ic
co? I tak odnoszą się tylko do tej samej tablicy.Rubinowy, 63 bajty
Definiuje nienazwaną funkcję, która pobiera i zwraca ciąg znaków. Możesz wywołać go przez dodanie
["string here"]
lub przypisanie do zmiennej, a następnie wywołanie tej zmiennej.Jak to działa:
s.scan(r=/^ */)
zawiera listę wszystkich czołowych miejsc i sklepów, które regex wr
celu późniejszego wykorzystania.uniq
eliminuje duplikaty.sort
... sortuje.Teraz przejdź do końca,
l.zip(l.reverse)
daje tablicę par, które chcemy zastąpić.to_h
zamienia to w skrót, interpretując pary jako pary klucz-wartość.Teraz
s.gsub
zastąpiono wszystkie dopasowania wyrażenia regularnego (wszystkie wiodące spacje), używając tego skrótu jako tabeli wyszukiwania, aby znaleźć zamiennik.źródło
Pyth 39
Wypróbuj online.
Używa
|
opcji separatora.źródło
Japt
-R
, 27 bajtówWypróbuj online!
Rozpakowane i jak to działa
Jak to naprawdę działa
źródło
Scala,
176171Na końcu doda nową linię. Gdybym nie musiał zachowywać spacji na końcu wiersza, mogę uzyskać numer 167:
Nie golfowany:
źródło
PowerShell , 112 bajtów
Wypróbuj online!
Mniej golfa:
źródło
Haskell, 116
źródło
PHP - 173 bajtów
Niezoptymalizowany kod powinien być przechowywany w
$v
zmiennej:Oto nieposkromiona i skomentowana wersja:
Prawdopodobnie nigdy nie napisałem czegoś tak brudnego. Wstydzę się.
źródło
JavaScript, 351
Wersja bez golfa:
Testowanie
Pokaż fragment kodu
Pokaż fragment kodu
Pokaż fragment kodu
Pokaż fragment kodu
źródło
Perl 5, 112
111 + 1 za
-n
(-E
jest bezpłatny)Jestem pewien, że można to zrobić za pomocą mniejszej liczby ruchów, ale w tej chwili nie wiem, jak to zrobić.
źródło