โจทย์ข้อสองตามมา
ให้แปลง Numeric เป็น String ที่มี comma คั้นแต่ละ 3 digits หน้าจุดทศนิยม
ตัวอย่างเช่น
ให้ 19999999999.55 แปลงเป็น “19,999,999,999.55”
ให้ 19999995.99 แปลงเป็น “19,999,995.99”
โค้ดสำหรับ benchmark
require 'benchmark' ITERATION = 500 def measure(fls,&block) ITERATION.times { block.call } end fls = [] 400.times do fls << sprintf("%0.2f",rand() * (10**11)).to_f end br = Benchmark.bmbm do |b| b.report("Running #{ITERATION} iterations") do measure(fls) { fls.each do |t| # ใส่โค้ดเพื่อทดสอบตรงนี้ end } end end
ผมก็เริ่มศึกษา ROR มาสักระยะแล้ว ก็ได้เคยลอง ๆ ทำตามเวปของnectech ทำให้ได้รู้แต่ว่า โค้ดแต่ละส่วน ทำหน้าที่อย่างไร การโปรเซสของแต่ละเซคชั่นมีทิศทางไปทางไหน ฐานข้อมูลควรออกแบบอย่างไร
แต่ตอนนี้ ผมอยากก้าวข้ามไปอีกขั้น (ไม่รู้ว่าก้าวยาวไปไหม) โดยการศึกษา ROR opensource ของทางฝรั่ง จึงทำให้เกิดปัญหาว่า ผมควรรู้อะไรบ้างก่อนที่จะนำโปรเจคของเขามาศึกษา หรือมาพัฒนาต่อ เพราะจากความรู้ที่เคยศึกษามานั้นคิดว่ามันยังไม่ตรงจุดซักเท่าไหร่
รบกวนขอผู้มาชี้แนะด้วยนะครับ (ไม่รู้ว่าผมถามคำถาม วกไปวนมาหรือไม่)
อยากหาอะไรให้ Ruby Forum เล่นกันสนุกๆ (เห็นช่วงนี้เงียบมาก) ถ้าใครได้เริ่มเขียน Ruby มาบ้าง จะรู้ว่าเวลาทำอะไรแต่ละอย่าง มันมีวิธีแก้หลายวิธีเหลือเกิน (There’s more than one way to do it) บางทีก็เสียเวลากว่าจะตัดสินใจว่าควรจะใช้วิธีไหนดี ซึ่งบางคนก็เน้นว่าเขียนแบบนี้แหละรันเร็วสุด บางคนก็สนใจว่าเขียนแบบนี้สวยสุด บางคนก็บอกว่าใช้งานได้พอแล้ว :) (แนวใครแนวมัน)
เลยอยากมี Series โจทย์ไว้เล่นกันแต่ละอาทิตย์ ใครจะตั้งโจทย์ก็ได้(แล้วใครจะตั้งโจทย์? คุยกันอีกที) เรียกว่า CNRuby Series (Codenone Ruby Series) ละกัน
แต่ขอเป็นโจทย์ง่ายๆ (เน้นว่าง่ายๆ) แต่มีอะไรให้เล่น วิธีแก้(code) ออกมาไม่ควรเกิน 20 บรรทัด ไม่เอาแบบโจทย์โอลิมปิก codegolf..etc. เห็นแล้วเหนื่อย และหลายคนในนี้คงไม่ว่างทำ จุดประสงค์ก็เพื่อ อยากให้เห็นว่าปัญหาเล็กๆง่ายๆ มันก็มีวิธีแก้หลายแบบ มีข้อดีข้อเสียในแต่ละวิธีนั้นอย่างไรบ้าง Ruby โปรแกรมเมอร์แต่ละท่านเขียนกันอย่างไร อยากให้ทุกคนได้ร่วมตอบง่ายๆ ไม่ต้องเสียเวลาทำนาน
Winner จะมีสองแบบคือ 1.Style Award- เขียนสวยสุด (ช่วยกันเลือก?) 2.Performance Award-เขียนออกมาแล้วรันเร็วสุด (คนตั้งโจทย์มี benchmark code ให้) (ไม่มีรางวัล :) )
เริ่มต้นด้วย
CNRuby-1
โจทย์: กำหนัดตัวแปร str เป็น String นับจำนวนคำซ้ำที่อยู่ใน String นั้น และเก็บผลลัพท์ในโครงสร้างแบบ Hash
ตัวอย่างเช่น สมมติ ให้
str = "Ruby is a dynamic, open source programming language with a focus on simplicity and productivity."ให้แปลงเป็น
{"productivity"=>1, "and"=>1, "a"=>2, "focus"=>1, "language"=>1, "simplicity"=>1, "programming"=>1, "ruby"=>1, "on"=>1, "source"=>1, "dynamic"=>1, "with"=>1, "open"=>1, "is"=>1}
โค้ดไว้สำหรับทดสอบ speed
require 'benchmark' ITERATION = 500 def measure(&block) ITERATION.times { block.call } end str = "" 5000.times do str << (('a'..'z').to_a[rand(26)] + ('a'..'z').to_a[rand(26)] + ('a'..'z').to_a[rand(26)]+ ('a'..'z').to_a[rand(26)])[0..rand(3)] + ' ' end br = Benchmark.bmbm do |b| b.report("Running #{ITERATION} iterations on string length #{str.length}") do measure { # ใส่โค้ดเพื่อทดสอบตรงนี้ } end end
จะมีคนเล่นด้วยรึเปล่าเนี่ย
ป.ล. ผล benchmark รันบน OSX, Intel Core 2 Duo, 2.4 GHz, RAM 4 GB, Bus 800 MHz
ประกาศผล :P
[Speed Winner]
def count_word2(str) hash = Hash.new(0) str.each(' ') do |word| hash[word] += 1 end hash end
from pphetra
[Style Winner]
def count_word(str) hash = Hash.new(0) str.split.each do |word| hash[word] = hash[word] + 1 end hash end
from pphetra
พยายามอ่านเรื่อง regular expression จาก http://www.thaijobmarket.com/regularex.html แต่ไม่ประสบความสำเร็จครับ เลยต้องรบกวนผู้รู้
ผมมี string อยู่ตัวหนึ่ง
s = “\192.192.1.107\FileRadioSp\032002\002-20020307004.mp3”
ต้องการใช้ regular expression ตัดให้เหลือแค่
“\192.192.1.107\FileRadioSp\032002”
โดยมีหลักการว่า ตัด string ที่อยู่หลัง \ ตัวสุดท้ายออกให้หมด รวมทั้งตัว \ เองด้วย
ผมพยายามทำโดยใช้คำสั่ง
o = s.gsub(/[*]$/,”) <- แต่ไม่สำเร็จแน่ๆ
ps. มีใครอยากเปิดสอน regular expression หรือเปล่าครับ :’( อยากเรียนมาก
จะมีการสอน RoR ฟรีครับรยละเอียด ประมาณวันที่ 5-6 กรกฎาคม ครับหัวข้อ การทำ Software ประเภท Social Network ด้วย (j)RoR ครับเนื้อหาจะเหมือนหนังสือชื่อ RailsSpace ครับ เตรียมไป clear คิวกันให้ดีครับ
ตอนนี้ยังขาด TA ครับ ติดตามต่อได้ที่นี่ครับ http://www.narisa.com/forums/index.php?showtopic=23552
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น