Napisz program, który pobiera program do pieprzenia mózgu i kompiluje go do wykonywalnego kodu maszynowego. Możesz kierować na x86, x86_64, jvm (java bytecode) lub armv6 i używać jednego z następujących formatów wykonywalnych: ELF, a.out, plik klasy, exe, com. Plik wykonywalny powinien działać w systemie Linux lub Windows (lub Java na każdym z nich).
Ani twój program, ani wygenerowany plik wykonywalny nie mogą uruchamiać żadnego programu zewnętrznego (takiego jak inny kompilator, asembler lub interpreter).
Najkrótszy kod wygrywa.
Odpowiedzi:
C,
866783 bajtówPonieważ mój kod wyświetla 32-bitowy plik ELF, nie mogę obiecać, że będzie działał na każdym urządzeniu. Wymagało to dostrojenia, aby plik wykonywalny przestał działać na moim komputerze.
Dla każdego, kto próbuje to uruchomić:
Program Brainfuck jest odczytywany ze standardowego wejścia, a skompilowany plik ELF jest zapisywany na standardowym wyjściu.
Nie golfił
W nie golfowej wersji kodu możesz lepiej zrozumieć, co się dzieje. Tablica znaków na końcu golfowego kodu jest kodowaniem ELF i nagłówka programu w niemodyfikowanym kodzie. Ten kod pokazuje również, jak każda instrukcja Brainfuck jest tłumaczona na kod bajtowy.
Samo modyfikujący BrainFuck
Aby zaoszczędzić na bajtach, taśma mojego kompilatora nie jest przydzielona do żadnej
.bss
sekcji ani niczego podobnego. Zamiast tego taśma ma 30 000 bajtów zerowych zapisywanych bezpośrednio po skompilowanym kodzie bajtów programu Brainfuck. Wiedząc o tym i wiedząc, jaki kod bajtowy jest generowany przez mój kompilator, możesz wygenerować lub zmodyfikować kod bajtowy w czasie wykonywania. Prostą ilustracją tej „funkcji” jest program Brainfuck, który ustawia własną wartość wyjścia.Program schodzi z lewej krawędzi taśmy do kodu bajtowego do punktu, w którym kod wyjściowy jest normalnie ustawiony na 0. Zwiększenie tego bajtu powoduje, że kod wyjściowy jest ustawiany na 1 zamiast 0, gdy program w końcu kończy działanie. Z uporem można to wykorzystać do programowania na poziomie systemu w Brainfuck.
źródło
long long int
zamiastchar
. Zdecydowanie jest dla mnie pole do gry w niektóre z moich zmiennych deklaracji. Zobaczę, ile mogę tam dostać i zaktualizuję swoją odpowiedź.Python, 1974 znaków
Poniżej znajdują się tłumaczenia na kod bajtowy Java. lokalne 0 to tablica bajtów reprezentująca taśmę, lokalne 1 to wskaźnik danych.
xx xx
Są offsety dotarcia wspornik dopasowanie. # 2 toSystem.in
, # 3 toread()
, # 4 toSystem.out
, # 5 towrite()
i # 6 toflush()
.Preambuła przydziela tablicę 30000 bajtów i inicjuje pozycję taśmy na 0.
Gigantyczne opakowanie na końcu zostało wygenerowane przez skompilowanie fikcyjnego
B.java
pliku z kodem dla jednego z każdego kodu operacyjnego (w celu wywołania generowania poprawnych stałych tabel i innych śmieci), a następnie wykonanie na nim delikatnej operacji.Uruchom to jak
Zdemontować za pomocą
Jestem pewien, że można by jeszcze trochę zagrać w golfa. Cieszę się, że to działa ...
źródło
16-bitowy kod zestawu x86, 104 bajty
Ten kod pochodzi z 2014 roku, ale właśnie znalazłem zadanie.
źródło