tło
Minifikatory są zwykle używane podczas obsługi JavaScript w przeglądarce. Jest powszechnie używany do zmniejszenia liczby bajtów, które należy wysłać. Oszczędzanie przepustowości jest przydatne z oczywistych powodów. Niektórzy używają obfuscaters (które celowo utrudniają czytanie kodu), nie mówię o nich.
Będziemy minimalizować Python 2
Zastanawiałem się nad tym, czy używać JavaScript lub Pythona do minimalizowania doświadczeń i zdecydowałem się na Python z dwóch powodów: biała przestrzeń ma znaczenie i myślę, że doda to interesującą dynamikę problemu. Dodatkowo, użycie Python 2.7 zapewni kolejną dynamikę, taką jak usunięcie zbędnych ()
podczas drukowania (tj. print("Hello world")
Vs. print"Hello world"
). Wolałbym osobiście otworzyć go na dowolny język, ale w przypadku niektórych języków ten proces nie ma większego sensu. A język, który zdecydujesz się zminimalizować, będzie miał bezpośredni wpływ na twój wynik (i czy język można nawet zminimalizować).
Okular
Twoim celem jest modyfikacja kodu tylko w sposób, który i tak nie zmieni jego funkcjonalności. Możesz oczywiście zmieniać nazwy zmiennych (w programie minimalizującym), o ile nie wpływa to na wynik (śledzenie zakresu ). Chociaż daję ci konkretny program, nie optymalizuj dla przypadku testowego, ponieważ wszystkie standardowe luki są zabronione.
Wynik : długość programu po jego zminimalizowaniu.
Dane wejściowe : dowolny program Python 2.7 (który nie zawiera błędów)
Wyjście : wersja zminimalizowana.
Chociaż twój kod powinien być w stanie pomieścić wszystkie prawidłowe dane wejściowe Python 2.7, konieczne jest przetestowanie skryptu na czymś, aby udowodnić jego skuteczność.
Kliknij tutaj, aby wyświetlić przykładowy program.
Sprawienie, by problem był bardziej przystępny
Zapraszam do używania lub modyfikowania dowolnego kodu znajdującego się w moim rozwiązaniu (wymienionym poniżej). Zrobiłem to, aby zacząć od wyceny podstawowej obsługi wyceny; możesz jednak rozszerzyć go na wcięcie itp.
Przykładowe sposoby zminimalizowania Pythona
Cała biała spacja może zostać zastąpiona minimalną możliwą ilością (potwierdzam, że w Pythonie możesz robić skomplikowane rzeczy za pomocą zakładek , ale pozostawiam to tobie, aby zdecydować, czy je wdrożyć, czy nie).
Przykład
Następujące:
def print_a_range(a):
for i in range(a):
print(i)
Możliwe:
def print_a_range(a):
for i in range(a):
print(i)
Technicznie, jeśli w pętli jest tylko jedna linia, możesz ją jeszcze bardziej skompresować:
def print_a_range(a):
for i in range(a):print(i) #Note, you can also remove the `()` here.
Istnieje jednak inny sposób zmniejszenia białych znaków w Pythonie:
Następujące:
print ([a * 2 for a in range(20) if a % 2 == 0])
Możliwe:
print([a*2for a in range(20)if a%2==0])
Zauważ, że nie ma potrzeby odstępu między 2
i for
. Zmienna, funkcje i słowa kluczowe nie mogą zaczynać się od cyfry. Tak więc interpreter języka Python jest w porządku <num><keyword>
, bez spacji. Należy również zauważyć, że nie ma spacji między )
i if
.
Uwaga: nie wolno zmieniać wyniku działania programu! Więc:
print"f(x)=x*2 is a great equation!"
Powyższa instrukcja print powinna pozostać niezmieniona, ponieważ usunięcie spacji między 2
i is
zmodyfikowałoby dane wyjściowe.
źródło
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
na'1'*100
dozwoloną? Wymagać zrobienia, ponieważ zachowanie jest takie samo?Odpowiedzi:
Wynik w Python 2.7, 2013
Ten program może być używany jako odniesienie i możesz wziąć następujący kod i zmodyfikować go, a następnie opublikować we własnych rozwiązaniach.
Z perspektywy czasu być może powinienem również użyć wyrażenia regularnego do obsługi cytatów, ale myślę, że w obecnym stanie może wystarczyć, aby zachęcić ludzi do rozwiązania problemu.
Dlaczego wybrałem Python 2.7: Pomyślałem, że łatwiej będzie przetestować, czy spowodowałem awarię programu za pomocą
exec
słowa kluczowego.Ten kod przyjmuje program jako
in.txt
.Uznałem, że powinienem przynajmniej rzucić piłkę dla każdego, kto chce wziąć udział, pisząc parser cytatów (który również zajmuje się komentarzami) i krótki przykład tego, jak wyrażenie regularne, w połączeniu z parserem cytatów, może naprawdę zmienić grę pod względem złożoność tego problemu.
Uwaga: w tym minifikatorze wciąż jest dużo miejsca na ulepszenia. Tak jak możesz bawić się wcięciami, nazwami zmiennych i usuwaniem nawiasów, gdy są używane, moje słowa kluczowe, takie jak
print
lubyield
.Wyjście programu:
źródło