Na podstawie tego pytania Math.SE ; numer skopiowany z tej odpowiedzi . Oczywiście numer pochodzi z filmu Numberphile .
Twoim zadaniem jest wyprowadzenie następującej liczby pierwszej 1350-cyfrowej:
888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888111111111111111111111111888888111111111111111111111111888888111111811111111118111111888888111118811111111118811111888888111188811111111118881111888888111188811111111118881111888888111888811111111118888111888888111888881111111188888111888888111888888111111888888111888888111888888888888888888111888888111888888888888888888111888888111888888888888888888111888888811188888888888888881118888188811188888888888888881118881188881118888888888888811188881118888111888888888888111888811111888811118888888811118888111111188881111111111111188881111111118888111111111111888811111111111888811111111118888111111111111188881111111188881111111111111118888811118888811111111111111111888881188888111111111111111111118888888811111111111111111111111888888111111111111111111111111118811111111111111111111111111111111111111111111062100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Opcjonalnie możesz dołączyć znaki nowej linii do wyniku.
Zasady
- Jest to złożoność kolmogorowa , więc nie ma danych wejściowych.
- Twój program musi zakończyć się w ciągu godziny na standardowym komputerze - jeśli jest blisko, użyję mojego do testowania. Jeśli Twój program działa dłużej niż minutę lub nie kończy się w TIO, podaj czas na komputerze.
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
code-golf
kolmogorov-complexity
primes
Stephen
źródło
źródło
Odpowiedzi:
Galaretka ,
7471696866 bajtówWypróbuj online!
Jak to działa
Dosłownie
“©ạ-3ṗÇñ"ỤḍV8żṢ?ḤsMVE[,Ṃƭ"ḞÇsẇʂ(ụFsẠʂẆŀṣ’
zastępuje wszystkie znaki ich punktami kodowymi na stronie kodowej Jelly i interpretuje wynik jako (dwuskładnikową) liczbę podstawową-250, uzyskując następną liczbę całkowitą.Następnie
ḃ19
konwertuje tę liczbę na bazę dwusuwową 19, uzyskując następującą tablicę cyfr.Teraz
ĖŒṙ
wylicza cyfry i wykonuje dekodowanie długości przebiegu, uzyskując następującą tablicę.Następnie
ị⁾81
indeksuje do łańcucha 81 , zastępując liczby nieparzyste znakiem 8 , a liczbą parzystą znakiem 1 . Następnies30
dzieli wynik na fragmenty o długości 30. Wyświetlając jeden fragment na linię, wynik wygląda następująco.Teraz
m0
łączy tablicę fragmentów z odwróconą kopią samego siebie. NastępnieZ
zamyka wynik, transponując wiersze i kolumny.0
jest nieobliczalnym niladem, więc wynik z poprzedniej wypisywany jest (bez podziałów linii), a zwracana wartość jest ustawiona na 0 .62
jest kolejnym nieobliczalnym niladem, więc wypisywany jest wynik sprzed ( 0 ), a zwracana wartość to 62 .ȷ446
jest kolejnym nieporównywalnym niladem. 62 jest drukowane, a wartość zwracana jest ustawiona na 10 446 .Wreszcie
‘
zwiększa wynik. Wynik końcowy ( 10 446 + 1 ) jest drukowany po zakończeniu programu.źródło
[8, 1]
... Och, to sprytne! Kradnę tę sztuczkę, mam nadzieję, że nie masz nic przeciwko :))), a potem tak, dodaj te wszystkie dziwne rzeczy 06210..01. fajnie :)SOGL V0.12 ,
81787573 bajtówWypróbuj tutaj!
Wyjaśnienie:
źródło
Galaretka , 136 bajtów
Wypróbuj online!
Objaśnienie (numery skrócone)
-121 bajtów dzięki Dennisowi używającemu
“...’
literałów zamiast normalnych liczbźródło
“...’
literały oszczędzają sporo bajtów. tio.run/…0;6;2;1;
wydaje się okropnie nieprzyjemny.Galaretka ,
133 8473 bajtówWypróbuj online! (stopka formatuje liczbę dziesiętną o wymiarach określających herb).
W jaki sposób?
Długość kodowana w formacie binarnym lewej strony herbu
8
i1
do rzędu przed tym, który zaczął się0621
odbijać z0621
dodanym, a następnie pomnożonym przez 10 446 i inkrementowanym.źródło
Węgiel drzewny ,
10710498968779 bajtówWypróbuj online! Link do pełnego kodu wyjaśniającego
źródło
Proton , 368 bajtów
Wypróbuj online!
źródło
Rubinowy , 180 bajtów
Wypróbuj online!
178 bajtów + 2 bajty dla
-Kn
(wymusza kodowanie ASCII.)43 głównie niedrukowalne znaki pomiędzy pierwszymi cytatami. Hexdump:
W jaki sposób?
Wszyscy inni kodowali długość przebiegu, więc chciałem spróbować czegoś innego.
Sformatowaną wersję „obrazu” liczby pierwszej można podzielić na dwie części - siatkę 30x30 z 8 i 1 oraz drugą sekcję składającą się głównie z zer, które można zakodować na stałe. Koncentrując się na pierwszej części, zauważamy, że jest symetryczna w dół w środku, więc jeśli możemy wyprodukować lewą połowę, możemy po prostu wydrukować połowę każdej linii z jej odwrotnością.
Połowa jednej linii ma 15 znaków. Jeśli zamienimy 8 na zera, każdą linię można interpretować jako 15-bitową liczbę binarną. Dogodnie, w przeważającej części odległość edycji między kolejnymi liniami jest niewielka, dlatego zdecydowałem się zaimplementować moje rozwiązanie, przechowując pierwszą linię
s
(888888888888888
która właśnie staje się 0) i stosując serię operacji odwracania bitóws
, drukując wynik za każdym razem .Ponieważ każda linia ma 15 bitów długości, zakodowałem te operacje jako cyfry szesnastkowe - na przykład, jeśli operacja to
b
(lub 11), to odwracamy bit 11. Niektóre linie różnią się więcej niż jednym bitem, więc wymagają ciągu szesnastkowego cyfry Pozostał nam jeden bit (f
), więc możemy go użyć jako separatora między tymi ciągami, a także jako wartości „nic nie rób”. Przykład poniżej (możesz zobaczyć te linie w poście, do którego odnosi się pytanie):Aby umieścić to wszystko razem, chcemy zakodować
0123456789ab
, a następnie oddzielić sięf
, nic nie robić zf
, a następnie5
. Działa to, ponieważ zrobimy to.split(?f)
później, aby uzyskać każdy zestaw operacji według linii, co przyniesie["0123456789ab", "", "5"]
i""
nie będzie żadnego działania.Różnica między wierszami 3 i 4 powyżej jest zdecydowanie najdłuższym zestawem edycji, a odległość edycji między dowolnymi dwiema kolejnymi liniami wynosi zwykle 0-2, więc powiedziałbym, że to kodowanie jest dość niedrogie, chociaż jestem pewien, że może usprawniać się.
Cały zakodowany ciąg ma w końcu
fff0123456789abff5f6f7ff8f4f3f012fff8bfef7af69df458cf01237bf6af59f48f237f16f045f3f12f0
(86 bajtów), co pozwoli uzyskać całą siatkę 30x30. Ale jeszcze nie skończyliśmy ...Cyfry szesnastkowe mogą być reprezentowane przez 4 bity (
b
->1100
itd.) Oznacza to, że jeśli chcemy zakodować nasz ciąg 4 bity naraz, zamiast używać bajtów, możemy skrócić jego długość o połowę. Tak właśnie zrobiłem - zrzut heksowy pokazuje ciąg reprezentowany w 43 bajtach. Potem wystarczy użyć sprytnego ciągu Ruby # rozpakuj za pomocąH*
(interpretuj jako ciąg szesnastkowy, najpierw wysoki ciąg), aby rozwinąć 43-bajtowy ciąg do 86-bajtowej wersji, którą znamy i kochamy, i zapętlając każdy zestaw operacji przerzucanie bitów - dla naszego przechowywanego łańcuchas
i operacjic
wykonujemys ^ 2**c.to_i(16)
odwrócenie odpowiedniego bitu.Po zakończeniu każdego zestawu edycji wstawiamy wynikowy plik binarny do 15 bitów, przełączamy wszystkie zera z powrotem na 8 i wypisujemy wynik wraz z odwrotnością. Jak wspomniano wcześniej, część liczby po siatce 30x30 może być zakodowana na stałe, więc robimy to jako
puts'0621'+?0*445+?1
.Ostatecznie zakodowany ciąg nie ma możliwości pracy z TIO, więc wersja TIO używa znaków zmiany znaczenia, które nadal działają, ale są dłuższe.
źródło
Python 2 ,
760523329205196 bajtów-237 bajtów dzięki Stephenowi. -124 bajty dzięki Jonathanowi Frechowi.
Wypróbuj online!
źródło
8
a1
i łączenie621
621
. Dzięki!CJam,
532412340231210209 bajtówWypróbuj online
Kodowanie długości przebiegu rozszerzone z bazy 92 (baza 250 doprowadziła do znaków wielobajtowych, więc musiała się dostosować). Ponadto
4341089843357287864910309744850519376
jest rozszerzany z bazy 92 i konwertowany na binarny. 1 oznacza, że długość przebiegu składa się z dwóch cyfr, 0 oznacza jedną cyfrę. Na przykład pierwsze 4 cyfry reprezentacji binarnej to 1101, ponieważ pierwsze cztery przebiegi to[93,8],[24,1],[6,8],[24,1]
(93 8, 24 1 itd.)źródło
JavaScript,
454450332207204 bajtów-4 bajty dzięki Stephenowi. -125 bajtów dzięki Shaggy i Dom Hastings.
W tej odpowiedzi jest mnóstwo niezadrukowanych elementów, więc oto zrzut heksowy:
źródło
+'1'
ponieważ jest jużString
i+'0621'
może być+0+621
![...`]
wkurza mnieJavaScript (ES6),
206205204203198197194 bajtówPrzyszło mi to do głowy, pracując nad rozwiązaniem i cri everytim, doszedłem do wniosku, że jest on na tyle inny, że wymaga samodzielnego opublikowania.
Obejmuje to ładunek niedrukowalnych znaków między
]
i,
tak, a następnie kliknij łącze TIO poniżej, aby wyświetlić je ze znakami ucieczki Unicode (każda sekwencja\u
następujących po nich 4 cyfr liczy się jako 1 bajt).Wypróbuj online
źródło
MATLAB / oktawa ,
319318 bajtówTo moja pierwsza próba tego wyzwania. Nadal jest trochę duży i prawdopodobnie istnieją bardziej wydajne sposoby, ale pomyślałem, że i tak opublikuję go, ponieważ metoda była bardziej interesująca niż tylko skompresowanie.
Wypróbuj online!
Zastosowana tutaj metoda polega na użyciu pewnego rodzaju schematu kodowania przebiegu.
Zaczynamy od oryginalnego numeru i liczymy liczbę kolejnych cyfr. Są one zapisywane w poniższym wyniku jako liczba, po której następuje bezpośrednio cyfra (spacja oddzielona dla przejrzystości).
Jeśli którakolwiek z wartości jest większa niż 95, dzielimy ją na wiele kawałków po 95 lub mniej - dzieje się tak tylko w przypadku 445 0, które zamiast tego stają się czterema zestawami 95 0 i zestawem 65 0. Wypełniamy również liczby mniejsze niż 10 cyfrą 0, aby wszystkie elementy miały długość trzech znaków. Daje to po usunięciu spacji:
Z perspektywy czasu w tym momencie mogłem zrobić ten krok, zanim połączyłem to wszystko razem, ale czyż nie żyjesz i uczysz się. Robimy coś sprytnego, co polega na liczeniu dla każdej grupy (2 cyfry) i dodajemy 31. Ponieważ wszystkie mają <96, wynikowa liczba jest wartością ASCII dla drukowalnego znaku (32 do 126). Dając nam liczy:
Po drobnym przekształceniu w MATLAB-ie, aby uczynić go bardziej korzystnym do dekodowania, a następnie również
'
znakami ucieczki''
(w przeciwnym razie MATLAB dzieli tam literały łańcuchowe), pozostaje nam sprytny ciąg:To jest rdzeń kodu. W kodzie wszystko, co wtedy robię, to przekształcić tablicę w ciąg 2D z 128 parami znaków. Dla każdej pary pierwszy znak jest odejmowany 31, a następnie drugi znak jest wyświetlany tyle razy.
Rezultatem jest pierwotna liczba pierwsza:
Edycje:
źródło
05AB1E , 76 bajtów
Wypróbuj online!
Ukradł to od Dennisa:
Zauważyłem, że zawsze zmienia się między 8 a 1, więc policzyłem długości każdego biegu (Baza 20):
Połącz to wszystko razem i przekonwertowałem na liczbę całkowitą base-10:
Skompresowano go dalej do bazy-255:
Następnie, po utworzeniu skompresowanego bitu ... Musimy po prostu zmanipulować go z powrotem do oryginalnego ..
Końcowe wyjście:
źródło
C (gcc) , 277 bajtów
Mam wrażenie, że sznurek można jakoś skrócić.
Wypróbuj online!
źródło
Perl 5 , 307 bajtów
Wypróbuj online!
źródło
Bubblegum , 88 bajtów
Wypróbuj online!
źródło
Ruby , 194 bajty
Górna część jest zakodowana w RLE, reszta jest po prostu zakodowana na stałe.
Wypróbuj online!
źródło
Kotlin , 339 bajtów
Wypróbuj online!
źródło
CJam (
10881 bajtów)Demo online
W przypadku, gdy kodowanie znaków pomija powyższe, tutaj jest kodowane xxd:
Początkowy przebieg 8s i 1s jest podzielony tylko na lewą połowę, a długość przebiegu jest zakodowana jako długość odcinków naprzemiennych. Przebiegi o długości większej niż 24 są podzielone na przebiegi o długości co najwyżej 24, oddzielone przebiegami o wartości 0, dzięki czemu długości mogą być zakodowane w podstawie-25, a następnie zakodowane w podstawie-256, aby je spakować.
źródło
JavaScript (ES2017), 287 bajtów
Stosuje nieco inne podejście do odpowiedzi @icrieverytim . -10 bajtów dzięki sugestii @Shaggy'ego użycia
replace
zamiastmatch
!źródło
/// , 260 bajtów
Wypróbuj online!
Nic strasznie interesującego, tylko kompresja.
źródło
Mathematica, 192 bajty
Zobacz: http://reference.wolfram.com/language/ref/Compress.html
źródło
Python 2 ,
191190188 bajtówWypróbuj online!
Ta sama zasada, co moja odpowiedź tutaj
źródło