我們先來看看這個最基本的C語言版本:
#include <stdio.h> int main () { int i, j; for (i = 1; i <= 9; i++) for (j = 1; j <= 9; j++) printf("%d x %d = %2d%s", i, j, i * j, j == 9 ? "\n" : ", "); return 0; }
這是VB
Dim i As Integer, j As Integer Dim output As String For i = 1 To 9 For j = 1 To 9 Dim v As Integer v = i * j output = output & CStr(i) & " * " & CStr(j) & IIf(v < 10, " = ", " = ") & CStr(v) & IIf(j = 9, vbNewLine, "")) Next Next Print output
這是Java
public class J99 { public static void main(String[] args) { for (int i = 1; i <= 9; i++) for (int j = 1; j <= 9; j++) System.out.printf("%d x %d = %2d%s", i, j, i * j, j == 9 ? "\n" : ", "); } }
這是Python
#!/usr/bin/env python # -*- encoding: utf-8 -*- for i in range(1, 10): output = "" for j in range(1, 10): output = output + "%d x %d = %2d%s" % (i, j, i * j, j == 9 and "" or ", ") print output
但是這麼簡單的Code絕對不是我們今天的重點 XD
今天的重點是:怎麼把簡單的九九乘法表變得很難懂、很複雜
首先來看一下我昨天寫的Python一行九九乘法
#!/usr/bin/env python # -*- encoding: utf-8 -*- print "".join(map(lambda i: "".join(map(lambda j: "%d x %d = %2d%s" % (i, j, i * j, j == 9 and "\n" or ", "), range(1, 10))), range(1, 10)))原理大概就是map + range取代迴圈,str.join(list)來連接字串,加上lambda function不用換行
程式禁區 社團內有人提供的混亂 C++ 版本
(看起來明明是 C ,為什麼會說是 C++ 呢?因為 C 裡面並沒有定義 true 喔!)
#include <stdio.h> int oO(int o, int O) { if(!o) return O; return oO((o & O) << 0x1L/~-2, o ^ O); } int main() { int Sum = 1e0, False = true, Cat, Dog; while(1e1 > Sum) { Cat = !False; Dog = False & Cat; while(Dog < False) { Cat = oO(Sum, Cat); Dog = oO(Dog, !(Cat ^ Cat)); } if(False) { printf("%d%c%d=", False, 0x2A, Sum); } else { printf("%d%c%d=%2d", Cat, (char)False, Dog, Sum); } if(0xA > Cat) { putchar(040U); } else { Dog = Cat; } printf("%d", Cat); if(011U == False) { Sum = oO(Sum, 1e0); False = true; putchar(0xA); } else { False = oO(true, False); putchar(0x20L); } } return 0; }
接下來是 Takeshi 寫的一行C版本,運用了printf的ret value(spec ref)
#include<stdio.h> int main(){ return printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", 1, 1, 1)-5, 2, 2)-5, 3, 3)-5, 4, 4)-5, 5, 5)-5, 6, 6)-5, 7, 7)-5, 8, 8)-5, 9, 9)-4, 1, 2)-4, 2, 4)-4, 3, 6)-4, 4, 8)-4, 5, 10)-5, 6, 12)-5, 7, 14)-5, 8, 16)-5, 9, 18)-4, 1, 3)-3, 2, 6)-3, 3, 9)-3, 4, 12)-4, 5, 15)-4, 6, 18)-4, 7, 21)-4, 8, 24)-4, 9, 27)-3, 1, 4)-2, 2, 8)-2, 3, 12)-3, 4, 16)-3, 5, 20)-3, 6, 24)-3, 7, 28)-3, 8, 32)-3, 9, 36)-2, 1, 5)-1, 2, 10)-2, 3, 15)-2, 4, 20)-2, 5, 25)-2, 6, 30)-2, 7, 35)-2, 8, 40)-2, 9, 45)-1, 1, 6)-0, 2, 12)-1, 3, 18)-1, 4, 24)-1, 5, 30)-1, 6, 36)-1, 7, 42)-1, 8, 48)-1, 9, 54)+0, 1, 7)+1, 2, 14)+0, 3, 21)+0, 4, 28)+0, 5, 35)+0, 6, 42)+0, 7, 49)+0, 8, 56)+0, 9, 63)+1, 1, 8)+2, 2, 16)+1, 3, 24)+1, 4, 32)+1, 5, 40)+1, 6, 48)+1, 7, 56)+1, 8, 64)+1, 9, 72)+2, 1, 9)+3, 2, 18)+2, 3, 27)+2, 4, 36)+2, 5, 45)+2, 6, 54)+2, 7, 63)+2, 8, 72)+2, 9, 81); }
這是 OJ大神 Morris 寫的遞迴版本
#include <stdio.h> void n99(int x, int y) { if(y < 1 && x > 1) n99(x-1, 9); if(x > 0 && y > 0) { n99(x, y - 1); printf("%d x %d = %2d%s", x, y, x * y, y == 9 ? "\n" : ", "); } } int main() { n99(9, 9); return 0; }
大概解釋一下:
透過遞迴實作,從最後面(9x9)開始往前,但是因為遞迴具有Stack的特性,所以會讓輸出順序反轉回來
這個版本最簡短,直接透過 main() 自身做遞迴
#include <stdio.h> int main(int a){return (a++<82)&&printf("%d*%d=%d\n",(a-2)/9+1,(a-2)%9+1,(a-2)+1)&&main(a+1);}
再來看看這個超級
#include <stdio.h> #define $ "%d x %d = %2d%s" #define $_$ printf #define $_$_$ return #define $_$_$_$ "\n" #define $_$_$_$_$ ", " #define $_$_$_$_$_$ main #define $_$_$_$_$_$_$ for #define $_$_$_$_$_$_$_$ int #define $_$_$_$_$_$_$_$_$ <= #define $_$_$_$_$_$_$_$_$_$ ++ #define $_$_$_$_$_$_$_$_$_$_$ == #define $_$_$_$_$_$_$_$_$_$_$_$ = #define $_$_$_$_$_$_$_$_$_$_$_$_$ ) #define $_$_$_$_$_$_$_$_$_$_$_$_$_$ 0 #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$ 1 #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ 9 #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ { #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ } #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ i #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ * #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ j #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ ? #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ , #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ : #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ ; #define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ ( $_$_$_$_$_$_$_$ $_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$ $_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
其實只是透過
#define
這個marco去帶換而已 :P
沒有留言:
張貼留言