Twoim zadaniem jest stworzenie najdłuższego okresu iteracji , w którym długość każdego programu w sekwencji jest ograniczona przez 500 bajtów.
Oznacza to, że jeśli powtórzysz następujące kroki:
- Zacznij od pierwszego programu
- Uruchom bieżący program
- Wróć do kroku 2
W końcu wrócisz do swojego oryginalnego programu. Liczba programów w cyklu to Twój wynik, który próbujesz zmaksymalizować.
Żaden z programów nie może zgłaszać żadnych błędów. Każdy program musi być również uruchomiony w ten sam sposób (np. Nie ma różnych wersji, implementacji, opcji kompilatora, platform itp.) (EDYCJA: Tak, każdy stan zewnętrzny, taki jak generator pseudolosowych liczb, został uwzględniony w ostatnim instrukcja. Stan zewnętrzny musi być „resetowany” po każdym uruchomieniu. Jeśli używasz prawdziwych liczb losowych, przyjmuje się, że najgorszy przypadek.
Tym, co odróżnia to wyzwanie od najdłuższego okresu iteracji quine (innego niż 100 vs 500) jest to, że każdy program w cyklu musi mieć również 500 bajtów lub mniej. Oznacza to, że najdłuższy możliwy cykl to (256 ^ 501 - 1) / 255 lub mniej. To oczywiście duża liczba, ale nie tak duża pod względem ilości kodu potrzebnej do obliczenia. Wyzwanie polega więc na wykorzystaniu jak największej liczby (256 ^ 501 - 1) / 255 możliwości, a nie na zajęciu bobra.
Programy nie mają dostępu do własnego kodu źródłowego. Jednak pusty program jest dozwolony, jeśli chcesz (pod warunkiem przestrzegania innych zasad).
Ponieważ ręczne sprawdzanie programów byłoby trudne, możesz ustalić wynik przy użyciu metod teoretycznych. Do swojego programu musisz dołączyć wyjaśnienie wyniku i poprawności. Jeśli nie możesz ustalić wyniku, możesz zamiast tego użyć dolnej granicy liczby programów w cyklu jako wyniku defacto. Możesz to aktualizować, gdy znajdziesz lepsze dolne granice lub jeśli znajdziesz dokładny faktyczny wynik.
To jest wyzwanie kodowe , więc najwyższy wynik wygrywa!
EDYCJA: Zaleca się zapisanie wyniku w notacji naukowej, aby odpowiedzi były łatwiejsze do porównania. Zupełnie dobrze jest mieć również inne formy partytury, szczególnie jeśli są one wyraźniej powiązane z twoim programem. Zachęcamy również czytelników do edycji poprzednich odpowiedzi w celu zapewnienia zgodności z tym.
źródło
Odpowiedzi:
Perl 6 ,126398≈ 8,86 × 10835 iteracji
Wypróbuj online!
Powtarza to wszystkie możliwe kombinacje pierwszych 126 bajtów o długości 398 i mniejszych (z wyłączeniem ciągów z wiodącymi bajtami NUL). Jeśli chcesz zobaczyć, że faktycznie powraca do pierwszej iteracji, możesz zmniejszyć długość do 1, zmieniając limit w ten sposób .
Wyjaśnienie:
Każda iteracja zwiększa ciąg, przechowywany w formie podstawowej 126, a następnie przekształca go z powrotem w podstawę 126. Robi to, dopóki nie osiągnie ciągu o długości 399, a następnie resetuje ciąg ponownie z powrotem do opróżnienia. Jeśli masz problem z konceptualizacją liczby, wyobraź sobie, że ma ona dziesięć bajtów. Zaczynając od104 - 1 iteracji (włączając
0
, zwiększ maksymalnie 4 cyfry1000
i zresetuj. To jest0
lub pusty ciąg w przypadku mojego programu).źródło
Runiczne Zaklęcia ,
64654 106; 122 387 -1 ≈ 2,638 × 10 807 iteracjiWypróbuj online!
Alert:
€
Niepoprawnie wyświetlane, powinno być `` (0x80).Zamiast stosu należy użyć ciągu, a operatorzy stosu zmodyfikowali za pomocą,
͍
aby zmodyfikować ciąg zamiast stosu (patrz poprzednia wersja). Jako taki, każdy znak jest ograniczony do 1 bajtu (zakres 0-127, minus problematyczne znaki), ale z ponad 3-krotnie większą liczbą (ze względu na mniejszą liczbę przetwarzanych znaków z powodu braku konieczności pomijania znaków łączących Unicode, ponieważ oraz inne oszczędności bajtów) osiąga większą liczbę iteracji.Jeśli dozwolone jest kodowanie jako prawdziwy duży endian (tzn. Posiadanie wartości bajtów powyżej 127 bez wstawiania
0x00
bajtów), można osiągnąć iteracje 251 387 -1 ≈ 4,717 × 10 928 . Jednak łacińskie kodowanie TIO zapobiega temu, jak zauważył Erik the Outgolfer w swojej odpowiedzi na Python 2. Musiałbym sprawdzić, czy to działa lokalnie, zanim zaczniesz uzyskiwać ten wynik.Powinien być w stanie wymienić
f1+0B
z'0B
(Jest takie unprinting0x16
tam), ale walczy mnie (co nie chciała oddziale / SKIP / zwrotu poprawnie), więc zostawiłem go w spokoju. Podniosłoby to strukturę big-endian z 387 do 388.źródło
DOS COM, 49 bajtów, okres 2 ^ 3608
Oryginalny zespół do utworzenia:
Ten mały klejnot zapisuje kolejną fazę na q.com zamiast standardowego wyjścia z powodu wartości zerowych i innych rzeczy, których terminal nie może obsłużyć. Technika root quine jest równoważna z rygoryzacją, a pokój danych jest wykorzystywany jako licznik 3608 bitów. Ze względu na sposób działania DOS, początkowy stan licznika zawiera zanieczyszczenia z wszystkiego, co było w pamięci przed jego pierwszym uruchomieniem.
Oryginalne 49 bajtowe dane wejściowe są nieosiągalne, więc jeśli chcesz uzyskać wynik w postaci 500 bajtów.
źródło
C # (interaktywny kompilator Visual C #) , flagi:
/u:System.Numerics.BigInteger
i/r:System.Numerics
Wynik: 10 332
Dzięki JoKing, który zwiększył mój wynik z 10 255 * 2 - 1 do teraz!
Wypróbuj online!
Wyjaśnienie
Zwiększa wartość BigInteger w każdej iteracji, dopóki jej długość nie stanie się zbyt duża, co w takim przypadku natychmiast przywracamy do pierwotnej liczby.
źródło
Zauważ, że jest nowy znak końca. Może zostać usunięty powyżej, jeśli wtargnie do niego wyróżniacz składni.
Niestety nie można uruchomić tego programu w TIO, ponieważ jest on zakodowany w Latin-1.
Powyżej
s
zawiera 219 0x01 bajtów. Po uruchomieniu programu jego źródło jest drukowane, z wyjątkiem jednej różnicy:s
zostało zwiększone jak podstawowa liczba big-endian 252, więc jego lewy znak został „zwiększony” do 0x02. Unikane są bajty 0x00, 0x22, 0x25 i 0x5C, więc jeśli dowolny znak ciągu stanie się jednym z tych po inkrementacji, sam znak zostanie ponownie zwiększony."
): Istnieje niebezpieczeństwo, że w rzędzie utworzą się trzy bajty 0x22"""
, czyli ostatni znak łańcucha stanie się"
, więc łańcuch zostanie przedwcześnie zamknięty.%
): formatowanie ciągów podobnych do printf jest używane przed ukończeniem szkieletu quine, więc%
nie sąsiadowanie z innym%
ws
spowoduje problemy. Niestety nie można zmienić kolejności formatowania, aby uniknąć tego zastrzeżenia.\
): Istnieje możliwość\
użycia znaku ucieczki w ciągu zamiast dosłownie, więc można go uniknąć.Dlatego można użyć 252 z 256 bajtów. Jeśli
s
zawiera 219ÿ
bajtów 0xFF ( ), jest po prostu przywracany do 219 bajtów 0x01, co kończy cykl.źródło
251 39usunięto zależność odText
251 122golfowa funkcja inkrementacji251 128połączonych ciągów źródłowych przedrostka i przyrostka251 188usunięto zależność odGast.GenLibTest
Prezentowane w formacie XXD z powodu niedrukowalności / nieprawidłowego UTF-8:
Wypróbuj online!
Zwiększa ciąg 226-bajtowy przez wszystkich wartości bajtowych wyjątkiem
\0
,\n
,\r
,'
i\
.Powodem, dla którego unikamy tych znaków, jest:
\0
denerwuje kompilator\n
i\r
nie może pojawić się na listach charlistów'
zakończyłby listę znaków\
może powodować problemy, jeśli pojawi się przed postacią ucieczkiGdy łańcuch jest już
\377
s, zawija się do wszystkich\001
s, dając oryginalny program.źródło
C2 80
. Czy to samo, co zachowanie na twoim komputerze lokalnym?Gol> <> , 70 bajtów, 39039000 iteracji
Wow, to o wiele mniej niż myślałem, że będzie ... Następny krok! Dzięki temu ma więcej iteracji !!!
Wypróbuj online!
źródło