[討論] 解題目看漫畫 (?)

作者: s25g5d4 (function(){})()   2014-12-05 16:15:13
可能有人看標題就猜到我要說甚麼了
沒錯我昨天在西洽看到的 XDDD
https://paiza.jp/poh/enkoi
讓我驚訝的是他居然吃 Node.js!
有沒有人想嘗試搞爆他們伺服器的 (X
這實在太有趣了,所以來試著挑戰看看
順帶一提 C/C++ 的 Time Limit 是 3 秒
可是用 Node.js 寫有整整 16 秒可以用喔 XD
其實三題都很簡單
我就當作 Functional Programming 練習
先附上我的解答,內含一大堆 bad practice 傷眼注意
http://pastebin.com/E2A1un5V
一些感想:
- stdin 讀進來加到字串有可能會炸記憶體,這跟 V8 限制有關
正確的做法是用 buffer
不過這裡應該是不用擔心那麼多 (而且程式複雜度會成指數上升) XD
- stream interface 在 v0.10 有改變,我這邊還是用舊的寫法
- split 這邊可以簡化成 .split('\n') 就好
不過因為我在 windows 上測試所以要濾掉 \r
- 第二題有一點 tricky, 因為一行只有三個數字
reduce 呼叫時若沒有傳入第二個參數,那第一次呼叫 callback
callback 的第一第二個參數會是 array[0], array[1]
所以這裡 callback 只會被呼叫兩次
=> 所以這邊判斷 index != 1 的時候 p, c 分別是前兩個數字
將 p, c 相減,若為負則設為 0, 傳到下一次呼叫中
index == 1 時將 previousValue (p) 乘以 currentValue (c)
- 將字串強制轉數字有很多種方法
保險一點用 parseInt, parseFloat... 等等
或是炫泡解法 ~~str, -(-str)... 等等
這東西應該是討論到爛掉了,不過要慎用 XD
之所以用 p - -c 不用 p + ~~c 是因為這樣可以省一個字元 (?
- .map, .reduce 這些寫起來效能一定比不上迴圈
To iterate is human, to recursive, divine!
- 最後一題寫不好還是會 TLE 阿...XD
我一開始想不出不設區域變數的方法
把所有資料都傳進 reduce 又太慢 (真的會 TLE)
後來想出用 .bind 改變 this: http://pastebin.com/0p3fYXq3
這樣真的沒區域變數,可是比較慢 XDD
作者: mmis1000 (秋月戀楓)   2014-12-05 19:21:00
其實強制轉數字可以 (+str) 就行了另外建議不要+=string,而是 arrayOfString.join('')這樣會快很多
作者: mrbigmouth (大嘴先生)   2014-12-05 21:21:00
樓上的知識過期了 現在的js引擎大多做過字串加法優化至少在v8引擎直接用字串加法比較快
作者: mmis1000 (秋月戀楓)   2014-12-05 21:28:00
好吧,真的過期很久了http://pastebin.com/HSyjuQK1 不用函數稍微快一點

Links booklink

Contact Us: admin [ a t ] ucptt.com