2009-10-09 18 views
6

Próbuję wykonać następujący kod, który jest 1988 wpisu Obfuscated C Code Contest.Jak przekonwertować z K & R C do ANSI C?

#define _ -F<00||--F-OO--; 
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() 
{ 
      _-_-_-_ 
     _-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_ 
     _-_-_-_-_-_-_-_ 
      _-_-_-_ 
} 

Z opisu pozycji ten kod oblicza pi, patrząc na własny obszar. Z powodzeniem skompilowałem go bez zmiany kodu. Ale kiedy wykonałem, daje mi to wartość 0.25, czego oczekuję 3,14. Opis kodu mówi, że jest w K & R C i nie działa poprawnie w ANSI C bez jakiejś zmiany. Myślę, że muszę wykonać te modyfikacje, aby wykonać je poprawnie. Nie mam żadnego wcześniejszego doświadczenia z K & R C. Czy ktoś może mi pomóc zmienić powyższy kod na ANSI C lub wskazać na ewentualne problemy. Używam Microsoft Visual Studio 2008, aby to wykonać.

+7

Na miłość $ bóstwa dlaczego? Nie widzę tego jako najmniej użytecznego. Zakamuflowane konkursy są dobrym sposobem na pokazanie, jak "sprytnie" możesz być, ale naprawdę mają małe znaczenie w realnym świecie. Moja rada, znajdź prawdziwy problem i rozwiąż go. – paxdiablo

+1

@Pax: + Inf za $ DEITY :) – Jacob

+1

@Pax: -W przypadku nieskończonego bluźnierstwa :) – DVK

Odpowiedz

10

Jeśli masz GCC, skompiluj flagę "-traditional-cpp".

Różnica polega na tym, czy sekwencja "-_" została przetłumaczona na "- -F<00" lub "".

Jedna przestrzeń jest kluczowa: jest to różnica między podwójną negacją a wstępnym dekrementowaniem.

+1

Niestety, OP ukrył swój kompilator w ostatnie zdanie, kiedy większość z nas (ja włączyłem się kilka sekund temu) przestaje czytać. On/Ona używa VS2008. –

+0

Czapki z głów, proszę pana. Widziałem proces konwergencji (program tak naprawdę nie działa "poza własnym obszarem", iteracje są po prostu ułożone w uroczym stylu), ale ten szczegół w interpretacji - wow! – mjv

+0

@ Chris: Widziałem VS2008; Nie mam tego. Mam wątpliwości, że VS2008 będzie obsługiwał odpowiednik -traditional-cpp. Właśnie dlatego postawiłem "z góry". –