przedmowa
W bardzo gorącej sytuacji musisz iść jeszcze dalej z golfem.
(np. w wyzwaniu, w którym twoja odpowiedź ma 100 znaków, a żenujące jest to, że nie udało ci się uzyskać 99 znaków).
W takim przypadku od teraz używasz algorytmu zwycięzcy tego wyzwania :)
cel
Musisz napisać program, który pobierze uint32 i zwróci najbardziej skompresowaną formę.
$ mathpack 147456
9<<14
- Będzie wiele rozwiązań dla liczby. Wybierz najkrótszy
- Jeśli skompresowany formularz jest dłuższy lub równy pierwotnemu numerowi, zwróć oryginalny numer
zasady
- pisz w dowolnym języku - wyjście w dowolnym języku
- Jestem świadomy, że C
'abc'
jest6382179
i można osiągnąć całkiem dobre wyniki z tej konwersji. ale języki są rozdzielone w tym wyzwaniu, więc nie trać serca - stosowanie zmiennych zewnętrznych jest zabronione. tylko operatory i literały oraz funkcje matematyczne!
punktacja
Oto przypadki testowe: pastebin.com/0bYPzUhX
Twój wynik (procent) będzie stosunkiem byte_size_of_your_output / byte_size_of_the_list
bez podziału linii .
(musisz to zrobić sam, ponieważ na wszelki wypadek zweryfikuję tylko najlepsze kody)
zwycięzcy zostaną wybrani według wyniku i języka wyjściowego !
przykłady:
$ mathpack 147456 | mathpack 97787584 | mathpack 387420489
9<<14 | 9e7^9e6 | pow(9,9)
code-challenge
bebe
źródło
źródło
write in any language - output in any language
- dwa języki mogą być różne, prawda?Odpowiedzi:
Kod: Mathematica, Wyjście: C, ~ 62,1518% (12674/20392)
Myślałem, że spróbuję również C z powodu tych zabawnych literałów postaci. Obecnie jest to jedyna rzecz, na którą próbuje odpowiedzieć ta odpowiedź, i działa całkiem dobrze.
Mam nadzieję, że niczego mi nie umknęło, ale ta odpowiedź pozwala uniknąć ukośników odwrotnych, pojedynczych cudzysłowów i kaligrafii. Jest jakiś skomentowany kod, który wykorzystuje ósemkowe lub inne sekwencje specjalne dla znaków niedrukowalnych, ale nie sądzę, żeby to rzeczywiście było konieczne, ponieważ C powinien być w stanie poradzić sobie z dowolnymi bajtami w literałach znaków, afaik (popraw mnie, jeśli ja 'Mylę).
Podobnie jak w przypadku innych zgłoszeń, przetestuj to za pomocą
źródło
\n
) i 13 (\r
). Bajt zerowy skompiluje się OK, ale z komunikatem o błędziewarning: null character(s) preserved in literal
.Kod: Mathematica, Wyjście: Julia, ~ 98,9457% (20177/20392 bajtów)
Funkcja przyjmuje liczbę i zwraca najkrótszy znaleziony ciąg . Obecnie stosuje cztery proste optymalizacje (mogę dodać więcej jutro).
Możesz zastosować go do całego pliku (aby zmierzyć jego wynik) w następujący sposób:
Zauważ, że niektóre z tych optymalizacji zakładają, że korzystasz z 64-bitowej Julii, tak że literały całkowite
int64
domyślnie dają ci . W przeciwnym razie przepełnisz się i tak dla liczb całkowitych większych niż 2 31 . Korzystając z tego założenia, możemy zastosować kilka optymalizacji, których kroki pośrednie są nawet większe niż 2 32 .EDIT: dodałem optymalizacji sugerowanego w przykładach PO do bitowe xor dwie duże liczby w notacji naukowej (faktycznie, dla wszystkich xor , lub i i ). Zauważ, że przedłużające
xormap
,ormap
iandmap
zawierać argumenty poza 2 32 może pomóc w znalezieniu dodatkowe optymalizacje, ale to nie działa dla podanych przypadków testowych, a tylko zwiększa czas pracy przez coś w rodzaju 10-krotnie.EDYCJA: Ogoliłem kolejne 16 bajtów, sprawdzając wszystkie,
n-9, n-8, ..., n+8, n+9
czy którekolwiek z nich można skrócić, w którym to przypadku przedstawiłem liczbę na podstawie tej wartości, dodając lub odejmując różnicę. Istnieje kilka przypadków, w których jedną z tych 18 liczb można przedstawić za pomocą 3 lub więcej znaków mniej niż onan
sama, w którym to przypadku mogę uzyskać dodatkowe oszczędności. Teraz zajmuje około 30 sekund, aby uruchomić go na wszystkich przypadkach testowych, ale oczywiście, jeśli ktoś faktycznie „użył” tej funkcji, uruchomiłby ją tylko na jednym numerze, więc jest to znacznie poniżej sekundy.EDYCJA: Kolejne niesamowite 4 bajty, robiąc to samo dla mnożenia i dzielenia. Teraz 50 sekund (podzielone nie trwają tak długo, ponieważ sprawdzam je tylko wtedy, gdy liczba jest podzielna przez czynnik zainteresowania).
EDYCJA: Kolejna optymalizacja, która tak naprawdę nie pomaga w danym zestawie testowym. Ten może zaoszczędzić bajt na rzeczy takie jak 2 30 lub 2 31 . Gdybyśmy mieli uint64s, byłoby wiele liczb, w których może to być ogromna oszczędność (w zasadzie za każdym razem, gdy reprezentacja bitowa kończy się na 1).
EDIT: Usunięto xor , lub , i optymalizacje w ogóle. Zauważyłem, że nawet nie działają w Julii, ponieważ (całkiem oczywiste) notacja naukowa daje swobodę, w której operatory bitowe nie są nawet zdefiniowane. Co ciekawe, jedna lub więcej nowszych optymalizacji wydaje się wychwytywać wszystkie przypadki, które zostały skrócone przez te optymalizacje, ponieważ wynik wcale się nie zmienił.
źródło
J do C (niesprawdzone, ale działa w większości przypadków, rodzaj odpowiedzi podstawowej).
Wypisuje literał łańcuchowy, który po wprowadzeniu w C reprezentuje liczbę (jak wspomniano w PO). To nie jest poważne podporządkowanie, ale raczej coś, co wzmocni moje umiejętności J, które myślałem, że się podzielę.
Alternatywna jednowarstwowa:
Co J próbuje z tego zrobić po wprowadzeniu:
Wielkie dzięki, J. Ponadto, dla osób znających się na J, Visio Rock za tworzenie bardziej złożonych funkcji:
źródło
\
,?
lub'
?m&u@:v
użyj,m u v
aby zapisać cenne postacie i zwiększyć czytelność. Stosując to do kodu, mamyf =: [: (,~ 0 $~ 8 - 8 | #) #:
ig =: [: ($~ 8 ,~ # % 8:) f
wreszcietoCString =: a. {~ [: #. g
. Wszystko razem otrzymujemya. {~ [: #. [: ($~ 8 ,~ # % 8:) [: (,~ 0 $~ 8 - 8 | #) #:
, co jest naprawdę łatwe do odczytania.