2013/09/28

九九乘法Code

九九乘法表是很常見的作業,常常出現在剛講完迴圈的時候讓大家練習一下

我們先來看看這個最基本的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);}

再來看看這個超級WTF厲害的C XDD(自豪
#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

沒有留言:

張貼留言