非死不可之怕柔

Facebook 近來真是相當地紅, 很多遊戲都在上面加入口, 用免費的形式導引潛在的消費者走到他們 "有料" 的網站去! 雖然一開始大家都不願意花錢, 但是多多少少會有人願意拿新台幣去買 XX 幣吧! 這些遊戲網站大概都賺翻了~~~

在一片墮落聲中, 我無意間也發現一個比較令人興奮的角落. 什麼? 不是 "不可犯罪的乖乖水" 啦! 而是怕(Puzzle) 區. 所以本篇的標題叫做 Facebook's Puzzles. 在這裡面, Facebook 放了一些演算法的題目, 讓大家去討論, 切磋. 包括 2 個  "試吃" 題 (Hors d'oeuvre), 7 個點心 (snack), 5 個正餐 (meal), 和 3 個吃到飽 (buffet). 

http://www.facebook.com/careers/puzzles.php

說實在的, 這些題目即使本身是 NP-complete, 但是只要方向想對, 程式寫起來快, 執行速度也會很快! 反正是電腦在跑, 不要寫錯 code 就好. 拿最後一題吃到飽的 facebull 來說吧, 其實它就是 traveling salesman 問題的搞笑包裝版, Face Bull 也明顯地取材自 Red Bull. 我在修清大的計算幾何學時, 期末作業的自由創作就是選了這個題目. 基本上不可能的路就不要走, 整體就會節省很多的時間. 我後來發現 Viterbi 的想法和我差不多, 只不過 Viterbi 是用在通訊, 而且當時還沒有寫進教科書.

此題正規的解法, 首先要處理檔案 parsing 的問題, 把有問題的輸入濾掉, 把有用的資料整理出來. 第二步就是設計一個能夠走過所有路徑, 卻不會重複的演算法. 這個部份簡單無比, 就是一個 recursive 的 function, 加上一個 local 變數做 mutex. 什麼展開都不需要, 考慮到展開所有可能路徑, 建表…等等那就太複雜了. 

計算每一條路徑時, 要順手把走過的 node 記錄下來, 根據 depth-first 的 search, 原先記住的東西就會保持有效, 包括走過哪幾個 node? 已經累計的 cost 有多少? 下次遇到任何 node 累積 cost 超過 minimum cost, 就可以直接 return. 這是我以前做 OCR (Optical Character Recognition) 時一定要用的加速大法.

採用上面的步驟, 就算不是最佳 solution, 結果也不會太差. 我抓了 Facebook 上的討論區某人丟出的測試檔, 看起來一瞬間就解出來了. Code 裡面還包括一個因為偷懶才用上的 bubble sort 都可以跑這麼快, 主程式的品質應該不算太劣等.

Facebook 怕柔區上面的文章超多的, 只不過大家都用英文討論, 我覺得格格不入, 一點都不想看下去. 畢竟我是為了重拾軟體工程師的初心才來休閒的, 可不想變成練習英文呢~~~

最近有個某某炒外匯公司打電話找我加入投資. 想我這麼清寒貧下, 怎麼炒得起槓桿 100 倍的外匯咧? 但是這給我一個靈感, 就是用 "最佳化找哪些銀行換匯的手續費總和最低, 使得在持有任何一種貨幣時, 換成其他任意貨幣後又換回來的獲利最高 (假設每家銀行承作其中某兩個貨幣轉換的手續費已經是最低)" 和 facebull 也是同一個問題的不同面貌.

對了! 非死不可有一個地方我不太喜歡, 那就是請大家把程式寄給他們評比的郵箱地址:{0xFACEB00C>>2 in decimal}@facebook.com. 傻瓜才會把整支地址貼上去吧! 不過這個小 trick 的難度太低了, 讓人有些失望.  看不懂這個把戲的人, 說不定也可以很厲害啊, 只是有點自信信人而已, 結果就被騙了…呵呵呵!

附上一支 C 語言的程式, 有興趣的人可以往下翻, 這是 Cygwin / GCC 的版本.

繼續閱讀「非死不可之怕柔」

好強的天空火 (SkyFire)

原本我的 HTC 手機上是跑 IE explore 當作預設的瀏覽器, 因為如果不這麼做的話, RSS 就會看不到. 因此就算灌其他的瀏覽器也沒有比較方便. 換了手機之後, 由於已經內建 Opera 瀏覽器, 感覺可以看的網頁頓時多了很多, 甚至於也可以在上面寫 blog 喔!

然而,  免費版的 Opera 還是讓人有些許遺憾. 因為它並不支援完整的 flash 功能, 還有網頁的排版也和 PC 上看到的不一樣. 本以為人生就這樣了, 想不到平靜的心還有浪潮…那就是有人拋出 skyfire 這個單字來! 第一時間我還以為那是 firefox 的筆誤, 但是隨即想到它可能是另外一個高竿的瀏覽器. 果然, 稍加 google 就找到了它!

http://www.skyfire.com/

Skyfire 的技術, 雖然我沒仔細研究. 但是從 performance 就可以略窺一二. 它的秘技就是先找一台 server 幫你瀏覽網頁, 然後用類似 progressive JPEG 的技術把圖秀在你的手機上. 因此, 手機上呈現的就是和 PC 上一模一樣的網頁, 感動地叫人傻眼.. 所謂雲端運算, 就是這個東西啦! 所以這個瀏覽器帶個 “天" 字 (sky)! 特別是 skyfire 的反應相當快, 明知道它是給你看圖檔而已, 卻不會有嚴重 delay 的感覺, 足可以擔得起一個 “火" 字 (fire). 因此這個名字還真不是亂取的.

因為是圖檔的形式, 瀏覽器的左上方有放大縮小鍵, 共有 5 級 zoom 可以選擇. 其他的地方都和一般 PC 的瀏覽器用起來差不多. 據說也有人用 skyfire 在 facebook 上種菜, 開餐廳之類的. 最近在臉書上種菜好像已經是全民運動了. 我去 Subway 買午餐, 就聽到兩個店員在討論養狗, 養雞有什麼用? 如果讓老人家來聽他們對話, 好像真的在種菜一樣. 若不是和養魚, 撿寶石等前後對話連貫起來, 我也聽不出有何異狀.

既然 skyfire 這麼強, 可以 porting 到我們的產品上嗎? 我看了一下他們支援的 platform, 其實只有 PC, Windows Mobile 5/6 和 Symbian S60, 沒轍啦! Skyfire 的另外一個缺點是, 不能設定自己的首頁. 反正一定要把 Skyfire 當作首頁就是了. 另一方面, 它也用自選的社交網站 widget (facebook, twitter 等) 與 RSS 的資訊 (只有英文) 來充實這個首頁, 以免使用者太過不爽~~~

下圖取自 Skyfire 網頁, http://www.skyfire.com/product, 由左至右是 Hulu, facebook, CNN, Yahoo 的網頁.

[note] 在沒有鍵盤的手機上, 如果要實現拖曳的功能, 在 skyfire 也是可以解決的, 進入右下角的 Menu ->  settings -> Show Page Drag Controls, 把這個 drag 的選項勾起來! 這樣在螢幕的右上角, 就會適時地出現兩個 icon, 箭頭的表示滑鼠左鍵, 手掌表示要拖曳, 這樣就OK了!