ยกคำถามมาจากห้อง Python เรื่องของการเขียน loop ที่มีสอง iteratorถามว่าทุกท่านจะเขียนโค้ดต่อไปนี้ ไปในรูปของ Ruby ให้สวยที่สุด ได้อย่างไรบ้างครับ? ;)
for(i=0,j=1;i<10,j<12;i++,j++);
Get latest news from Blognone
Follow @twitterapi
ยกคำถามมาจากห้อง Python เรื่องของการเขียน loop ที่มีสอง iteratorถามว่าทุกท่านจะเขียนโค้ดต่อไปนี้ ไปในรูปของ Ruby ให้สวยที่สุด ได้อย่างไรบ้างครับ? ;)
for(i=0,j=1;i<10,j<12;i++,j++);
ช่วยประชาสัมพันธ์ Blognone ให้เป็นที่รู้จัก โดยลิงก์กลับมายังเรา หรือแปะไอคอนแบบต่างๆ บนเว็บไซต์ของคุณ ( ไอคอนอื่นๆ และวิธีประชาสัมพันธ์ )
Creative Commons Attribution 3.0 ©2004-2011 Blognone Crew
สวยที่สุดของแต่ละคนไม่เหมือนกันนะครับ จะเอาอะไรเป็นมาตรฐานกลางมาวัดล่ะ อิอิ
สวยที่สุดของผมคืออ่านง่าย ตรงไปตรงมา เห็นแล้วเข้าใจได้เลยทันที
ผมจะดูก่อนว่า ใน loop j ทำงานเยอะแค่ไหน ถ้าเยอะก็จะเขียน for แต่ถ้าไม่เยอะก็จะเขียนเป็น closure
สวย
for i in 0..9
for j in 1..11
puts "i=%s j=%s" % [i, j]
end
end
เหมือนจะเท่ แต่จริงๆ แล้วน่าเกลียด
10.times { |i| 11.times { |j| puts "i=%s j=%s" % [i, j+1] } }
10.times do |i|
11.times { |j| puts "i=%s j=%s" % [i, j+1] }
end
ปล. Ruby 1.8 ผมทดสอบกับ array หลักล้าน พบว่า for ทำงานเร็วกว่า each นิดนึงครับ : )
ใช่เหรอ... เหมือนจะคนละ Logic กันนะครับจากโจทย์นี่ 2 iterators มันวิ่งขนานกันไปนะ ไม่ได้ซ้อนกัน จำนวนลูปที่เป็นไปได้มากสุดคือลิมิตของตัวที่น้อยที่สุด ซึ่งจากโจทย์คือ i < 10
แต่ลูปซ้อนกันแบบนี้จำนวนลูปมันจะเป็น 10 * 11 นะ
นานๆ จะมาโพสต์สักที ขายหน้าชะมัดเลยเรา อิอิ
คือผมโง่ algorithm อย่างแรง พวกทฤษฎีต่างๆ ไม่เข้าหัวเลย .. ผมสงสัยว่าถ้าเขียน 10*11 แบบผม มันเป็น logic เดียวกันกับโจทย์ไหมครับ ถ้าใช่ มีเหตุผลอะไรที่เราต้องเขียนแบบหรูๆ แบบนั้นครับ อันนั้นถามจริงๆ ครับ
จากโจทย์ ถ้าเราสั่งแสดงผลค่า i,j ในแต่ละลูป ค่าที่ได้จะเป็น:
0,1 1,2 2,3 ... 9,10แต่การซ้อนลูปกัน ค่าที่ได้น่าจะเป็น:
0,1 0,2 0,3 0,4 ... 9,11
ขอบคุณครับ เกิดมาเพิ่งเคยเห็น iterator 2 ตัววิ่งไปพร้อมๆ กัน .. ขนลุก
มันเป็น loop เดียว
int main (int argc, char *argv[])
{
int i, j;
for(i=0,j=1;i<10,j<12;i++,j++){
printf("i: %d, j: %d \n", i, j);
// j = j + 4;
}
return 0;
}
ทำท่าลูป for แบบ C อย่างนี้ทำไมได้แฮะ
แต่ก็พอแปลงได้เป็น
i, j = 0, 1
until(i >= 10 or j >= 12) doi += 1; j += 1;
end
ความจริงใช้ while ดูจะสื่อมากกว่า แต่ Ruby มี until :P
ป.ล. ไม่ได้สวยเลย - -'
+1ไม่เคยเขียนรูบี้นะครับ แต่ถ้ามี iterator สองตัว ผมใช้ while ดีกว่า มันดูอ่านง่ายกว่านะ
ยังเห็นด้วยกับการใช้ until ครับ ;)
เพราะว่า until เป็น idiom ของ Ruby ที่ตรงกันข้ามกับ while เท่านั้นเองครับ ผมว่ามันทำให้อ่านได้คล่องกว่าการใช้นิเสธกับ while ครับ
until x >= 10 { |i| puts i }
while x < 10 { |i| puts i } # same thing :)
บล็อกของผม: http://sikachu.com
บล็อกของผม: http://sikachu.com
จากโจทย์ ต้องการวน 10 รอบ เนื่องจาก หลุด loop i ก่อน แต่เผื่ออยากใช้ j ด้วย
10.times do |i|
j = i+1
end
เอามันแบบนี้แหละ
my life
My iOS apps My blog
จริงด้วย O_o
ผมเพิ่งเห็นว่าอย่างไร i ต้องหลุดก่อนอยู่แล้ว
แต่ถ้าสมมุติ ... ใน loop มีการเพิ่มค่า j ด้วยอีก
คาดว่าจะไม่เวิร์ค T_T
ฮ่าๆ แต่ตอนแรกผมมองข้ามเรื่อง i < j ไปเลยครับ ;)
บล็อกของผม: http://sikachu.com
บล็อกของผม: http://sikachu.com
ผมว่าการเจาะจงใช้ 10.times มันเป็นการคิดเผื่อไปอีกขั้น เพราะโจทย์ต้องการแค่ i < 10
ถ้า translate โจทย์มาตรงๆ เลย น่าจะเป็นวิธีของ zdk .. แต่ผมชอบ while มากกว่านะ ผมว่าเข้าใจง่ายกว่า until ฮ่าๆ
ไม่รู้ว่าในตัวลูปเค้ามีการโมดิฟายค่าของ i กับ j หรือเปล่าน่ะครับ
ไม่กล้าเขียน Syntax น่ากลัวชมัด :'
ถ้าผลเท่ากับในโจทก์เลย
main(){}
:P
LewCPE
lewcpe.com , @wasonliw
+1
LOL!
แต่ Ruby ไม่มี main() มันก็รันครับ :P เอาเป็นไฟล์ว่างเปล่าแล้วกัน ฮี่ๆๆๆ
บล็อกของผม: http://sikachu.com
บล็อกของผม: http://sikachu.com
เต็มๆ
Blog
ไม่น่าเท่า เพราะ ruby อ่านแล้วไม่รู้เรื่อง มี exception มาแทน
onedd.net
onedd.net
ผมว่าการเจาะจงใช้ 10.times มันเป็นการคิดเผื่อไปอีกขั้น เพราะโจทย์ต้องการแค่ i < 10
ถ้า translate โจทย์มาตรงๆ เลย น่าจะเป็นวิธีของ zdk .. แต่ผมชอบ while มากกว่านะ ผมว่าเข้าใจง่ายกว่า until ฮ่าๆ .