Tags:
Forums: 

ยกคำถามมาจากห้อง Python เรื่องของการเขียน loop ที่มีสอง iterator
ถามว่าทุกท่านจะเขียนโค้ดต่อไปนี้ ไปในรูปของ Ruby ให้สวยที่สุด ได้อย่างไรบ้างครับ? ;)


for(i=0,j=1;i<10,j<12;i++,j++);

Get latest news from Blognone
By: tonkla
Ubuntu
on 16 September 2009 - 23:35 #125242

สวยที่สุดของแต่ละคนไม่เหมือนกันนะครับ จะเอาอะไรเป็นมาตรฐานกลางมาวัดล่ะ อิอิ

สวยที่สุดของผมคืออ่านง่าย ตรงไปตรงมา เห็นแล้วเข้าใจได้เลยทันที

ผมจะดูก่อนว่า ใน 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 นิดนึงครับ : )

By: BLeAm on 16 September 2009 - 23:42 #125248 Reply to:125242

ใช่เหรอ... เหมือนจะคนละ Logic กันนะครับ
จากโจทย์นี่ 2 iterators มันวิ่งขนานกันไปนะ ไม่ได้ซ้อนกัน จำนวนลูปที่เป็นไปได้มากสุดคือลิมิตของตัวที่น้อยที่สุด ซึ่งจากโจทย์คือ i < 10

แต่ลูปซ้อนกันแบบนี้จำนวนลูปมันจะเป็น 10 * 11 นะ

By: tonkla
Ubuntu
on 16 September 2009 - 23:51 #125249 Reply to:125248

นานๆ จะมาโพสต์สักที ขายหน้าชะมัดเลยเรา อิอิ

คือผมโง่ algorithm อย่างแรง พวกทฤษฎีต่างๆ ไม่เข้าหัวเลย .. ผมสงสัยว่าถ้าเขียน 10*11 แบบผม มันเป็น logic เดียวกันกับโจทย์ไหมครับ ถ้าใช่ มีเหตุผลอะไรที่เราต้องเขียนแบบหรูๆ แบบนั้นครับ อันนั้นถามจริงๆ ครับ

By: BLeAm on 16 September 2009 - 23:57 #125250 Reply to:125249
  1. ไม่เหมือนครับ เป็นคนละ Logic
  2. จากโจทย์มันไม่ได้เป็นการเขียนหรูๆ แต่มันคนละประโยชน์ใช้งานกันเลย

จากโจทย์ ถ้าเราสั่งแสดงผลค่า i,j ในแต่ละลูป ค่าที่ได้จะเป็น:
0,1 1,2 2,3 ... 9,10
แต่การซ้อนลูปกัน ค่าที่ได้น่าจะเป็น:
0,1 0,2 0,3 0,4 ... 9,11

By: tonkla
Ubuntu
on 16 September 2009 - 23:58 #125252 Reply to:125250

ขอบคุณครับ เกิดมาเพิ่งเคยเห็น iterator 2 ตัววิ่งไปพร้อมๆ กัน .. ขนลุก

By: zdk
WriteriPhoneBlackberryUbuntu
on 30 October 2009 - 16:42 #125257 Reply to:125252
zdk's picture

มันเป็น 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;
}

By: zdk
WriteriPhoneBlackberryUbuntu
on 17 September 2009 - 00:05 #125254
zdk's picture

ทำท่าลูป for แบบ C อย่างนี้ทำไมได้แฮะ

แต่ก็พอแปลงได้เป็น

i, j = 0, 1
until(i >= 10 or j >= 12) do
i += 1; j += 1;
end

ความจริงใช้ while ดูจะสื่อมากกว่า แต่ Ruby มี until :P

ป.ล. ไม่ได้สวยเลย - -'

By: gudome
ContributoriPhoneWindows
on 17 September 2009 - 00:34 #125265 Reply to:125254

+1
ไม่เคยเขียนรูบี้นะครับ แต่ถ้ามี iterator สองตัว ผมใช้ while ดีกว่า มันดูอ่านง่ายกว่านะ

By: Sikachu
ContributoriPhoneIn Love
on 17 September 2009 - 03:39 #125293 Reply to:125265
Sikachu's picture

ยังเห็นด้วยกับการใช้ 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

By: sarunw
Contributor
on 17 September 2009 - 02:01 #125286

จากโจทย์ ต้องการวน 10 รอบ เนื่องจาก หลุด loop i ก่อน แต่เผื่ออยากใช้ j ด้วย

10.times do |i|
j = i+1
end

เอามันแบบนี้แหละ

my life


My iOS apps
My blog

By: Sikachu
ContributoriPhoneIn Love
on 17 September 2009 - 03:36 #125292 Reply to:125286
Sikachu's picture

จริงด้วย O_o

ผมเพิ่งเห็นว่าอย่างไร i ต้องหลุดก่อนอยู่แล้ว
แต่ถ้าสมมุติ ... ใน loop มีการเพิ่มค่า j ด้วยอีก
คาดว่าจะไม่เวิร์ค T_T

ฮ่าๆ แต่ตอนแรกผมมองข้ามเรื่อง i < j ไปเลยครับ ;)

บล็อกของผม: http://sikachu.com


บล็อกของผม: http://sikachu.com

By: tonkla
Ubuntu
on 17 September 2009 - 12:17 #125337 Reply to:125286

ผมว่าการเจาะจงใช้ 10.times มันเป็นการคิดเผื่อไปอีกขั้น เพราะโจทย์ต้องการแค่ i < 10

ถ้า translate โจทย์มาตรงๆ เลย น่าจะเป็นวิธีของ zdk .. แต่ผมชอบ while มากกว่านะ ผมว่าเข้าใจง่ายกว่า until ฮ่าๆ

By: gudome
ContributoriPhoneWindows
on 17 September 2009 - 18:01 #125394 Reply to:125286

ไม่รู้ว่าในตัวลูปเค้ามีการโมดิฟายค่าของ i กับ j หรือเปล่าน่ะครับ

By: wearetherock
BlackberryUbuntu
on 17 September 2009 - 02:04 #125287

ไม่กล้าเขียน Syntax น่ากลัวชมัด :'

By: lew
FounderJusci&#039;s WriterMEconomicsAndroid
on 17 September 2009 - 10:57 #125323
lew's picture

ถ้าผลเท่ากับในโจทก์เลย


main(){}

:P

LewCPE


lewcpe.com, @wasonliw

By: shelling
ContributoriPhoneAndroidUbuntu
on 17 September 2009 - 11:17 #125330 Reply to:125323
shelling's picture

+1

By: Sikachu
ContributoriPhoneIn Love
on 17 September 2009 - 18:51 #125401 Reply to:125323
Sikachu's picture

LOL!

แต่ Ruby ไม่มี main() มันก็รันครับ :P เอาเป็นไฟล์ว่างเปล่าแล้วกัน ฮี่ๆๆๆ

บล็อกของผม: http://sikachu.com


บล็อกของผม: http://sikachu.com

By: HyBRiD
ContributoriPhoneSymbianUbuntu
on 19 September 2009 - 23:11 #125704 Reply to:125401
HyBRiD's picture

เต็มๆ

Blog

By: wiennat
Writer
on 23 September 2009 - 12:15 #126436 Reply to:125323

ไม่น่าเท่า เพราะ ruby อ่านแล้วไม่รู้เรื่อง มี exception มาแทน

onedd.net


onedd.net

By: folksur on 3 September 2021 - 15:16 #1222196

ผมว่าการเจาะจงใช้ 10.times มันเป็นการคิดเผื่อไปอีกขั้น เพราะโจทย์ต้องการแค่ i < 10

ถ้า translate โจทย์มาตรงๆ เลย น่าจะเป็นวิธีของ zdk .. แต่ผมชอบ while มากกว่านะ ผมว่าเข้าใจง่ายกว่า until ฮ่าๆ .