เป็นการวาดรูปครับซึ่งผมลองวาดดูแล้วแต่มันออกมาไม่ถูกต้องครับ รบกวนช่วยอธิบายเพิ่มเติมให้หน่อยครับว่าต้องทำเป็น Array แบบไหนจึงจะให้ผลลัพธ์ออกมาถูกต้องครับ
> x = 5 จะต้องได้ ***** * *** * * * ***** x = 3 จะต้องได้ *** * *** x = 6 จะต้องได้้ ****** * **** * * * * * * ****** </blockcode> นี่เป็น Code ที่ผมลองเขียนครับแต่ผลลัพธ์ออกมาผิดครับ <blockcode [type="ruby"]> def draw22(n) n.times do |i| n.times do |j| if (i == 0 or j == n-1 or i == n-1) or (i == 2 and j == 0) or (i == 2 and j == 1) or (i == 2 and j == 2) or (i == 3 and j == 0) print "*" else print" " end end print"\n" end end draw22(5) draw22(3) draw22(6) </blockcode> ช่วยเฉลยและอธิบายให้หน่อยนะครับ ว่าหากทำเป็น arr ต้องทำยังไงครับ ขอบคุณมากครับ
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
นิหน่อย : เวลา แปะ code ถ้าใช้ blockcode จะทำให้code มันดูดีกว่านี้นะ
งงครับ อยากวาดอะไรหรอ?
ขออภัยครับรีบไปหน่อย ปรับcode ให้แล้วครับขออภัยจริง ๆ รบกวนช่วยแนะนำด้วยนะครับ ขอบคุณมากครับ
ทำยังไง(ฟะ)เนี่ย
นี่มันคือ การ resize ใช่ไหม
คำถามแรกคือ อันไหนคือ รูปพื้นฐาน
ที่ผมเคยเขียนเล่น ๆ คือผมมีรูปพื้นฐานอยู่
แล้วเขียนให้ resize แบบขยายเอา
ไม่รู้ว่าอันนี้
ที่ผมเคยเขียนจะเป็นประโยชน์กับคุณzololong ไหม
ถ้าตามโจทย์ที่คุณzololongให้มา แล้ว x=3 เป็นรูปพื้นฐาน
ผมงงว่า พอขยายแล้วทำไมมันถึงได้แบบนั้น
หรือถ้า โจทย์ที่คุณ zololong ให้มา มี x=6 เป็นรูปพื้นฐาน
ผมก็นึก algorithm ในการ resize แบบลดขนาดไม่ออกแฮะ
ไม่รู้ว่าจะเอาอะไรมาตัดสินว่าจะตัดจุด (*) ไหนออกไปดี
ต้องให้พี่ ๆ คนอื่นช่วยซะแล้วแบบนี้ >_<
มันคือ recursive มั๊ง แหม ข้อนี้เห็นแล้วคิดถึงอดีต
คิดถึงอดีตแปลว่าเคยทำมาแว้ว
พี่ sugree เฉลยที :D
ลืมไปแล้ว เขียนตั้งแต่สมัย pascal โน่น ต้องคิดใหม่
อ๋ออออออ โอเค เก็ตแว้ว
ขอบคุณพี่sugree ครับ บอก recursiveแล้วใช่เลย
วนเป็นแบบก้นหอย
โอ้ว ข้าน้อยปัญญาน้อยนิดขอคารวะ
เดี๋ยวไปคิดก่อน
เห็นบางคน เขาเรียก snail-shell
http://channel8.msdn.com/Posts/Walking-a-multi-dimensional-array-in-the-...
กำลังคิด งุงิงุงิ
ที่ผมเขียนคงดูอุบาทแหง ๆ เลย
ทำได้แว้วววว เย้ มึนอยู่ตั้งนาน code ตัวเองดูหดหู่ยังไงก็ไม่รู้ซิ T_T
โอยปวดคอ สนุกดีทำข้อนี้ ตอนแรกมึนอยู่นานมาก
ขอบคุณพี่sugree ที่บอกว่าเป็น recursive ไม่งั้นผมคงดูไม่ออก
แต่ถึงบอกว่าเป็น recursive คนไม่ได้เรื่องalgo อย่างผมก็นั่งดู
อยู่นานเหมือนกันว่าจะ recursive ยังไงหว่า วู๊ว อ่อนจริง ๆ(ว่าตัวเอง)
ที่ผมทำรูปมันจะต่างกับอันข้างบนหน่อยนึง จากรูปข้างบน ตอนวน
รอบแรก (ตรงขอบอ่ะ) เส้นที่ 1 กับเส้นที่ 2 มันต้องติดกัน ไม่ใช่หรอ
ผมซื่อไปหน่อย ไปคิดว่ามันไม่ติดอย่างที่เห็น นั่งงมอยู่นาน จะ recursiveไง
ให้ได้อย่างงั้นว๊า ลองเอาไปสั่งให้มัน output ดูละกันเน้อ
คราวนี้อธิบายไอเดีย
ไอเดียก็ไม่ยาก อาศัยการดูความห่างจากขอบเป็นหลัก
ลองนั่งสมาธิไปเรื่อย ๆ จะเห็นเป็นรูปน้องอ้อยลอยมา เอ้ย ไม่ใช่
พิจารณาที่ x=5 ที่มีขนาด ความกว้างสูงสุด =6 จะพบว่า การวนมันมีลักษณะคือ
( o แทนช่องว่าง , x แทนเส้นที่ลาก + แทนจุดที่จะลากต่อ เน้อ)
-กวาดไปทางขวาทีแรก ไม่ห่างจากขอบเลย
xxxxxx
ooooo+
ooooo+
ooooo+
ooooo+
oooooo
จะเห็นว่าเส้นที่จะวาดต่อ จะห่างจากขอบบน 1 ช่อง
และจะห่างจากขอบล่าง 1ช่อง
-ต่อมา การเส้นลากไปด้านล่าง
xxxxxx
ooooox
ooooox
ooooox
o++++x
oooooo
จะเห็นว่า เส้นที่จะวาดต่อ ห่างจากขอบซ้าย 1 ช่อง และขอบขวา 1 ช่อง
-ต่อมา ลากเส้นไปทางซ้าย เส้นนั้นจะห่างจากขอบทางซ้าย 1 ช่อง ขอบทางขวา 1ช่อง ขอบ
ข้างล่าง 1 ช่อง
xxxxxx
ooooox
o+ooox
o+ooox
oxxxxx
oooooo
จะเห็นว่า เส้นที่จะวาดต่อ อยู่ห่างจากขอบ บน 2 ช่อง ขอบล่าง 2 ช่อง
-ต่อมาลากเส้นขึ้น เส้นนั้นจะห่างจากขอบทางซ้าย 1 ช่อง ขอบข้างล่าง 2ช่อง และขอบ
ด้านบนอีก
xxxxxx
ooooox
ox++ox
oxooox
oxxxxx
oooooo
จะเห็นว่าเส้นที่จะวาดต่อ ห่างจากขอบซ้าย 2 ช่อง และขอบขวา 2ช่อง
อะไรทำนองนี้ จากตรงนี้เราก็จะเห็นแล้วว่าจะ recursive ยังไง
ต่อมาที่ต้องเคลียร์ให้ได้คือ จะหยุด recursive ตอนไหน
อันนี้สังเกตนิดนึงก็พอจะเดาออกว่า จะหยุด เมื่อ ความห่างจากขอบ
มีค่ามากกว่า ความกว้าง(หรือสูง)/2
พอได้ไอเดียตรงนี้แล้วก็เอาไปเขียนต่อได้ สบายแฮ
ออ จากโจทย์ ผมใช้ n แทนความสูงของวง เพราะฉนั้นตอน
สร้าง array ที่เอาไว้เก็บ เลยสร้างเป็น array ขนาด n+1
แล้วก็ code ข้างบนนี้ ตอนทำผมวนจาก ล่างขึ้นบน
ก่อนผมสั่งprint เลยต้อง reverse ก่อนเพื่อให้ได้รูปตามโจทย์
หวังว่าผมจะไม่เขียนให้งงน๊ะครับ :D
นอนหลับแล้ววันนี้ ฮิ้วว
รู้สึกอนาถไอเดียตัวเอง ทำไมต้อง recursive แบบมีทิศด้วยฟระ(ฮา)
ดูจากอันที่พี่ป๊อกแปะ link ไว้แล้ว เค้า iterate ที่นึง ทั้งสี่ทิศเลย
แล้วค่อย recursive ผมเล่น recursiveเป็นทิศ ๆ เอา -_-"
ว้อววว โชว์นูบอีกแล้วอ๊ะ
โทษทีครับ พิมพ์ตกอ๊ะ เอาไปใช้แบบนี้เน้อ
มันมี recursive อีกแบบด้วยนะ
ถ้ามองที่ N = 8
******** * ****** * * * * * * * * * **** * * * ********จะเห็นว่ามี N=6 วางซ้อนแบบกลับหัวอยู่
****** * **** * * * * * * ******ส่วน N=6 ก็จะเห็นว่ามี N=4 วางซ้อนอยู่เช่นเดียวกัน
กรณี 3,5,7,... ก็เช่นกันครับพี่ pok
ผมแยกได้เป็นสอง แบบ มี เลขคู่ 2,4,6,... กับเลขคี่ 3,5,7,...
f 1 = * f 2 = ** * f 3 = *** * *** f n = (วาดบรรทัดบน n ตัว)+(ข้างขวาลงมาอีก n-1ตัว)+(ด้านล่างนับจากขวาอีก 1 ตัว)+ (วาด leftRotate(180 องฮา,f(n-2)) ลงที่ตำแหน่ง ล่างซ้าย)ได้คร่าวๆประมาณนี้ เดี๋ยวกลับบ้านจะไปลองกับ haskell ดู
เอาโค้ด javascript ไปก่อนแล้วกันครับผม
ผมก็ว่าจะลอง haskell อยู่เหมือนกัน
ลอง haskell บ้าง
เริ่มด้วยรูปทรงพื้นฐาน (ตัว C กลับด้าน)
-- base 3 = ["***", -- " *", -- "***"] -- -- base 4 = ["****", -- " *", -- " *", -- "****"] -- -- for n = 4 -- hbar = "****" -- rbar = " *" -- base n = [hbar] ++ (replicate (n-2) rbar) ++ [hbar] where hbar = replicate n '*' rbar = (replicate (n-1) ' ') ++ ['*']ต่อด้วย function ปรับขนาด dimension ด้วยการแปะ space
วัตถุประสงค์ก็คือเพื่อให้สะดวกต่อการวางรูปซ้อนกัน
-- patch (base 3) 5 = [" ", -- " ", -- "*** ", -- " * ", -- "*** "] -- patch xs n = replicate diff blankline ++ [ x ++ (replicate diff ' ') | x <- xs] where blankline = replicate n ' ' diff = n - (length xs)function ถัดไป ก็คือการวงรูป operlap กัน
-- ["****", [" ", ["****", -- " *", over "*** ", => "****", -- " *", "* ", "* *", -- "****"] "*** "] "****"] over xs ys = zipWith over' xs ys where over' linex liney = zipWith over'' linex liney over'' x y | x == ' ' = y | otherwise = xอีกอันที่จำเป็นก็คือ การพลิกรูป ซึ่งเราต้องทำทั้งแนวตั้งและแนวนอน
สุดท้ายก็ define รูปของเราได้
ทดลอง render ด้วย function นี้
ทดลองเรียก
คัว function pic เขียนผิดไปหน่อย
จริงๆแล้วมันเป็นอย่างนี้ได้เลย
ตามอ่านมาจากบลอกอีกทีครับ ชอบแนวคิดนี้มากครับ เลยอยากลองเขียนด้วยไพธอนดู แต่เนื่องจากคอมเมนต์ในบลอกพี่ป้อกไฮไลท์ไม่ได้ จึงเข้ามาตอบในนี้ครับ
แนวคิดเหมือนกันทุกอย่างครับ เพียงแต่ใช้ numpy แทน
ถ้าเดา code ไม่ผิด
นี่ bow คิดกลับทางกับคนอื่นอีกแล้วไช่เปล่า
แทนที่จะ recursive จากใหญ่ไปเล็ก
ของ bow นี่เริ่ม build จากรูปเล็กไปรูปใหญ่
negative thinking จริงๆด้วย
โจทย์ข้อนี้เขาบอกขนาดใหญ่สุดไม่ใช่เหรอ นั่งวาดใน text editor เลย if ... p print :-P
---
http://blog.vee-u.com/
ขอบคุณมากครับ พี่ ๆทุกคนมากครับ T_T ทำมัยผมถึงได้คิดอะไรไม่ออก
งงโจทย์อยู่นานครับ พอพี่ป้อกบอก snail-shell ถึงได้เข้าใจ
ผมทำในแบบที่ผมถนัดครับ คือ numpy + array slicing
update อธิบายเพิ่มครับ เพราะเจ้าของกระทู้ให้สอนการบ้าน ไม่ได้ให้เฉลยการบ้าน
หลักการคือ แทนที่จะเริ่มด้วยพื้นที่ว่าง ก็เริ่มด้วยรูปดาวก่อน โดยการสร้าง array ขนาด n*n สมาชิกทุกตัวมีค่าเป็น 1 (บรรทัด sn = ones((n,n))) แล้วมาพิจรณาว่า position ไหนของ array ควรจะเป็น 0 บ้าง (ซึ่งยากตรงนี้) หากได้แล้ว ก็แทนค่า array ที่เป็น 1 ด้วยดาว 0 ด้วยพื้นที่ว่าง
การหา position ของ array ที่เป็น 0 แยกได้เป็น 4 กรณีใหญ่ ๆ คือ บน => ขวา => ล่าง => ซ้าย วนไปเรื่อย ๆ เลยใช้ modulo 4 ใน การแยก 4 กรณีใหญ่ ๆ ซึ่งต้องวนลูปทั้งหมด n-2 ครั้ง แต่กรณีแรก เหมือนกันหมดไม่ว่า n มีขนาดเท่าไร เลยมีบรรทันนี้ sn[1,:n-1] = 0
ที่เหลือก็นั่งคิดเลขเอาครับ ว่าพอเป็นกรณีที่ 1 (บน) ต้องแทนค่าด้วยศูนย์ row ไหน จาก column ไหนถึง column ไหน กรณีที่ 2 (ขวา) ต้องแทนค่าด้วยศูนย์ column ไหน จาก row ไหนถึง row ไหน ไปเรื่อย ๆ
แล้วก็ในกรณี n เป็นเลขคู่จะมีเลขศูนย์เพิ่มขึ้นมาหนึ่งตัว ตรงกลาง เลยต้องมีบรรทัดนี้ if n%2 == 0 : sn[n/2,n/2-1] = 0
ส่วนบรรทัดที่เหลือก็แปลง หนึ่งเป็นดาว ศูนย์เป็นพื้นที่ว่างครับ
โอ้ว สุดยอด ผมชอบไอเดียนี้อ่ะ >_<
เห็นพวกนี้แล้วจะเป็นลม
sn[(i+1)/2:(i+1)/2+(n-i-1),n-(i+3)/2]
อีกอย่าง คิดกลับทางแบบนี้ ถือว่าเป็นพวก negative thinking :)
เหอ ๆๆๆ พี่ป้อกนี่ดูคนจากโค้ดได้เก่งจริง ๆ ครับ :D
ลองเขียนแบบมองในมุมมองของหอยทากดู (หอยทากที่เดินเป็นวงหอย) แนวคิดคือแปลงข้อมูลให้มาอยู่ในรูปของ path ก่อน
เช่นหากขนาดของตารางเป็น 5 หอยทากจะเดินไปในทิศทาง rrrrddddlllluurrx (ขวา ล่าง ซ้าย บน ขวา และหยุดกินใบไม้)
โค้ดเข้าใจง่ายดีครับ
ผมว่าโจทย์มันยากเกินกว่าจะเป็นข้อสอบได้อยู่แล้วครับ
ขอบคุณครับ แต่พึ่งเห็นว่าผมมีแอบปล่อยบั๊กเล็กๆด้วย แหะๆ
แบ่ง abstraction ได้สวยดี
ทำให้ code อ่านง่าย
มีใครทำแบบไม่ต้อง allocate array มาก่อนบ้างได้ไหมครับ?
โห..วิธีเพียบเลยครับ แต่ข้อ 3 กับ ข้่อ 4 จากกระทู้ ช่วยสอนการบ้านหน่อยครับ ยังไม่ได้เฉลยและอธิบายเลยครับ รบกวนด้วยครับ ขอบคุณมากครับ