Język programowania dowolny (znaczy Pascal, C, Java, asm, Haskell).
Cel: napisać program, który wypisze swój kod źródłowy.
Trudność: nie można korzystać z żadnych plików czy zasobów :)
Tzn, ma wyświetlić kod np. w pascalu, czy tylko w assemblerze? Bo to pierwszejest raczej niemożliwe bez żadnego osobnego dołączenia tegoż kodu. No, nie mówię oczywiście o czymś w rodzaju:
ShowMessage('ShowMessage(''ShowMessage(''ShowMessage(itd...)'')'')');
:-P
W tym samym języku, w jakim napisałeś program :)
Dryo: nie podawaj im odpowiedzi :)
http://www.256b.com/demo.php?demoId=195
W języku wysokiego poziomu jest to awykonalne.
i pisz normalne tematy [diabel]
Język dowolny powiadasz, a maszyna? Może być BASIC na C64? Tam chyba można było LIST wrzucić:)) (ale nie mam pewności) - tylko to był raczej interpreter:) Aaa... i w JavaScript i większości języków interpretowanych na upartego pewnie można by było:p
Marooned: jest wykonalne. Nawet bardziej niz w asm. Nie bez powodu Vogel podal w przykladowych jezykach Haskell. Jezyki funkcyjne idealnie sie do tego nadaja. Jak juz kiedys wspominalem pierwszym kompilatorem byla funkcja napisana w LISPie kompilujaca programy w LISPie. Analogicznie jest z tymi programikami. Maja one swoja nazwe... ale nie bede podawal bo zepsuje konkurs (chcialem naprowadzic was, ale niestety tam byly linki do gotowych programow :( ).
Krecik: nie mozna wykorzystywac LIST z basica. Zabroniony jest odczyt kodu zrodlowego (czyli np. napisanie programu, zapisanie zrodla na dysk i odczytanie go). LIST jest analogiczna instrukcja wczytujaca tylko ze z pamieci.
//hmm - chodziło mi raczej o Pascal/C++ etc. ;) - m.M
A Js może być ?
Bo w Js to bardzo proste :d
alert(document.getElementsByTagName('HTML')[0].outerHTML)
A Js może być ?
Bo w Js to bardzo proste :d
alert(document.getElementsByTagName('HTML')[0].outerHTML)
Ale w ten sposob odczytujesz zrodla strony, dlatego jest to niepoprawne, tak samo jak LIST z Basic'a. Chodzi o "stworzenie" kodu. Czyli moze on powstawac np. za pomoca jakies suerinteligentnego programu generujacego inny program (tzn. samego siebie) albo miec w kodzie gdzies jakis lancuch znakow zapisany, ktory bedzie identyczny z kodem programu. Problemem w niektorych jezykach jest koniecznosc zachowania formatowania (np. w TP mialem problem ze zbyt dlugim stringiem :/).
Juz chyba dosc podpowiedzialem. Wiecej to musialbym juz umiescic kod.
W Assemblerze by się chyba dało takim sposobem: znaleźć napisany w ASM dekompilator ASM, przerobić tak, żeby od razu brał się za siebie i wypisywał wynik, kilka razy przemaglować go kolejno przez jego samego i kompilator, żeby w końcu nie było żadnych rżnic wywołanych optymalizacją i tyle tego. Wypisze własne źródła.
Ewentualnie można zrobić plik EXE składający się z samego nagłówka - kodu źródłowego nie ma, więce nie ma czego wypisywać - program nie robi nic, natychmiast się zamyka. W pełni zgodne z zasadami, Vogel nie napisał, że są jakieś ograniczenia rozmiaru kodu :P :D :D :D
żeby w końcu nie było żadnych rżnic wywołanych optymalizacją i tyle tego.
Dlatego trzeba uzyc popularnie nazywanych "pure assembler", czyli generujacych kod taki jak uzytkownik sobie zazyczy, a nie co kompilator uzna za lepsze (np. FASM).
Ewentualnie można zrobić plik EXE składający się z samego nagłówka - kodu źródłowego nie ma, więce nie ma czego wypisywać - program nie robi nic, natychmiast się zamyka.
Tak. Zamknie sie... po jakims czasie z komunikatem access? :P
Jakis kod jest. W koncu musi byc jakis program. Czym innym jest program, a czym innym plik. Gdyby chodzilo o plik to moglbym stworzyc np. pusty plik js, albo lepiej plik txt i powiedziec, ze takie rozszerzenie maja pliki mojego wyimaginowanego kompilatora :)
Przecież dałem link do programu w Assemblerze, który spełnia wymogi. To czemu rozmyślacie, czy to możliwe?
Czyli moze on powstawac np. za pomoca jakies suerinteligentnego programu generujacego inny program (tzn. samego siebie) albo miec w kodzie gdzies jakis lancuch znakow zapisany, ktory bedzie identyczny z kodem programu.
Ta opcja jest chyba awykonalna. Bo dajesz np. showmessage() z kodem programu, którym jest showmessage(), który ma w sobie treść programu, czyli showmessage() i tak w nieskończoność. Przynajmniej na mój rozum... :). Naomista zapisanie łańcucha znaku w zasobach, czy w pliku odpada z powodu założeń konkursu.
Marooned: obawiam sie, ze program nie spelnia zalozen. Nie wypisuje m. in. etykiet. Program musi wypisywac dokladnie taki kod z jakiego zostal skompilowany. O ile moznaby jeszcze przezyc, ze etykiet nie wypisuje, to akurat ten program nie wypisuje zmiennych na samym koncu (db...).
thenkles: jest mozliwe. Mi po 2-dniowej walce udalo sie jakos... Ale przyznaje, proste nie jest. Tzn. problemy sa zwykle natury technicznej. Proponuje sprobowac, a wszystko stanie sie latwiejsze.
Moge dac podpowiedz. Zrob program wypisujacy stringa (na poczatek pustego). Potem wypelnij tego stringa kodem programu i... kombinuj dalej.
Bez przesady, to nie takie trudne, ja pisałem w pascalu, zajęło mi jakieś 2 godziny. Podpowiem tylko że apostrof ma kod #39 :-)
Bez przesady, to nie takie trudne, ja pisałem w pascalu, zajęło mi jakieś 2 godziny. Podpowiem tylko że apostrof ma kod #39 :-)
Mi troche zajelo dojscie jak to zrobic :( Najgorsze wlasnie z tym apostrofem bylo i enterami (bo za dluga linia wychodzila :( )
slimy wygrał :) Brawa i oklaski :P
Dryobates: Twój wygenerowany kod się u mnie nie kompiluje :)
slimy wygrał :) Brawa i oklaski :P
Dzięki :-) ;p Już wgrałem na serwer http://4programmers.net/view_file.php?id=1428
slimy wygrał :) Brawa i oklaski :P
Dryobates: Twój wygenerowany kod się u mnie nie kompiluje :)
Przecież ten kod nie spełnia zadania - wypisuje tylko część swojego kodu! błąd polega na tym, że program - tak jak napisał wczesniej thenkles - nie pokazuje kodu do wypisywania kodu. a chyba trzeba było wypisać CAŁY kod, nie?
[dopisane]
hehe ups [glowa]. faktycznie, nie chciało mi się go uruchomić. zwracam honor i chyba idę się wreszcie porządnie wyspać.
Po przediffowaniu kodu oryginalnego i wygenerowanego wyszło 0 (pliki identyczne). ŁF - uruchomiłeś to w ogóle?