內容簡介
本書主要介紹短碼編程,首先介紹了短碼編程的三要素:數據結構和算法、執行環境以及短碼編程的精神。書中以北京大學的pku judge online 線上評分系統為編程環境,選取了該系統中比較典型的問題,如海狸啃木頭、旋轉拼圖、葡萄酒買賣,利用數據結構和算法的知識加以分析,最後編程實現,並嘗試使用各種程式語言,不斷地將原始碼縮短。同時還介紹並分析了一些鑽安全漏洞的代碼,旨在通過短碼編程幫助程式設計師集中注意力,鍛鍊忍耐力,開拓視野。 本書適合所有對短碼編程感興趣的人。
作者簡介
Ozy 本名岡田佑一,是出生於日本大阪的一位短碼高手。他花費相當長的時間提升短碼編程技術,進而將其發展成一種技能,曾獲得程式設計大賽的冠軍。他開辦過程式設計方面的培訓班,目前致力於數學教育和程式設計師的培養工作。 李秀銀 畢業於黑龍江大學,高級軟體工程師, 一直致力於IT行業的項目研發。精通各種開發環境及語言,從事對日外包工作近20年,先後研發各類軟體項目60餘項,發表學術論文數十篇,多次獲省級科研項目獎。
目錄
第1章 入門 1
1.1 引言 2
1.1.1 什麼是短碼編程 2
1.1.2 短碼編程的三要素 3
1.1.3 熱情、聰明的短碼編程者 4
1.1.4 短碼編程者的傳奇 4
1.2 戰場:線上評分系統 4
1.2.1 什麼是線上評分系統 4
1.2.2 世界各地的線上評分系統 4
1.2.3 PKU Judge Online 5
1.3 動手試試:短碼編程的基礎 6
1.3.1 編程環境 6
1.3.2 使用的程式語言和編譯器 6
1.3.3 註冊POJ賬號 6
1.3.4 基本規則 7
1.3.5 微妙的規則 8
1.3.6 道德上的規則 8
1.4 熱身 10
1.4.1 關於運行環境 10
1.4.2 首先從簡單的加法運算開始 10
1.4.3 不簡單加法運算 16
1.4.4 計算平均值 21
1.4.5 推出重疊的牌 24
1.4.6 開始模仿編程 28
1.4.7 熱身結束 31
第2章 必讀!絕妙技巧 33
2.1 精通規則 34
2.1.1 醉漢看守 34
2.1.2 階段 43
2.1.3 連續數的和 49
2.2 Quick Sort Hack 55
2.2.1 快速排序 55
2.2.2qsort函式 55
2.2.3 Hack風暴 56
2.2.4 挑戰變態排序一 58
2.2.5 挑戰變態排序二 65
2.2.6 永遠的Hack 69
2.3 熟練運用庫函式 69
2.3.1 方便的庫函式 69
2.3.2 好用的strtol函式 74
2.3.3 strtol與itoa天生一對 77
2.3.4 轉換樂園 82
2.3.5 海狸啃木頭 84
2.3.6 繫繩 87
2.4 精減1位元組的靠山 91
2.4.1 好用的~運算符 91
2.4.2 好用的%運算符 94
2.4.3 分組建立長期政權 99
2.4.4 ISBN碼 106
2.4.5 非常活躍的數學問題 110
2.5 按位運算的超級魔法114
2.5.1 超級魔法的二叉樹 114
2.5.2 超級魔法的密碼 119
2.5.3 超級魔法的極致 123
2.6 精通指針 129
2.6.1 短碼編程中的指針 129
2.6.2 旋轉拼圖的智力遊戲 130
2.6.3 超長加法 135
2.6.4 指針和數組的密切關係 138
2.7 數學問題 142
2.7.1 不要依賴公式 142
2.7.2 越界(數列篇) 143
2.7.3 越界(排列組合篇) 146
2.7.4 與周期有關的問題 150
2.7.5 偽隨機數的周期性 151
2.7.6 三個周期 153
2.7.7 斐波那契數列 158
2.8 活用算法 163
2.8.1 高速、節省記憶體是編寫短碼的關鍵 163
2.8.2 三角形 163
2.9 數字的新常識 171
2.9.1 關鍵在“三” 171
2.9.2 整理電話號碼 176
2.10 位元組的熱情 184
2.10.1 附上答案 184
2.10.2 漢諾塔 184
第3章 短碼編程研究 193
3.1 更高的編程技巧 194
3.1.1 開始 194
3.1.2 關於表示法 194
3.2 精簡循環 194
3.2.1 精通之後就能成為頂尖的短碼編程者 194
3.2.2 簡單的例子 195
3.2.3 常用結構 197
3.2.4 短碼編程的基本類型 197
3.2.5 重要的短碼語法 199
3.2.6 取數字遊戲 200
3.2.7 葡萄酒買賣 202
3.2.8 難解:精簡多層循環 204
3.3 強大的擴展語法 208
3.3.1 對短碼編程者有用的擴展語法 208
3.3.2 條件運算符 208
3.3.3 數字根 209
3.3.4 擴展左值212
3.3.5擴展關係運算符 213
3.4 宏能不能縮短代碼 213
3.4.1 基於短碼編程的宏 213
3.4.2 while語句的可能性 214
3.4.3 數組的可能性 217
3.5 神奇的main遞歸 219
3.5.1 main遞歸可以最大限度地縮短代碼 219
3.5.2 從單純循環到main遞歸 219
3.5.3 破解難題的main遞歸 220
3.5.4 基於遞歸算法的main遞歸 232
3.5.5 傳說中的1145 233
3.5.6 小結 239
3.6 Quick Sort HackⅡ 240
3.6.1 征服二進制等於征服短碼編程 240
3.6.2 縮短彙編代碼 244
3.6.3 進一步縮短 248
3.7 作弊代碼和安全性 251
3.8 挑戰難題 254
3.8.1 短碼編程的靈魂 254
3.8.2 組成最強陣容254
第4章 語言對決 277
4.1 短碼編程不限語言 278
4.1.1 各種程式設計語言 278
4.1.2 本章結構 278
4.2java與c278
4.2.1 Java是有缺陷的程式設計語言 278
4.2.2 使用Java的地方 279
4.2.3 多精度時就交給Java 279
4.2.4 C語言仍然強大 285
4.3 Pascal與C 292
4.3.1 遇到麻煩的Pascal語言 292
4.3.2 用Pascal寫出比C語言更短的代碼 293
4.3.3 複利計算 293
4.4 C++與C 294
4.4.1 不經常使用的C++ 294
4.4.2 基本技巧 295
4.4.3 檢查順序 296
4.4.4 G++擴展運算符與變態GCC原始碼的對比 299
4.5 更多的挑戰 306
4.5.1 成為一名真正的短碼編程者 306
4.5.2 世界各地的短碼編程者的活動 306
4.5.3 挑戰Code Golf 307
4.5.4 嘗試用所有語言編寫短碼 312
第5章 磨練自己 313
5.1 致親愛的讀者 314
5.1.1 向短碼編程者學習 314
5.1.2 原始碼的可讀性 314
5.1.3 希望寫出錯誤少的程式 315
5.1.4 更大程度地提高 316
5.1.5 有人情味、富有魅力 317
5.2 珍貴的參考資料 318
5.2.1 珍貴的書籍 318
5.2.2 網站介紹 323
5.3 精明強幹的短碼編程者 325
5.3.1 致謝 325
5.3.2 短碼高手們(敬稱略,按字母順序) 325
5.4 最後 327
附錄 331
A.1 問題一覽 332
A.2 ASCII碼錶 337
A.3 運算符的優先權與結合規則 338