Ruby
或是Perl
寫的時候,因為計算量太大,然後程式沒有辦法在一分鐘內跑完。
本來是想用之前學的C/C++
來寫的,不過看到最近golang
這麼熱,就來學一下啦!
先來記錄一些學習的資料
這些應該夠我看一段時間了:)
]]>rvm
給反安裝掉了,然後換成了rbenv
來用用。會換過來的原因只是覺得rbenv
比較輕量,而不是覺得rvm
真的有什麼不好。
來記錄一下要怎麼轉換過來。
這個應該是最簡單的一步XD
1
|
|
然後再將你zsh
或bash
中的這一句拿掉。
1
|
|
我是透過Homebrew去安裝的。
1 2 |
|
要安裝ruby-build
的原因是因為可以比較簡單的去安裝各個版本的ruby。
然後是把~/.rbenv/bin
加到你的$PATH
中。
1
|
|
再來是將rbenv init
加到你的shell中。
1
|
|
重新載入設定。
1
|
|
裝個好用的plugin Aliases for rbenv Ruby versions
1 2 3 4 |
|
最後當然是來裝個最新的ruby 2.0來玩玩:p
1
|
|
1 2 3 4 5 6 |
|
先寫到這裡,之後有什麼心得再補上來。
]]>大家在上傳文章前必做的兩個指令就是
1 2 |
|
不過它其實可以簡化成
1
|
|
就可以把兩個指令併成一個指令了!
之前都不知道要如何新增一個新的頁面出來,直到最近(遮臉)
其實就跟新增文章的指令一樣new_post[your_post]
,新的頁面的指令就是new_page[your_page]
,它就會產生一個makedown的檔案讓妳去編輯。之後妳需要做的就是將連結放到妳想要的地方了。
這題好像出奇的簡單啊啊啊啊,我的做法是把這六種數列的頭兩位數字做成一個表,然後用後兩位數去查有沒有合的數字,然後就一直查下去,直到有六個數字分別來自六個數列並頭尾相連成一圈。
附上程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
rad
,它是去運算一個整數的所有的質因數的乘積。題目要問的就是請我們對1~100000
中的數字用rad的大小做排序(如果rad一樣大,就再用數字的大小去做排序)之後,問排序後第10000的數字是誰?
其實這題我們並不用去真的對數字去做排序,甚至也不用有個大質數表來做質因數分解:p
我的想法就是去推廣 Sieve of Eratosthenes,但是不是將數字給刪除,反倒是將它建成一個表,去記錄她被哪些質數給整除過,然後在用rad的數字去建一個表,將rad值一樣的數字存入,最後在去算第10000的數字是誰就好了:D
附上程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
這樣子就可以很快的算出答案了:D
]]>134468
。反之,如果一個數字從左到右的各個位數是不嚴格遞減的話,那我們就說這種數字叫做遞減數,像是66420
。如果一個數字從左到右的各個位數字,不是屬於上述的兩種狀況之一的話,我們就稱它是彈性數(Bouncy Number)。
現在問題來了,想要請問小於10^100
中的數字中,有多少不是彈性數?
好吧,這題其實不是太難,如果妳的高中數學沒有忘的話:)
遞增數的個數是C(109, 9) - 1
,遞減數的個數是C(110, 10) - 101
,又遞增又遞減的有9 * 100
個,所以就只要寫個binomial的函數就可以了:D
附上程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
所以只要善用數學,題目還是可以用很簡單的方法解出來的:D
]]>0~9
當中,問的是有幾種不同的骰子組合可以組出01, 04, 09, ..., 81
,也就是所有的小於一百的平方數。
不過有一點要注意的就是說,題目提到可以將6
和9
混用,所以會比較多組答案。
這題最直接的想法就是將所有的骰子的組合給拿出來檢驗,如果可以組出所有的平方數的話,就讓答案加一。
總之,實做上不難,讓我們直接來看程式碼吧!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
實際上跑起來也是挺快的:P 看來因為組合數沒有很大的關係:)
BTW,這題是我在ProjectEuler上解的第一百五十題,呼~~
又往前多進了一步了:D
]]>問題就是要去問說,在一千萬以下,有多少數字會跑到89?
由於經過一次操作過後,數字和一定不會超過567,所以我們可以做一個表,然後去看在0到567中間的數字會停在1或者是89。之後在去檢查小於一千萬裡面的數,有多少會掉到會回到89的數裡面,就可以算出來答案了。
可是寫出來的程式跑的不是很快,讓人心情不是很好,所以就想了另一個演算法。
後來想想,如果像是1234567
的7!
種組合,其實經過一次操作後,都會回到同一個數字,可是我之前的做法就會重複算了7!
次,就會慢了許多,因為一直重複算一樣的東西。
所以新的做法,我是先去算出小於一千萬的數字經過一次操作後,所有可能的數字還有她們的組合數,然後再去看她們有多少會跑到89。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
這樣改寫後,速度有十分大的提升啊,不到一秒就算完了,看來之後這種題目還是多花一點心思想一下好了。
Happy Number:http://en.wikipedia.org/wiki/Happy_number
]]>玩遊戲學Ruby,聽起來挺不錯的,不過要怎麼開始?
首先當然要把遊戲先裝起來啊!!先把Ruby Warrior的gem給裝一下
1
|
|
再來執行rubywarrior
後,就可以新增帳號開始玩了!
遊戲主要是藉由去修改player.rb
,然後去執行rubywarrior
後,看看妳寫的程式是否可以過關:)
一開始你會發現你的player.rb
長的像這樣
1 2 3 4 5 |
|
十分的乾淨… 不過幸好,第一關也是很簡單,只要一直向前走,就可以過關了:D 就像下面的這樣:
1 2 3 4 5 |
|
這樣就可以過第一關了:D
不過我想這個遊戲的最大樂趣應該就是靠自己寫的程式過關吧:p 所以我也不多分享程式碼了,如果有卡關的再一同討論吧:D
]]>這是一個由西洋棋來的問題,問說是否可以找到一種放置八個皇后的方法,使得八個皇后不會相互吃到對方,也就是說整個棋盤會被八個皇后給蓋住。
在軍中的時候,其實有跟資工的同梯談過這個問題,他說這種題目通常有兩種重要的取向,一個是最快解出一組解,另一個是最快解出所有的解。
不過因為我用的語言不是C/C++,感覺也不用跟別人爭什麼最快,就開開心心的解就好了。
我在公車上想這個問題的時候,第一個跑入腦中的就是「八城堡問題」。我得說,可能真的找不到這個名字的問題,不過我覺得是個很好的簡化。
其實我們做的事情就是將皇后換成了城堡,不過這個問題就簡單很多了,因為只要是一個一到八的排列就是解答了。例如給出[1, 2, 3, 4, 5, 6, 7, 8],就對應到(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8)這八個點,很明顯就是個八城堡的解。我們得到了一組八城堡的解,也就快得到一組八皇后的解了,因為我們只要去看檢查對角線的方向,是不是有蓋到對方,就可以知道是不是一組八皇后的解了。
有了想法,實現就不難,下面附上我的ruby寫法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
果然是很輕鬆就解決了XD,希望還有寫出下一個更快速的解法的機會:P
]]>題目是這樣說的,有一種數叫做cyclic number,仔細的性質大家就去看一下Wikipedia上的介紹吧,這裡就不多加說明了。那麼題目要找的是一個開頭是00000000137
,而結尾是56789
的一個唯一的cyclic number,然後請我們算出它的數字和。
這個數字我是在高中的時候第一次聽到的,當時聽到的時候真是十分的驚訝,原來這世界上有這麼美的數字。
後來在學校的BBS裡面發現有很多更深入的討論,所以也對這種類型的數字有了一點點初步的了解。
BTW,在我大學的時候參加迎新宿營的時候,剛剛好也出了類似的題目,所以也就順手秒殺了XD,據說當時嚇到很多學長姐,因為他們本來想用這題來拖點時間的,結果沒有想到人算不如天算啊XDDD
那麼這題的解題關鍵是什麼呢?其實每一個cyclic number都會有一個跟它對應的分數(如果妳不知道,可以看看上面wiki的連結,裡面應該是會有講才是。),像是142857
對應的就是1/7
:p
所以現在問題就變成找一個質數p
使得下面的事情成立:
1/p
它前面的位數是0.00000000137
(10^(p - 1) - 1) / p
的後面幾位是56789
9 * (p - 1) / 2
就會是它的數字和了(wtf!?)前兩點聽起來很合理,但是第三點是什麼?為什麼這樣就可以算出來數字和呢?
原因是這樣的,我們知道1/p
的循環節長度是p-1
,而又因為1/p + (p - 1)/p = 1 = 0.999...
,所以我們知道數字和就是9 * (p - 1) / 2
,是不是很漂亮呢:p
下面附上程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
真是美麗的一題,謝謝Project Euler:)
]]>題目是要找出一個唯一的正整數,使得它的平方長得要像1_2_3_4_5_6_7_8_9_0
這種形式。因爲數字是平方數,不難判斷最後是00
結尾,所以要判斷的地方就更少了一點。解决的方法是直接採用暴力法,從上界往回找,直到符合這個形式。
程式碼:
1 2 3 4 5 6 7 8 9 10 11 |
|
本來還想對做平方的數字做最佳化,其實奇數也只有3跟9的平方尾數會是9,但是没有最佳化的程式就跑得夠快了,所以就懶得最佳化了:p
]]>老師心中想了一個兩位數。他把這兩位數的兩個數字和告訴了A,把這個兩位數的正因數個數告訴了B。
A:我不知道。
B:我也不知道, 但我知道是否為偶數。
A:我知道了。
B:我也知道了。
請問此兩位數是誰?
以前自己做這種題目,都是拿著筆一個一個慢慢淘汰,不過今天要選擇用把我的解題邏輯寫成程式碼,讓電腦幫我做淘汰這件事情:p
附上我的程式碼跟解題邏輯:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
程式碼很多地方没有最佳化,因爲數字都還蠻小的(遮臉),如果有更好的寫法,還請不吝指教一下:D
解題邏輯也很直觀,就照着對話依序删减可能的數字,最後一步就會跑出唯一的解答。
下次有機會在分享一些有趣的題目:D
]]>我引述Project Euler網站的一段話:
“Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics.”
所以,如果你也是上面所說的人,那麼就一起加入吧!
題目 這題其實不難,用手算其實絕對可以的,但是既然是用來練習程式,那我們就來寫吧!
1 2 3 4 |
|
程式碼也很簡單好懂,這要感謝Python的List Comprehensions,讓程式碼看起來就是很舒服好懂:)
題目 這題只要照著Fibonacci number的定義下手,就不難了,没有什麼特别的技巧。
1 2 3 4 5 6 7 8 9 10 |
|
照着Fibonacci Number的定義打一下,就幾乎是程式本身了,還算簡單吧:D
題目 這題希望我們找出最大的質因數,主要的想法就是從2開始慢慢往上找質因數,找到最後一個,那它就是答案了:)
1 2 3 4 5 6 7 8 9 |
|
題目 這題在問説用兩個三位數乘出來最大的迴文數是誰?很單純的想法就是把三位數的乘積都算出來,然後判斷它是不是迴文數。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
在這裡順道附上euler.py的内容,你會發現用Python判斷迴文數出奇的簡單:D
題目 這題要找1~20的最小公倍數,簡單的想法就是我們做一個求最大公因數的函式就好了:)
1 2 3 4 5 6 7 8 9 |
|
最大公因數的演算法放在euler.py裏面:p
這次先分享五題,希望我會有耐性把我寫過的題目一題一題的打出來。
]]>我們先來看一下程式碼:
1 2 3 4 5 |
|
其實這是最重要的問題,如果它一點都不正確,那它一點都不值得討論。
讓我們來做一些驗證:
1 2 3 4 5 |
|
看起來好像是對的,不過這是爲什麼?我們總不能試了幾個整數就説它是正確的,這樣不太講道理。
其實原理很簡單,我們一段一段來解釋清楚。
首先是^1?$
的部分,這段是用來解决當數字是0或者是1的特殊情况,所以當出現的數字是0或者是1的時候就會被比對到,程式就會輸出false
。
後面的^(11+?)\1+$
是在做什麼呢?\1+
是代表前面(11+?)
的内容要重覆一次以上。哪(11+?)
是幹什麼用的呢?它的作用就是用來比對長度從2開始1..1
的字串,所以如果你輸入的數字是一個合數,那麼就會被比對成功,程式就會輸出false
。
所以老實說,我們不用太期待這個程式碼會多有效率,只是寫起來很酷罷了,Just for fun!
]]>