C ++、191
メインおよびインクルードあり、その246、メインおよびインクルードなしの場合は178のみです。改行は1文字としてカウントされます。すべての数値を符号なしとして扱います。mainがunsigned intを返すための警告が表示されないので、公正なゲームです。
初めてのコードゴルフの提出。
#include<iostream>
#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U d(U i){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}U main(){U i;std::cin>>i,std::cout<<d(i);R 0;}
シフトを使用して数値を4で繰り返し除算し、合計を計算します(1/3に収束します)
擬似コード:
// typedefs and #defines for brevity
function a(x, y):
magically add x and y using recursion and bitwise things
return x+y.
function d(x):
if x = 3:
return 1.
variable total, remainder
until x is zero:
remainder = x mod 4
x = x / 4
total = total + x
if total and remainder both zero:
return 0.
else:
return a(total, d(remainder)).
余談ですが、d mainという名前を付けてchar **を取り、プログラムの戻り値を出力として使用することで、mainメソッドを削除できます。コマンドライン引数の数を3で割った値を切り捨てて返します。これにより、その長さは宣伝された1911年になります。
#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U main(U i,char**q){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}