scanf 102

ในการเขียนโปรแกรมแนวคอมโอ เมื่อเขียนด้วยภาษา C จะมีโจทย์บางแบบ ที่ถ้าเรา scanf ดีๆ แล้วจะทำให้ชีวิตง่ายขึ้นมาก เพราะถ้าเราเอา C มาจัดการ string ชีวิตจะเศร้าลงทันที

วันนี้ผมนั่งทำโจทย์ Tree summing ใน uva แล้วหาวิธีการ scanf แนวที่ให้มัน check คล้ายๆ regular expression แล้วก็ไม่เจอข้อมูลเป็นชิ้นเป็นอัน (หรือหาไม่ดีเองหว่า?)  เลยพยายามนั่งทำแล้วรวบรวมมาให้ครับ ถือเป็นวิชา scanf 102 ต่อจากวิชา 101 พื้นฐานที่เราใช้รับเลข รับ string กันเป็นอยู่แล้ว

  • scanf(“%[ABC]”,str)
    • คือ scan ไปเรื่อยๆ ตราบที่ยังเจอเฉพาะ A,B,C แล้วเอาใส่ str
  • scanf(“%[^ABC]”,str)
    • คือ scan ไปเรื่อยๆ ตราบที่ “ไม่เจอ” แต่ A,B,C แล้วเอาใส่ str
    • scan ครั้งต่อไปจะเจอ A เป็นตัวแรก
  • การมี * อยู่หน้า [] คือการ scan อะไรที่เข้าเงื่อนไข ทิ้ง
  • ตัวอักษรที่ไม่ได้อยู่ตาม % ก็คือทิ้งเหมือนกัน เจอตัวอะไรก็ ทิ้งตัวนั้น 1 ตัว
  • scanf(“%*[^(]”)
    • คือ ทิ้งทุกตัวจนกว่าจะเจอ วงเล็บเปิด ‘(‘
    • ก่อนหน้านี้ลอง ทิ้งตัวที่อาจจะเจอ เช่น scanf(“%*[\n ]”); แล้วปรากฏว่าไม่ชัวร์เท่าวิธีนี้ครับ
  • scanf(“(%[-0-9]”,str)
    • แปลว่า เอาเครื่องหมาย – และตัวเลข 0-9
    • ความหมายเดียวกับ scanf(“%[-1234567890]”,str);
  • result = scanf(“(%[-1234567890]”,str);  ควรมีตัวแปรเก็บค่า return
    • อาการที่เหมือนว่ามัน scan เอาค่าเดิมเข้าไป (เช่น print ตัวแปรที่รับค่านั้นออกมาซ้ำ) จริงๆ แล้วคือ มัน scan ไม่เข้า
    • อาการนี่ check ได้โดยการ if(result==0) ถ้าเป็น 0 ชัวร์ได้เลยว่า ตัวแปรจะไม่รับค่าใหม่ใดๆ

ตัวอย่าง code นี้จะสามารถอ่าน tree ในแบบในโจทย์ออกมาได้เลย เมื่อเรียก gentree(0) เช่น

input = (5(4(11(7()())(2()()))()) (8(13()())(4()(1()()))))
output = num[0]=5 num[1]=4 num[3]=11 num[7]=7 num[8]=2 num[2]=8 num[5]=13 num[6]=4 num[14]=1

void gentree(int where){
    int num;
    int result;
    scanf("%*[^(]");
    result = scanf("(%d",&num);
    if(result!=0){
        printf("num[%d]=%d ",where,num);
        gentree(where*2+1);
        gentree(where*2+2);
    }
    scanf("%*[^)])");
}

Tree Summing

จดหมายเหตุปิดเทอม ’49 [1]

ผมไม่ได้เขียน blog มานานมากเลย
ช่วงเวลาที่ว่างเว้นไปนี้ มีอะไรเกิดขึ้นมากมายกับชีวิต อาจจะเรียกว่าได้เป็นจุดเปลี่ยนของชีวิต
 
จำได้ว่า พ่อเคยไปดูหมอ แล้วบอกว่า ชีวิตของนายอิ๊กคนนี้ จะเปลี่ยนไปประมาณทุกๆ 17 ปี…  อืม… ที่จริงคงไม่เกี่ยว

หลายๆ ครั้งที่รู้สึก เกิดแรงบันดาลใจอยากขึ้นมาเขียนมาก แต่ว่า มันไม่มีเวลาจริงๆ
จริงๆ ครับ ให้ตายเถอะ มันทำไมชีวิตมันถึงมีอะไรต้องทำขนาดนี้ก็ไม่รู้
ครั้งนี้จะเขียน blog แบบไม่คิดละกัน เขียนแบบเขียนไปเรื่อยๆ เหมือนเขียนไดอารี่เลย 

ความจริงข้อหนึ่งที่ผมนึกได้มาได้สักพักหนึ่งก็คือ ผมรู้สึกอุ่นใจเมื่อได้เขียนแล้วอัพขึ้นมาบนนี้ครับ
เหตุผลก็คือ โอกาสที่มันจะหายไปนั้น มีอยู่น้อยมาก เพราะข้อมูลในนี้ต้องถูกเก็บไว้โดย msn แล้ว server ของ msn ไม่มีทางล่มอยู่แล้ว
ข้อมูลเหล่านี้ก็จะได้เก็บไว้อย่างดี ตลอดไป ดีใจเป็นบ้า ฮาฮาฮาฮา

คือ ที่นึกแบบนี้ขึ้นมาได้ก็เพราะ ผมเขียน ไดอารี่เก็บในเครื่องด้วย ที่นี่เวลาเครื่องมีปัญหา แล้วก็เสียวไส้ทุกทีว่า ไดอารี่จะหายไหม
ฝากไว้กับ msn นี้แหล่ะ ปลอดภัยดี
(เอ๊ะ หรือ space มันมีระบบเหมือน hotmail หรือเปล่า …ถ้าไม่มาอัพเดท จะถูกตัดทิ้ง ใครรู้ช่วยบอกที)

ตั้งแต่ปิดเทอมมานี้ เริ่มต้นด้วย การเข้าค่ายโอลิมปิกคอมพิวเตอร์เป็นครั้งสุดท้ายของผมละกัน 
ประมาณ กลางเดือนมีนา ถึง ปลายเดือนเดียวกัน
รอบที่เข้าครั้งนี้ เป็นรอบ 20 คนสุดท้ายของประเทศไทยแล้ว หลังจากที่คัดๆๆๆๆ จาก สอวน. สสวท. มาหลายรอบเหลือเกิน มองกลับมาจากตอนนี้เอง ก็น่าตกใจเหมือนกันนะ ว้าว ผมมาถึงรอบแบบนี้เลยหรอเนี่ย

ความรู้สึกของการอยู่ท่ามกลาง 20 คนเหล่านี้ ไม่ธรรมดาเลยครับ 
เวลาคุยในเรื่องวิชาการ คำนวณ คืออะไรเทือกๆ นี้ น้อยครั้งที่จะรู้สึกว่า ไอ้พวกบ้านี้มันคุยบ้าอะไรกันอยู่ มากเท่าอยู่ในค่ายนี้
การใช้ชีวิตในค่ายนี้ เป็นอะไรที่ผมบ้าระห่ำที่สุด ฟิตการเรียนที่สุดในชีวิตแล้ว 
 
นั้นก็คือ ตื่นตอน 8.30 ไม่อาบน้ำ แค่แปรงฟันแล้วก็เปลี่ยนชุด (ไม่อาบน้ำ 555)
แล้วก็เข้าห้องเรียนตอน 9 โมง เรียนๆๆ แล้วก็กินอาหารว่างที่ค่ายเตรียมไว้ให้(อาหารเช้าของผม เพราะตื่นไม่ทันกินอาหารเช้าไง)
ตอน 10.30 แล้วเรียนๆๆต่อ 
กินอาหารตอนเที่ยง 
ระหว่างพักเที่ยง ผมจะฟิตฝึกทำโปรแกรมต่อ ก่อนเข้าเรียนตอนบ่ายโมง 
เรียนไป มีปฏิบัติเขียนโปรแกรมไป ถึงบ่าย 4 โมง จะมีเวลาพัก 1 ทุ่ม ระหว่างนี้ผมพักผ่อนตีปิงปองและไปเขียนโปรแกรมต่อบ้าง
อาจารย์ให้โจทย์ฝึกเขียนโปรแกรมต่อถึง 4 ทุ่ม
ผมมักจะอยู่ทำต่อถึงเที่ยงคืน เพราะทำไม่ทันเท่าไหร่ (จบค่ายเหลือโจทย์ที่ทำไม่ได้อยู่หลายข้อเลย)
อาจารย์มาปิดห้องเรียน ผมก็แบกคอมขึ้นไปเขียนโปรแกรมต่อที่ห้องนอน ถึงประมาณระหว่าง ตี1 ถึง ตี3 แล้วแต่วัน แล้วก็นอน

เป็นชีวิตที่ มีแต่การเขียนโปรแกรมจริงๆครับ ทุ่มเทที่สุดในชีวิตแล้ว ผมรู้ว่าผมทุ่มเทมากกว่าคนอื่นๆหลายๆคน แต่ผมก็ไม่ติดรอบ 10 คนสุดท้ายอยู่ดี 
แต่ก็ยังคุ้มกับแรงที่เสียไป เรียกได้ว่า จากค่ายนี้ผม พัฒนาฝีมือการเขียนโปรแกรมมากขึ้นมาก(พัฒนาความคิดด้วยรู้สึกได้เลย) มากกว่าตอนค่าย 30 คนที่เข้าพร้อมกับเตี้ย(พลับ วิดวิน)มากเลยเพราะฟิตมากกว่าเยอะ ผมรู้ดีว่าถ้าผมไม่ฟิตแบบนี้ จากที่อยู่ระดับกลางๆของห้อง จะต้องอยู่ระดับล่างๆของห้องแน่นอน 

แม้ผมคิดว่าสิ่งที่เรียนไปนั้น ผมเข้าใจทุกๆอย่าง และที่ผมทำข้อสอบได้น้อยกว่าคนอื่นนั้น เป็นเพราะประสบการณ์ที่น้อยกว่า มีหลายๆคนที่เคยเข้าค่ายนี้มาแล้วเมื่อปีที่แล้ว เค้ามาเรียน รอบ 2 รอบ 3 ย่อมได้เปรียบ ถ้าผมถ้าเรียนบ้าง ไม่มีทางแพ้แน่ๆ แต่ ไม่เป็นไรมัน แก้ไขอะไรไม่ได้ ผมเข้ามาช้ากว่าคนอื่นเอง

ถ้าผมได้เข้ารอบถัดไป ก็จะมีสิทธิ์ที่จะได้ทุนไปเรียนเมืองนอก ฟรีๆ เฮ้อ… พลาดไปแล้ว
จบลงแล้วครับ หนทางคอมพิวเตอร์โอลิมปิกของผม มันปิดฉากลงแล้ว ปีหน้าผมเข้ามหาลัยก็ไม่มีสิทธิ์อีกต่อไปแล้ว

ยังไงก็ตาม ผมคิดว่า มันจบลงด้วยความประทับใจ
หนทางที่เริ่มต้นด้วยการรู้จักพี่นัท เรียนกับพี่นัท สอบสสวท.ครั้งแรกตกรอบไปอย่างเฉี่ยวๆ จึงเข้าเรียนค่ายสอวน.แทน ค่าย1… ค่าย2… ในเกษตรนั้นง่ายดาย ก่อนจะไปรอบต่อไป ผมตัดสิทธิ์ตัวเองด้วยการไม่สอบ และไปเป็นนักเรียนแลกเปลี่ยนที่โรเชสเตอร์ เริ่มใหม่…ปีใหม่ ผมรู้สึกว่าผม ไม่มีทางที่จะสอบสสวท.ครั้งที่2ตกรอบแน่ๆ ตอนนั้นติวเด็กคนอื่นๆไปสอบด้วยซ้ำ แต่ผมสอบไม่ติด ตอนนั้นร้องไห้เลย ผิดหวังครั้งแรกๆในชีวิต นี่คือจุดที่ทำให้ผมอดเข้าสสวท.ตั้งแต่ ม.5 

ผมเลยเข้าสอวน. ค่าย 1 ค่าย 2 ค่าย 3 ผ่านไปแบบสุดจะตื่นเต้น ถ้าผมตกรอบทุกอย่างมันก็จบ สอบทั่วประเทศได้เหรียญ เลยได้เข้ารอบ สสวท. แบบไม่ต้องสอบ หลังรอบปฏิบัติสสวท. แล้วติดก็ดีใจมากๆ ที่จะได้โควตาแล้ว หลังจากนี้ก็มาเข้าค่าย 30คน 20คนแล้วก็ตกรอบไป

ถามว่าผม ได้อะไรจากเส้นทางเส้นนี้… คอมพิวเตอร์โอลิมปิก… อืม…
แน่นอนมันทำให้ผมเขียนโปรแกรมเป็น และคล่องกว่าคนอื่น พอเรียนมหาลัย ผมได้เพื่อนที่สนใจทางเดียวกัน
แต่ให้ตาย ที่ชอบสุดๆคือ การฝึกคิดที่ได้สั่งสมมานี้ มันดีจริงๆ

ทุกอย่างที่ได้มา มันดีมากๆจนผมรู้สึกว่า ผมอยากให้น้องๆได้เข้ามาบ้างจัง 
เพราะผมจะไม่ลืมเลยว่า ช่วงชีวิตนึงนะ เราก็ได้มาเข้าสู่วงจรระห่ำๆ บ้าๆ อันนี้มาด้วย

โปรดติดตามต่อตอนไป เร็วๆนี้