2009-10-09 21 views
6

難読化されたCコードコンテストの1988エントリーである次のコードを実行しようとしています。K&R Cから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() 
{ 
      _-_-_-_ 
     _-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_-_-_ 
    _-_-_-_-_-_-_-_-_-_-_-_ 
     _-_-_-_-_-_-_-_ 
      _-_-_-_ 
} 

このコードでは、エントリの説明から、独自の領域を見てpiを計算しています。私は正常にコードを変更せずにそれをコンパイルしました。しかし、私が処刑されたとき、それは私に値0.25を与えています、私が期待しているのは3.14です。コードの説明にはK & R Cと書かれていて、ANSI Cでは何も変更せずに正しく動作しません。私はそれを適切に実行するためにはこれらの変更を行う必要があると思います。私はK & R C.の以前の経験を持っていないので、誰かが上記のコードをANSI Cに変更したり、もしあれば問題を指摘してくれます。私はこれを実行するためにMicrosoft Visual Studio 2008を使用しています。

+7

、なぜ?私はこれが少なくとも少し役に立つとは思わない。難読化されたコンテストは、あなたが「賢い」ことができる方法を示す方法としては問題ありませんが、実際にはあまり関連性がありません。私のアドバイスは、本当の問題を見つけて解決します。 – paxdiablo

+1

@Pax:$ DEITYの+ Inf: – Jacob

+1

@Pax:無限の冒涜のための:) :) – DVK

答えて

10

GCCをお持ちの場合は、 '-traditional-cpp'というフラグを付けてコンパイルしてください。

'-_'シーケンスが '- -F<00'または '--F<00'に変換されるかどうかが異なります。

1つのスペースが重要です。これは、ダブルネゲートとプリデクリメントの違いです。

+1

残念ながら、OPはコンパイラを最後の文は、私たちのほとんどが(数秒前までに自分自身を含んでいた)読書を止める時でした。彼/彼女はVS2008を使用しています。 –

+0

ハットオフ、サー。私はコンバージェンスのプロセスを見た(プログラムは実際には "自分のエリアから"働いていない、反復はちょうどかわいい方法で整理されている)が、この詳細を解釈すると〜_うわー! – mjv

+0

@Chris:私はVS2008を見ました。私はそれを持っていない。私はVS2008が-traditional-cppに相当するものをサポートすることに疑念を持っています。だから私は 'もし'を前に置いていた。 –

2

変更行:$神の愛のために

#define _ F-->00 || F-OO--; 
関連する問題