Wyzwanie
Twoim celem jest napisanie najkrótszego możliwego programu, który weźmie listę wydarzeń (takich jak upvote, downvote itp.) I zwróci reputację użytkownika oraz przywileje, które zdobył.
Jakie wydarzenia?
Oto tabela wydarzeń, uporządkowana według zdobytej reputacji:
-15 answer unaccepted
-10 answer unupvoted
-5 question unupvoted
-2 answer downvoted
-2 question downvoted
-2 unaccept answer
-1 downvote answer
+1 join website
+1 undownvote answer
+2 accept answer
+2 question undownvoted
+2 answer undownvoted
+5 question upvoted
+10 answer upvoted
+15 answer accepted
+100 association bonus
Jakie przywileje?
Oto lista przywilejów w kolejności wymaganej reputacji.
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
200 retag questions
250 view close votes
500 cast close and reopen votes
750 established user
1000 edit questions and answers
1000 create gallery chat rooms
1250 create tag synonyms
1500 approve tag wiki edits
2000 access to moderator tools
3500 protect questions
4000 trusted user
Wejście
Dane wejściowe (na STDIN) będą listą zdarzeń, po jednym w wierszu, dokładnie tak, jak wyglądają na pierwszym wykresie (z wyjątkiem reputacji). Pusty wiersz oznacza koniec wprowadzania. Oto przykład (na końcu powinna być pusta linia):
join website
association bonus
answer upvoted
answer upvoted
question upvoted
answer accepted
answer upvoted
accept answer
unaccept answer
question unupvoted
accept answer
question upvoted
Wynik
W pierwszym wierszu wyniku (do STDOUT) należy podać liczbę skumulowanych powtórzeń. Każda kolejna linia powinna zawierać jeden uzyskany przywilej, dokładnie tak, jak się pojawia i w tej samej kolejności, co drugi wykres. Oczekiwana wydajność dla powyższego wejścia:
153 reputation
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
Reguły, ograniczenia i uwagi
To jest kod golfowy. Obowiązują standardowe zasady gry w golfa.
(EDYCJA: Ponieważ mam dwa wpisy, które uzyskują dostęp do plików, chciałbym zauważyć, że długość pliku należy dodać do długości kodu w ramach standardowych zasad gry w golfa)
źródło
Odpowiedzi:
GolfScript (
569 568 475473 znaków)Używa znaków niedrukowalnych do kompresji wymaganych ciągów, więc w formacie xxd:
Modulo kompresji ciągów, program jest
Pod wieloma względami dość trywialne, ale są dwie interesujące kwestie.
Pierwszą jest funkcja skrótu dla łańcuchów wejściowych. Byłem zaskoczony tym, jak prosta funkcja skrótu daje unikalne wyniki dla każdego z 9 (po
un
usunięciu) różnych ciągów, a jako bonus daje również inny wynik dla pustego ciągu, co oszczędza usuwania ostatniego pustego wiersza z Wejście.Obliczenie liczby powtórzeń dla pojedynczej linii wynosi
Najpierw usuwa
un
z łańcucha i zapisuje, czy został znaleziony. Następnie stosuje super prostą funkcję skrótu,h(s) = ( sum over i: (-1)^i s[i] ) % 11
. (Możesz zobaczyć, dlaczego byłem zaskoczony, gdy go znalazłem). Ciągto tabela przeglądowa, która odwzorowuje wartość skrótu na zmianę w rep (odejmij 110 od wartości ASCII), a następnie, jeśli zostanie znaleziona
un
na początku, neguje zmianę.Drugim interesującym punktem jest filtr uprawnień. Próbowałem nieco prostszego:
która ocenia linię (niezdefiniowane słowa nic nie robią), aby uzyskać jej wynik w porównaniu z reputacją (przechowywaną w
^
). To prawie działa. Rzeczą, która je psuje jest to, żeand
występuje w niektórych ciągach i jest funkcją predefiniowaną. Rozwiązanie: zmieszaj linie tak, abyand
już nie występowały. (Należy uzasadnić, że usunięcie spacji byłoby lepsze niż usunięcie literya
, ale nie ma to wpływu na długość).źródło
Ruby 1.9.3,
514467459 (507460452 + 7 dla flag)Uruchom z
ruby -rzlib <program>
.Jeśli literały ciągów binarnych nie zostały poprawnie wklejone (czego prawdopodobnie nie zrobiły), oto zrzut heksowy:
źródło
Haskell, 787 znaków
źródło
C #
127112081206źródło
C -
10831069Zdaję sobie sprawę, że jestem trochę spóźniony do gry, ale C nie jest reprezentowany, więc pomyślałem, że to zrobię.
Oto nieco mniej golfowa wersja:
Myślę, że podstawowy pomysł jest podobny do podejścia wielu innych ludzi. Używam małego domowego haszu do radzenia sobie z rozpoznawaniem danych wejściowych. Hash wygodnie daje zero dla pustego łańcucha, dzięki czemu linia odczytu jest bardzo zwarta. Jestem pewien, że skrót można by znacznie poprawić. Można uzyskać dobre oszczędności postaci, pozwalając na strategiczne zderzenia skrótów dla rzeczy o tej samej reputacji.
Miałem też trochę przewrotnej zabawy, chowającgoto
makro wewnątrz (mój pierwszy raz, kiedy używałemgoto
, jestem dumny z tego).Jedynym miejscem, w którym jestem pewien, że mam dużo miejsca na ulepszenia, jest sekcja wyników. Nawet nie próbowałem kompresować faktycznej logiki drukowania, więc jestem pewien, że mógłbym również zapisać tam kilka znaków.
źródło
puts
zamiastprintf
.goto E
zreturn
(eliminując etykieta) i wyjąć!=0
w funkcji skrótu (to redundantne).C (
765737 znaków)Lub nieco bardziej czytelny z dodanymi podziałami linii i wcięciami:
Powyższe kody zakładają pojedynczą nową linię na końcu pliku. Jeśli są dwa, należy napisać
s+=*l?e[…]:0
zamiasts+=e[…]
, za dodatkową opłatą 5 znaków . Pisaniewhile(*gets(l))
byłoby krótsze, ale nie działa, ponieważ nie dołączam nagłówków, więc kompilator zakłada, że niegets
zwraca .int
char*
Wyrażenie haszujące
(l[11]%8^l[7])-97
zostało znalezione przez wypróbowanie wszystkich wyrażeń następujących formularzy, szukając tego o najkrótszej wynikowej długości kodu:Odpowiednia drukowana reprezentacja znaków ASCII została znaleziona przy użyciu podobnego wyszukiwania siłowego.
Python 3 (
743715 znaków)W tym samym duchu jak wyżej. Ten opiera się na drugiej nowej linii na końcu danych wejściowych.
źródło
Java - 1519 znaków
Aby znaleźć reputację, dodaje cały znak w ciągu wejściowym (przykład „dołącz do witryny” dodaje do formularza 1219), a gdy b == 1219, r = r + 1.
źródło
c
robi toif
sprawdzenie, czy zdecydowaćtrue
czyfalse
powinien zostać zwrócony gdzie jak taboolean
zif
mogą być zwracane bezpośrednio do doprowadzenia wielkości aż do 1470 roku ;) Zasugerowałem ulepszenie twojej odpowiedzi.Scala 1089
Przepisałem prawie od zera. Jeśli muszę obliczyć dane, tańsze (choć brzydkie) jest włączenie danych bezpośrednio.
Pierwsze podejście, czytanie cen zdarzeń i karty uprawnień z plików:
odczyt danych z pliku: 405
źródło
J (704)
Program składa się z czterech części:
następujący skrypt dekodera ( 277 bajtów)
plik słów binarnych, zwany
w
także 277 bajtami (pobierz tutaj ).Format pliku jest następujący: każde słowo jest kodowane jako grupa pięciobitowych „bajtów”. Każda grupa pięciu bitów może mieć wartość od
1
do27
reprezentowania liter lub0
bycia separatorem. Tutaj przechowywane jest każde unikalne słowo w opisie wydarzeń i uprawnień.plik binarny imprezy o nazwie
e
, która jest 54 bajtów (do pobrania tutaj ).Każde zdarzenie składa się z 12-bajtowej reputacji i jednego lub więcej 6-bajtowych słów. Na przykład
accept answer
jest kodowany w następujący sposób:plik binarny przywileje, o nazwie
p
, która jest 96 bajtów (do pobrania tutaj ).Format pliku jest taki sam, jak
e
np.access to moderator tools
Jest kodowany w następujący sposób:źródło
Perl,
856849 znakówtylko dodawanie podziałów wierszy po niektórych średnikach dla czytelności;):
źródło
Java (1470 znaków)
Uwaga: Jest to modyfikacja odpowiedzi Amana ZeeK Vermy ale ponieważ moja edycja nie została zaakceptowana, a moja odpowiedź jest znacznie krótsza niż jego, zamieszczam ją tutaj.
Wersja do odczytu:
Wersja zminimalizowana:
źródło
PHP: 676 znaków
Nie wygra żadnych nagród, ale do cholery, nie mogę po prostu dowiedzieć się, jak to zmniejszyć, więc po prostu opublikuję:
Ponieważ część, która calcs rep jest bardzo trudna do odczytania, tutaj jest z dodatkowym formatowaniem. Wykorzystuje niezdefiniowane stałe i używa @ do ich zamykania:
źródło
APL (549)
Ten pakuje dane w znaki Unicode.
źródło
Python 3.x (801 znaków)
Najlepsze, co mogę zrobić do tej pory, wystarczy wypracować lepsze kodowanie niż base64 (wskazówka: czy ktoś może pomóc?).
źródło