Mówiąc najprościej, Twoim celem jest stworzenie kompletnego programu, który modyfikuje swój własny kod źródłowy, dopóki każda jego postać nie będzie inna niż początkowo.
W swoim poście umieść źródło początkowe oraz źródło końcowe, a także opis. Np. Opisz, co (jeszcze) robi twój program, używany język, twoja strategia itp.
Zasady
- Twój program musi się zatrzymać po zakończeniu modyfikacji.
- Musi faktycznie zmodyfikować własny, aktualnie działający kod źródłowy (niekoniecznie plik przekazany do interpretera, modyfikuje instrukcje), nie może drukować nowego programu ani pisać nowego pliku.
- Standardowe luki są niedozwolone.
Najkrótszy program wygrywa.
Jeśli twój język może modyfikować własny plik i wykonać nowy proces kompilatora, ale nie może modyfikować własnego (aktualnie działającego) kodu źródłowego, możesz napisać taki program zamiast kary + 20% bajtów, w zaokrągleniu w górę. Prawdziwe samomodyfikujące się języki powinny mieć przewagę.
Edycja : jeśli Twój program zatrzymuje się z błędami, określ go jako taki (i może powiedz, jakie są błędy).
źródło
Odpowiedzi:
/// , 1 bajt
Program znajduje
/
(początek grupy zastępującej wzorce) i usuwa ją w ramach przygotowań do wykonania zamiany. Potem osiąga EOF, więc poddaje się i zatrzymuje.źródło
Labirynt , 2 bajty
Do
>
obraca źródło tak, że staje sięWskaźnik instrukcji znajduje się teraz w ślepym zaułku i odwraca się, aby nacisnąć ten,
@
który kończy program.Oczywiście
<@
też by działało.źródło
Python 2, 225 bajtów
Końcowy kod źródłowy to ciąg
"0"
s, którego długość jest równa liczbie bajtów w oryginalnym skompilowanym obiekcie kodu.Kod znajduje działający obiekt kodu
sys._getframe().f_code.co_code
i tworzy strukturę, która reprezentuje obiekty łańcuchowe Pythona. Następnie pobiera pamięć, którą kod faktycznie zajmuje i zastępuje ją"0"*len(c)
.Po uruchomieniu program kończy działanie z następującym śledzeniem:
To pokazuje, że nadpisanie zakończyło się powodzeniem, a program umiera, ponieważ
0
nie jest prawidłowym kodem operacji.Dziwi mnie, że jest to nawet możliwe w Pythonie, obiekty ramek są tylko do odczytu, nie mogę tworzyć nowych. Jedyną skomplikowaną rzeczą jest zmiana niezmiennego obiektu (łańcucha).
źródło
"1"
ciąg znaków w kodzie nie jest tak naprawdę częścią „kodu”, a jedynie stałą, do której odwołuje się kod bajtowy. To, co tak naprawdę zmieniam, to skompilowane kody maszyn wirtualnych Pythona, a nie stałe i zmienne. Więc zmieniam nie kod źródłowy, tylko skompilowany kod. Mógłbym zmienić kod źródłowy jako przechowywany, ale tak naprawdę nie wpłynie to na kod w czasie wykonywania, ponieważ zostałby już skompilowany. Jeśli chcesz, mógłbym opublikować to w „skompilowanych kodach Pythona ze stałymi”, ale byłoby to głupie IMO."1"
się<backtick>1+1<backtick>
na tylko 2 więcej bajtów1+1
z mojej sugestii zmienia się2
w skompilowaną wersję ... Kompilator jest zbyt inteligentny dla własnego dobra!zło , 1 bajt
zło ma kilka magazynów pamięci - jeden to sam kod źródłowy, a drugi to koło, które jest kolistą kolejką, która jest inicjowana do pojedynczego zera.
q
zamienia kod źródłowy i koło, więc zamienia źródło na bajt zerowy. Jednak tylko małe litery są prawdziwymi operatorami zła, więc znak jest po prostu nieobecny, a program się kończy.źródło
MSM , 8 bajtów
Przekształca kod źródłowy na
pqpqpqpq
MSM działa na liście ciągów. Polecenia są pobierane z lewej strony i traktują prawą stronę jako stos. MSM zawsze działa na własnym źródle.
Śledzenie wykonania:
źródło
Malbolge, 1 lub 2 bajty.
Język Malbolge „szyfruje” każdą instrukcję po jej wykonaniu, więc ta litera (Malbolge NOP) stanie się
!
(która jest również nop), a następnie zakończy się. Z jakiegoś powodu interpreter Malbolge, którego używam, wymaga dwóch bajtów do uruchomienia, co dajeDC
(oba są nops) staje się!U
(oba są również nops)Edycja: Początkowy stan pamięci Malbolge zależy od dwóch ostatnich znaków w kodzie, więc nie jest dobrze zdefiniowany dla programów jednoznakowych. (Chociaż ten kod nie dba o początkowy stan pamięci)
źródło
x86 asm - 6 bajtów
nie jestem pewien, czy „dopóki każda postać źródła nie będzie inna niż to, co się zaczęło jako” odnosi się do każdego bajtu, każdej nemonicznej lub ogólnej modyfikacji. jeśli jestem nieważny, mogę zmienić XOR na XOR Rep, więc każdy bit zmienia wartości, ale miałem nadzieję, że nie zrobię tego, aby zaoszczędzić 6 bajtów, aby pozostać co najmniej trochę porównywalnym z tymi specjalnymi językami golfa.
Wszystko to polega na zmianie c2 na c3 retn poprzez uzyskanie adresu eip na żywo i xoring 5 bajtów z przodu.
źródło
SMBF , 92 bajty
Można grać w golfa, i prawdopodobnie będę pracował nad tym później.
Wyjaśnienie
Program generuje następujące polecenia na końcu taśmy, aby się skasować, dlatego musi wygenerować następujące wartości na taśmie:
Zrób pęczek
91
s, z zerami (pokazanymi jako_
) pomiędzy, aby użyć dla wartości temp.Dostosuj wartości według różnic
Taśma po wykonaniu będzie zerami, z wyjątkiem wygenerowanego kodu
[_[_-_]_<_]
.Uwaga:
Ten program uświadomił mi, że mój interpreter Pythona dla SMBF ma błąd lub dwa,
a ja nie znalazłem jeszcze poprawki.Teraz jest naprawione.źródło
Emacs Lisp 22 bajtów
Uruchom z REPL:
Funkcja ocenia teraz na
nil
.Na przemian (cofnij wiązanie) 30 bajtów
Ocenić i błędy jak
void-function
. Funkcja istniała przed uruchomieniem.źródło
Redcode , 7 bajtów, 1 instrukcja (tylko przykład. Nie konkuruje)
To jest trywialny przykład.
Przenosi następną lokalizację pamięci na siebie, a następnie zatrzymuje się (ponieważ cała pamięć jest inicjowana
DAT 0 0
, co powoduje zatrzymanie programu po uruchomieniu).źródło
Powershell 65 bajtów
Zdefiniuj funkcję, która przepisuje się na zero.
Oceń to raz i sam się wyeliminuje.
Na przemian (usuwa się z pamięci) 36 bajtów
Wywołanie go najpierw usuwa, a następnie podejmuje próbę oceny rekurencyjnej. Wystąpił błąd jako nieznane polecenie.
źródło
MIESZALNY, 6 bajtów (licząc 2 karty)
Program rozpoczyna się w miejscu pamięci 0, a następnie zapisuje 0 w miejscu pamięci 0, usuwając się w ten sposób. Maszyna zatrzymuje się automatycznie.
To jest język asemblera dla hipotetycznego komputera MIX Donalda Knutha, który można złożyć i uruchomić za pomocą zestawu programistycznego GNU MIX ( https://www.gnu.org/software/mdk/ ).
źródło
> <> ,
403430 bajtówWypróbuj tutaj!
Wyjaśnienie:
Zasadniczo umieszcza na stosie 3 bloki znaków: (ypos, xpos, znak ASCII), który jest odwracany na końcu, więc końcowe polecenie „p” czyta (znak, xpos, ypos) i ustawia tę pozycję w kod do tego znaku. Pierwszy znak jest ręcznie ustawiany jako „<”, dzięki czemu kod kończy się na „> p <” na końcu, aby zapętlić polecenie. Następnie każda inna postać jest nadpisywana jako „”, w tym znak p. „” To tak naprawdę „ASCII CHAR 0”, który NIE jest NOP i spowoduje błąd podczas odczytu.
Musi także istnieć nieparzysta (?) Liczba znaków przed poleceniem „p”, w przeciwnym razie nie zostanie ona zapętlona z powrotem do ostatniego razu i nadpisana.
źródło
Partia, 11 bajtów
Zmienia kod źródłowy na
ECHO is on.
@
Ma więc polecenie nie jest echem, ale przede wszystkim dlatego obaecho
s nie w kolejce.źródło
@
mogą być usunięte, ponieważECHO
(litera)! =echo
(małe litery)echo
s nie mogą ustawiać się w szeregu.Jolf, 4 bajty, niekonkurujące
Spowoduje to
₯S
przekazanie₯C
wartości elementu ody do danych wejściowych,undefined
ponieważ żaden nie jest podany. Wypróbuj tutaj!źródło
(System plików) Befunge 98, 46 bajtów
Pamiętaj, że ten program tworzy plik o nazwie i manipuluje nim
a
. Jak to działa:a
zawierający cały kod (do 256 znaków w każdym wymiarze) przesunął jedną spację w górę i dwie lewe.a
jeden wiersz, zastępując cały pierwszy wiersz zawartościąa
pliku.a
plik do drugiej linii przesunął dwa miejsca w prawo.Jako efekt uboczny końcowy kod źródłowy nie jest nawet prawidłowy Befunge! (ponieważ zawiera znaki nowej linii jako dane w jednym wierszu)
źródło
Python 2, 238 bajtów + 20% = 285,6
Zasadniczo przełącza to bieżące kodowanie pliku źródła Pythona pomiędzy
ascii
iutf-8
, w ten sposób zasadniczo zmieniając każdy znak źródła!źródło
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.