一百行以下有哪些給力代碼?

語言不限,給力種類不限。
請給出簡介、出處。
謝謝大家!

相關問題:
一千行以下有哪些給力代碼?
有哪些值得學習的小型開源項目?
五千行以下有哪些值得學習的開源項目?
十萬行以下有哪些值得學習的開源項目?


99行的全局光照程序 smallpt,它使用蒙地卡羅路徑追蹤。

#include & // smallpt, a Path Tracer by Kevin Beason, 2008
#include & // Make : g++ -O3 -fopenmp smallpt.cpp -o smallpt
#include & // Remove "-fopenmp" for g++ version &< 4.2 struct Vec { // Usage: time ./smallpt 5000 xv image.ppm double x, y, z; // position, also color (r,g,b) Vec(double x_=0, double y_=0, double z_=0){ x=x_; y=y_; z=z_; } Vec operator+(const Vec b) const { return Vec(x+b.x,y+b.y,z+b.z); } Vec operator-(const Vec b) const { return Vec(x-b.x,y-b.y,z-b.z); } Vec operator*(double b) const { return Vec(x*b,y*b,z*b); } Vec mult(const Vec b) const { return Vec(x*b.x,y*b.y,z*b.z); } Vec norm(){ return *this = *this * (1/sqrt(x*x+y*y+z*z)); } double dot(const Vec b) const { return x*b.x+y*b.y+z*b.z; } // cross: Vec operator%(Vecb){return Vec(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);} }; struct Ray { Vec o, d; Ray(Vec o_, Vec d_) : o(o_), d(d_) {} }; enum Refl_t { DIFF, SPEC, REFR }; // material types, used in radiance() struct Sphere { double rad; // radius Vec p, e, c; // position, emission, color Refl_t refl; // reflection type (DIFFuse, SPECular, REFRactive) Sphere(double rad_, Vec p_, Vec e_, Vec c_, Refl_t refl_): rad(rad_), p(p_), e(e_), c(c_), refl(refl_) {} double intersect(const Ray r) const { // returns distance, 0 if nohit Vec op = p-r.o; // Solve t^2*d.d + 2*t*(o-p).d + (o-p).(o-p)-R^2 = 0 double t, eps=1e-4, b=op.dot(r.d), det=b*b-op.dot(op)+rad*rad; if (det&<0) return 0; else det=sqrt(det); return (t=b-det)&>eps ? t : ((t=b+det)&>eps ? t : 0);
}
};
Sphere spheres[] = {//Scene: radius, position, emission, color, material
Sphere(1e5, Vec( 1e5+1,40.8,81.6), Vec(),Vec(.75,.25,.25),DIFF),//Left
Sphere(1e5, Vec(-1e5+99,40.8,81.6),Vec(),Vec(.25,.25,.75),DIFF),//Rght
Sphere(1e5, Vec(50,40.8, 1e5), Vec(),Vec(.75,.75,.75),DIFF),//Back
Sphere(1e5, Vec(50,40.8,-1e5+170), Vec(),Vec(), DIFF),//Frnt
Sphere(1e5, Vec(50, 1e5, 81.6), Vec(),Vec(.75,.75,.75),DIFF),//Botm
Sphere(1e5, Vec(50,-1e5+81.6,81.6),Vec(),Vec(.75,.75,.75),DIFF),//Top
Sphere(16.5,Vec(27,16.5,47), Vec(),Vec(1,1,1)*.999, SPEC),//Mirr
Sphere(16.5,Vec(73,16.5,78), Vec(),Vec(1,1,1)*.999, REFR),//Glas
Sphere(600, Vec(50,681.6-.27,81.6),Vec(12,12,12), Vec(), DIFF) //Lite
};
inline double clamp(double x){ return x&<0 ? 0 : x&>1 ? 1 : x; }
inline int toInt(double x){ return int(pow(clamp(x),1/2.2)*255+.5); }
inline bool intersect(const Ray r, double t, int id){
double n=sizeof(spheres)/sizeof(Sphere), d, inf=t=1e20;
for(int i=int(n);i--;) if((d=spheres[i].intersect(r))d&f.y f.x&>f.z ? f.x : f.y&>f.z ? f.y : f.z; // max refl
if (++depth&>5) if (erand48(Xi)&.1?Vec(0,1):Vec(1))%w).norm(), v=w%u;
Vec d = (u*cos(r1)*r2s + v*sin(r1)*r2s + w*sqrt(1-r2)).norm();
return obj.e + f.mult(radiance(Ray(x,d),depth,Xi));
} else if (obj.refl == SPEC) // Ideal SPECULAR reflection
return obj.e + f.mult(radiance(Ray(x,r.d-n*2*n.dot(r.d)),depth,Xi));
Ray reflRay(x, r.d-n*2*n.dot(r.d)); // Ideal dielectric REFRACTION
bool into = n.dot(nl)&>0; // Ray from outside going in?
double nc=1, nt=1.5, nnt=into?nc/nt:nt/nc, ddn=r.d.dot(nl), cos2t;
if ((cos2t=1-nnt*nnt*(1-ddn*ddn))&<0) // Total internal reflection return obj.e + f.mult(radiance(reflRay,depth,Xi)); Vec tdir = (r.d*nnt - n*((into?1:-1)*(ddn*nnt+sqrt(cos2t)))).norm(); double a=nt-nc, b=nt+nc, R0=a*a/(b*b), c = 1-(into?-ddn:tdir.dot(n)); double Re=R0+(1-R0)*c*c*c*c*c,Tr=1-Re,P=.25+.5*Re,RP=Re/P,TP=Tr/(1-P); return obj.e + f.mult(depth&>2 ? (erand48(Xi)&

我之前曾翻譯成不同語言去比較性能,見C++/C#/F#/Java/JS/Lua/Python/Ruby渲染比試。


這個問題這麼多人關注,好的答案居然這麼少
很多答案都是抖機靈,代碼不直觀,也不是很有價值(混亂代碼的意義還不如鋼琴家們為炫技而寫的練習曲呢)
invSqrt居然好多人說,其實裡面的神奇數字有很多人分析了,比如這個問題0x5f3759df這個「黑魔法數」為什麼會這麼神奇?有什麼數學依據嗎? - Belleve 的回答

地圖炮開完,我給出我最喜歡的一百行以下給力代碼:
有人在stackexchange上開了個問題叫做Tweetable Mathematical Art(鏈接是:popularity contest),希望人們用三條twitter那麼長的代碼生成1024x1024的圖片,希望圖片盡量有美感。

為什麼是三條,因為題主給了一小段基礎代碼,其中有三個空函數分別生成RGB三個顏色,於是就有三個插入代碼的地方。代碼如下

#include &
#include &
#include &
#define DIM 1024
#define DM1 (DIM-1)
#define _sq(x) ((x)*(x)) // square
#define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
#define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root

unsigned char GR(int,int);
unsigned char BL(int,int);

unsigned char RD(int i,int j){
// YOUR CODE HERE
}
unsigned char GR(int i,int j){
// YOUR CODE HERE
}
unsigned char BL(int i,int j){
// YOUR CODE HERE
}

void pixel_write(int,int);
FILE *fp;
int main(){
fp = fopen("MathPic.ppm","wb");
fprintf(fp, "P6
%d %d
255
", DIM, DIM);
for(int j=0;j&

從容不迫地就能壓到100行以內。

同時挑戰程序員編程、數學和審美的比賽來了。

大家交出的作品非常逆天,連著名大神Matrix67都表示讚歎(用三段 140 字元以內的代碼生成一張 1024×1024 的圖片)

有這個

這個

這是一張使用 diffusion-limited aggregation 模型得到的圖片,程序運行起來要耗費不少時間。代碼很有意思:巧妙地利用宏定義,打破了函數與函數之間的界限,三段代碼的字數限制便能合在一起使用了。

--------Matrix67(源代碼請看原問題或者matrix67的博客文章)

還有這個(奇怪牌小火龍?)

我覺得右下角看起來是個綠色的小火龍在噴火

這些代碼都挺直觀的,也能學到一些分形的知識。

原問題里有提供源代碼和編譯的指示,所以看官們也可以下載下來自己鼓搗鼓搗,做個酷到飛起的頭像來玩玩。

補:matrix67的博客也激勵了一些兄弟拓展新的形式,比如這個(Tweetable Mathematical Art 習作)

看著簡單 其實不太好實現


下面這段代碼應該是世上最給力(但顯然不是最快的)計算Pi的演算法了(來自1988年的IOCCC大賽)
解釋:FF是面積,OO是直徑,Pi=4*面積/直徑/直徑

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


當初看到這段代碼的時候,直感嘆自己是太老實了。。。

void send(int* to, int* from, int count)
{
int n = (count+7)/8;
switch(count%8) {
case 0: do{ *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
} while(--n&>0);
}
}

參考:https://en.wikipedia.org/wiki/Duff"s_device


function $(C,E,K){if(!(C instanceof Array))return K("string"==typeof C?
E[C]:C);switch(C[0]){case"lambda":return K(function(K){return function(
){for(var e=Object.create(E),u=0;u&

這是……一個解釋器


不是針對最高票回答,但要提醒一下大家:千萬要記住,不要聽任何人說什麼把代碼貼到瀏覽器命令行去運行。除非你確切知道他的代碼是幹啥的。否則你的賬號說不定分分鐘就被人盜了……


有本書叫做hacker"s delight, 一個白頭髮老程序員所作,講述了各種位操作的奇技淫巧


*nix fork bomb

:(){ :|: };:


最短的俄羅斯方塊代碼,60行。出處: 60行代碼俄羅斯方塊[原創]-CSDN論壇-CSDN.NET-中國最大的IT技術社區

&&&&&
&& &
var map=eval("["+Array(23).join("0x801,")+"0xfff]");
var tatris=[[0x6600],[0x2222,0xf00],[0xc600,0x2640],[0x6c00,0x4620],[0x4460,0x2e0,0x6220,0x740],[0x2260,0xe20,0x6440,0x4700],[0x2620,0x720,0x2320,0x2700]];
var keycom={"38":"rotate(1)","40":"down()","37":"move(2,1)","39":"move(0.5,-1)"};
var dia, pos, bak, run;
function start(){
dia=tatris[~~(Math.random()*7)];
bak=pos={fk:[],y:0,x:4,s:~~(Math.random()*4)};
rotate(0);
}
function over(){
document.onkeydown=null;
clearInterval(run);
alert("GAME OVER");
}
function update(t){
bak={fk:pos.fk.slice(0),y:pos.y,x:pos.x,s:pos.s};
if(t) return;
for(var i=0,a2=""; i&<22; i++) a2+=map[i].toString(2).slice(1,-1)+"&
";
for(var i=0,n; i&<4; i++) if(/([^0]+)/.test(bak.fk[i].toString(2).replace(/1/g,"u25a1"))) a2=a2.substr(0,n=(bak.y+i+1)*15-RegExp.$_.length-4)+RegExp.$1+a2.slice(n+RegExp.$1.length); document.getElementById("box").innerHTML=a2.replace(/1/g,"u25a0").replace(/0/g,"u3000"); } function is(){ for(var i=0; i&<4; i++) if((pos.fk[i]map[pos.y+i])!=0) return pos=bak; } function rotate(r){ var f=dia[pos.s=(pos.s+r)%dia.length]; for(var i=0; i&<4; i++) pos.fk[i]=(f&>&>(12-i*4)15)&<&&
&

using System;
public class HelloWorld
{
public static void Main()
{
Console.WriteLine("我是一百行以下最給力代碼");
}
}


雷神3的開平方演算法,當年看到直接跪了,據說出自MIT HACKMEM
http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html


不限給力種類?

sudo rm -rf /usr /lib/nvidia-current/xorg/xorg

出處:install script does rm -rf /usr for ubuntu · Issue #123 · MrMEEE/bumblebee-Old-and-abbandoned


90 行 C++ 實現一個 Lisp 解釋器:
http://howtowriteaprogram.blogspot.com/2010/11/lisp-interpreter-in-90-lines-of-c.html


在命令行中執行別人的代碼是一件很危險的事,請大家注意, 不僅限於本回答。

本頁面打開chrome命令行, 執行以下腳本, 可以給我+1.

Function("".replace(/.{8}/g,function(u){return String.fromCharCode(parseInt(u.replace(/u200c/g,1).replace(/u200d/g,0),2))}))();

PS:還可以執行下:

console.log("".length);

補充下原理, 可以參見: 「短」化你的代碼


輸出自身程序的程序

#include&
int main()
{
char *c="#include&%cint main()%c{%cchar *c=%c%s%c;%cprintf(c,10,10,10,34,c,34,10,10,10);%c}%c";
printf(c,10,10,10,34,c,34,10,10,10);
}

來自C語言比賽上的。


int gcd(int a, int b)
{
return b &>0?gcd(b, a%b):a;
}

(我發現拿到贊的很大部分原因是大家只能看懂這一個.)


# coding: utf-8
# 沒寫完...
import winsound
X = 1
Y = 0.5
_s = 392 * X
_L = 440 * X
D = 524 * X
R = 578 * X
M = 660 * X
F = 698 * X
S = 784 * X
L = 880 * X
T = 500
winsound.Beep (_L,T)
winsound.Beep (_L,T / 2)
winsound.Beep (_s,T / 2)
winsound.Beep (_L,T)
winsound.Beep (_L,T / 2)
winsound.Beep (_L,T / 2)
winsound.Beep (D,T )
winsound.Beep (R,T / 2)
winsound.Beep (D,T / 2)
winsound.Beep (_L,T * 2)
time.sleep(Y)


a=a+b;
b=a-b;
a=a-b;

最初看到時媽的碉堡了


data:text/html, &


How to Write a Spelling Corrector
Peter Norvig 用21行python寫的功能完備的拼寫檢查器
並有ruby等各種語言版本


haskell三行qsort算么(讀書少見笑了…)


推薦閱讀:

維護一個五六百行的程序就已經力不從心了怎麼辦?
寫代碼過程中最忌諱的是什麼?總感覺最近太過於急於求成?
學會在紙上寫代碼,這很重要嗎?
如何高效的學習 TensorFlow 代碼?

TAG:編程 | 計算機 | 代碼 | 開源 |