Kołmogorow złożony z łańcucha S jest zdefiniowana jako długość najkrótszego programu P, a wyjścia. Jeśli długość P jest mniejsza niż długość s, wówczas mówi się , że s jest ściśliwy , w przeciwnym razie s jest nieściśliwy . Większość ciągów jest nieściśliwa ...
Napisz najkrótszy program, który wypisuje ten ciąg (bez spacji i bez nowego wiersza):
d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94
Dane wyjściowe powinny wyglądać następująco:
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294
Uwaga: wprowadzanie danych przez użytkownika jest zabronione, nie ma dostępu do sieci ani bibliotek (z wyjątkiem tych wymaganych do drukowania danych wyjściowych).
Edycja I: sekwencja wydaje się losowa ... ale okazuje się, że jest bardzo ściśliwa, obsługując trochę liczb pierwszych ...
Edycja II: Dobra robota! Przejrzę odpowiedzi w ciągu najbliższych godzin, a następnie przydzielę nagrodę. Oto mój pomysł, jak to rozwiązać:
- Jeśli spróbujesz skompresować dane, nie odejdziesz daleko ...
- W Internecie można znaleźć (dobrze znaną?) Encyklopedię sekwencji całkowitych (OEIS);
- próba pierwszych cyfr szesnastkowych
d9, a6, b6, 33, ...
(lub ich reprezentacja dziesiętna) nie daje rezultatu; - ale jeśli przekonwertujesz liczby na binarne (
1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0
) i przeszukasz je w OEIS, otrzymasz ten wynik . - Jak zauważył Claudiu, podałem również małą wskazówkę w pytaniu (Edytuj I powyżej) ... :-)
Zwycięzcą jest : Peter Taylor (GolfScript, 50), ze specjalnym wyróżnieniem dla Claudiu (Python, 92), który jako pierwszy „rozwiązał” ten problem.
źródło
Odpowiedzi:
GolfScript (50 bajtów)
Ponieważ wszyscy inni ujawniają teraz swój kod, uprzedzę również prośbę OP o cofnięcie kopii:
Przegląd sekcji
38200,{:x,{)x\%!},,2=},
4/
p
dop&2 != 0
i zrobić bazę-2-16 do podstawy konwersji:{3\{2&!!1$++}/.57>39*+}%
(to gdzie są ciekawe sztuczki)+
Bardziej szczegółowy przegląd konwersji podstawowej
Biorąc pod uwagę stos zawierający pusty ciąg i listę liczb pierwszych, musimy wykonać dwie konwersje:
Istnieje wiele równie długich sposobów na zrobienie 1; na przykład
lub nawet
Dla 2 oczywiste jest podejście
Ale baza jest długim słowem, a ponieważ 16 = 2 4 , możemy z łatwością zapisać kilka znaków
Najbardziej oczywistym marnotrawstwem jest 18 znaków poświęconych temu ciągowi. Chcemy tylko funkcji od cyfry do kodu ASCII. Chcemy zmapować
0
do'0' = 48
, ...,9
do'9' = 57
,10
do'a' = 97
, ...15
do'f' = 102
.Ale teraz wrzuć do miksu zakaz
base
. Musimy to sami wdrożyć. Oczywistą implementacją (w tym łatwym kierunku) jestk base
fałdowanie{\k*+}*
. Nieco dłużej alternatywą jest prosta iteracja, która potrzebuje sprawę podstawową:0\{\k*+}/
. Baza 2 jest nieco wyjątkowa:1$++
odpowiada\2*+
tej samej długości i podjąłem takie podejście.Oba są dłuższe niż 5-char
2base
, ale ponieważ teraz iterujemy nad wartościami, możemy pobrać część 1, aby uzyskać pojedynczą pętlę. Zastępujemyz
dla miłego oszczędzania 1 znaku, lub
za stratę 1 char.
Ale chociaż utrata 1 znaku wygląda jak krok wstecz, zastanów się, co stanie się z tym 0. Jest pomnożona przez 16 i dodana do wyjściowego wyniku konwersji. Ostatnią rzeczą, jaką robimy, jest dodanie wielokrotności 16 do wyniku. Możemy więc połączyć oba jako
Najkrótsza stawka i sprytna premia sprawiają, że jest bardziej interesująca.
źródło
base
? Wszystkie pozostałe rozwiązania wykorzystują równoważne (zastosowania w kopalni, zastosowaniahex
w C, zastosowaniaprintf("%x")
w HaskellshowHex
)base
jest dłuższe niż to, ponieważ większość optymalizacji przeprowadziłem po wyjaśnieniu, że nie mogę jej użyć.base
daje mi wartość od 0 do 15, więc nadal potrzebuję trochę pracy, aby przekonwertować0-9a-f
.base
W pewnym momencie mogę wrócić do używania , ale nie dzisiaj.Python, 92 znaki
Oto panie i panowie, sam kod!
Marzio zostawił sprytną wskazówkę, mówiąc, że „okazuje się, że jest bardzo ściśliwy, obsługując trochę liczb pierwszych”. Byłem pewien, że „trochę” nie zostało przypadkowo napisane kursywą, więc przekonwertowałem łańcuch szesnastkowy na kawałki i próbowałem znaleźć wzory. Myślałem, że na początku reprezentuje wszystkie liczby pierwsze jako kawałki i łączy je razem, ale to nie wyszło. Potem może wziąć tylko kilka cyfr lub upuścić wszystkie zera w ciągu bitów - wciąż nie. Może to ciąg bitów najmniej znaczącego z pierwszych kilku liczb pierwszych? Nie do końca. Ale w końcu znalazłem ten, który zadziałał - jest to ciąg bitów drugiego najmniej znaczącego bitu z pierwszych jednak wielu liczb pierwszych.
Mój kod właśnie to robi: generuje wystarczającą liczbę liczb pierwszych, bierze drugi bit każdego (
i/2%2
), konkatenuje je jako ciąg binarny, a następnie przekształca na base-10 (int(..., 2)
), a następnie na base-16 (hex(...)
).źródło
Haskell, 105
Skrót SHA1:
a24bb0f4f8538c911eee59dfc2d459194ccb969c
Wydajność:
Edycja: Kod:
Przegapiłem zasadę o nieużywaniu żadnych funkcji bibliotecznych oprócz drukowania (putStr). Zakładam, że operatory matematyczne, chociaż są technicznie funkcjami, są dozwolone.
źródło
C,
136116109103 znakówOK, oto mój wysiłek:
źródło
printf
zwraca liczbę zapisanych znaków, która zawsze jest tutaj niezerowa, możesz użyć!printf(...)
zamiastprintf(...)*0
zapisać jeden znak.JS, 764
jeśli weźmiemy ten ciąg za base64, możemy mieć mniejszą wersję przy użyciu wersji innej niż base-64:
Myślę jednak, że autor chce, abyśmy zamiast tego znaleźli logikę tego nieprzypadkowego ciągu.
źródło
Mathetmatica - 56
Tajemnica jest już rozwiązana, więc wystarczy wdrożyć ten pomysł
źródło
J - 46 znaków
Nie przejmuj się mną, po prostu loguję tutaj J golfa dla potomności. Nie był wystarczająco sprytny, aby wymyślić sztuczkę.
Wyjaśnił:
p:i.1007 4
- Stwórz 1007-rzędową, 4-kolumnową macierz liczb całkowitych od 0, a następnie weź liczby pierwsze odpowiadające tym liczbom całkowitym. Tak,p:
jest wbudowany w J. Tak, brakuje nam czterech liczb pierwszych.2|<.-:
- Przekrój każdą liczbę (-:
), wstaw ją (<.
) i weź ten moduł 2 (2|
). Jest to to samo, co znaczące zwiększenie wartości umowy najmu.#.
- Konwertuj każdy wiersz wyniku z podstawy 2 na liczbę całkowitą. To daje nam 1007 liczb od 0 do 15 włącznie.'0123456789abcdef'{~#.
- Weź każdy wiersz tej macierzy bitów jako binarny dla liczby i użyj tej liczby, aby wybrać z listy cyfr szesnastkowych. Konwertuje to co cztery bity na heks.1!:2&4
- Interpreter J ma problem z wyprowadzaniem ciągów dłuższych niż 256 znaków, więc musimy wysłać te dane bezpośrednio na standardowe wyjście. Niektóre wygrywasz, niektóre tracisz.4[
- Na koniec odrzuć wynik1!:2
i zamiast tego wypisz brakujące 4 z wyjścia. Robimy to, ponieważ jest krótszy niż uwzględnienie ostatnich czterech liczb pierwszych i zwrócenie tutaj pustego wyniku.źródło
JS, 503
Zgodnie z pomysłem @xem:
źródło
Mathematica, 55
Testowane na Mathematica 8. Wykorzystuje to dwie obserwacje:
FromDigits
tak naprawdę nie sprawdza zakresu podanych cyfr, więc jeśli zastosujesz go do listy formularza,{2,0,2,2,0,...}
otrzymasz tylko dwa razy wynik, jakbyś się o to ubiegał{1,0,1,1,0,...}
. Ale to jest dokładnie forma wygenerowana przezBitAnd
połączenie liczb pierwszych z 2.źródło