《獻給某工程師的情書》

contents

  1. 1. 背景
  2. 2. 規格介紹
    1. 2.1. 編譯
    2. 2.2. 限制
  3. 3. 原理說明
  4. 4. 產生器

「有些情書,是無法唸出來的。」—《獻給某工程師的情書》

背景

近十多年前,看了一段來自 Matrix67 的一篇文章,並寫下了紀錄。那時,正值大二的我,對於 IOCCC 和 C 語言不夠了解,只做為一個基礎的認識並且記錄下,總幻想著以後有個機會用用。如今,在這個年底,一場邂逅,讓我想起了那好久好久以前的構思。

木製卡片之一

並且做成了一張木製卡片,最後挑了兩家廠商去做,擔心顯示的字型與雷雕技術之間造成難以成色的問題,因此在挑選字型時,也是偏向工業用字型。至於,被抱怨「編譯不起來」,那又是另一個故事了。

規格介紹

編譯

1
2
gcc main.c -o main
./main

限制

  • 這封情書只能容納 84 個字元
  • 字元只能以 ASCII 的形式儲存
  • 只能有 32 種不同字元。
  • ASCII 值會被忽略 < 36,即不可視字元以及特殊符號 !"#

原理說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
main(h ,_,s) char*s;{return
h<1?main(*s,s[-h],"=a-1kj3gnm:q\
ebh_cf*<r.d>i^+?,()[0qTyrjuvcde'8\
h,Mk2polw-s1.t main(")&&s[-h]&&main
(h-1,_,s):h/2?_==*s?putchar(32[s])
:_%115<36||main(h,_,s+1):main(
0,h,"q>.#::##+b#:#(#k###+\
##h?.)+####b?(##rr###\
##?#,1#?r#<#g:#^#\
q?d?_#<kk##)#\
##>i#=fe#\
####")
;}

還原排版一下

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main(h ,_,s) char*s; {
return
h<1 ?
main(*s,s[-h],"=a-1kj3gnm:qebh_cf*<r.d>i^+?,()[0qTyrjuvcde'8h,Mk2polw-s1.t main(")
&&s[-h]&&main(h-1,_,s) :
h/2 ?
_==*s ? putchar(32[s]) : _%115<36||main(h,_,s+1) :
main(0,h,"q>.#::##+b#:#(#k###+##h?.)+####b?(##rr#####?#,1#?r#<#g:#^#q?d?_#<kk##)###>i#=fe#####");
}
  1. main(h, _, s) char*s; 是主程式的進入點,相當於常見的 main(int argc, char *argv[]),因此 h = argc 也就是一開始程式的進入參數個數。
  2. ./main 執行時,傳進去的 h = argc = 1
  3. h
    1. 負號時,作為加密訊息的字元索引值 ()。s[-h]&&main(h-1,_,s) 則表示加密訊息非空,繼續推進下一個解析字元位置。
    2. 正數時,只標記狀態為 解密表格索引
  4. _ 作為當前加密訊息的字元
  5. s 作為傳遞資料的磁帶

暗碼對照表

1
2
encode: =a-1kj3gnm:qebh_cf*<r.d>i^+?,()[
decode: 0qTyrjuvcde'8h,Mk2polw-s1.t main(

加密訊息

1
q>.#::##+b#:#(#k###+##h?.)+####b?(##rr#####?#,1#?r#<#g:#^#q?d?_#<kk##)###>i#=fe#####

忽略 # 字元後,第一個 q 要去找 encode row 所在的位置

1
2
3
encode: =a-1kj3gnm:qebh_cf*<r.d>i^+?,()[
decode: 0qTyrjuvcde'8h,Mk2polw-s1.t main(
^this, get `'`

第二個 > 要去找 encode row 所在的位置

1
2
3
encode: =a-1kj3gnm:qebh_cf*<r.d>i^+?,()[
decode: 0qTyrjuvcde'8h,Mk2polw-s1.t main(
^this, get `s`

第三個 . 要去找 encode row 所在的位置

1
2
3
encode: =a-1kj3gnm:qebh_cf*<r.d>i^+?,()[
decode: 0qTyrjuvcde'8h,Mk2polw-s1.t main(
^this, get `w`

產生器