「有些情書,是無法唸出來的。」—《獻給某工程師的情書》
背景
近十多年前,看了一段來自 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#####"); }
|
main(h, _, s) char*s;
是主程式的進入點,相當於常見的 main(int argc, char *argv[])
,因此 h = argc
也就是一開始程式的進入參數個數。
./main
執行時,傳進去的 h = argc = 1
h
- 負號時,作為加密訊息的字元索引值 ()。
s[-h]&&main(h-1,_,s)
則表示加密訊息非空,繼續推進下一個解析字元位置。
- 正數時,只標記狀態為 解密表格索引
_
作為當前加密訊息的字元
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`
|
產生器