วันพุธที่ 26 สิงหาคม พ.ศ. 2558

ฝึกการเเก้โจทย์ด้วย Python โจทย์ "สามวงเล็บ (Threeparen)"

โจทย์ "สามวงเล็บ (Threeparen)"

       พิจารณาสตริงที่ประกอบด้วยเครื่องหมายวงเล็บ 3 ชนิด คือวงเล็บกลม ( ) วงเล็บเหลี่ยม [ ] และวงเล็บปีกกา { } เราจะเรียกสตริงหนึ่งว่าเป็น "สตริงวงเล็บสมดุล" เมื่อวงเล็บในสตริงนั้นสามารถจับคู่กันได้อย่างถูกต้อง ซึ่งเราสามารถนิยามสตริงวงเล็บสมดุลอย่างเป็นทางการได้ดังนี้
       1. (), [] และ {} เป็นสตริงวงเล็บสมดุล
       2. ถ้า A เป็นสตริงวงเล็บสมดุล แล้ว (A), [A] และ {A} ก็เป็นสตริงวงเล็บสมดุลเช่นกัน
       3. ถ้า A และ B เป็นสตริงวงเล็บสมดุล แล้ว AB ก็เป็นสตริงวงเล็บสมดุลเช่นกัน
       สังเกตว่า เราจะสามารถสร้างสตริงวงเล็บสมดุลความยาวต่างๆ ได้โดยใช้กฎสามข้อข้างบนนี้ เช่น เราสามารถสร้าง [(){}] โดยเริ่มจากใช้กฎข้อที่ 1 สร้าง () และ {} แล้วใช้กฎข้อที่ 3 สร้าง (){} แล้วจึงใช้กฎข้อที่ 2 สร้าง [(){}]

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

ข้อมูลนำเข้า
บรรทัดแรกระบุจำนวนเต็ม Q (2 ≤ Q ≤ 10) แทนจำนวนคำถามทั้งหมด
อีก Q บรรทัดต่อมา ในบรรทัดที่ i+1 (1 ≤ i ≤ Q) จะมีสตริงในคำถามที่ i ซึ่งแต่ละสตริงจะประกอบไปด้วยเครื่องหมายวงเล็บกลม วงเล็บเหลี่ยม หรือวงเล็บปีกกาเท่านั้น และแต่ละสตริงจะมีความยาวไม่เกิน 100,000

ข้อมูลส่งออก
มีทั้งหมด Q บรรทัด โดยในบรรทัดที่ i (1 ≤ i ≤ Q) ให้พิมพ์ yes ถ้าสตริงในคำถามที่ i เป็นสตริงวงเล็บสมดุล และพิมพ์ no ถ้าสตริงในคำถามที่ i ไม่เป็นสตริงวงเล็บสมดุล

การให้คะแนน
30% ของข้อมูลทดสอบ สตริงในคำถามทุกสตริงจะประกอบด้วยวงเล็บเพียงชนิดเดียวเท่านั้น คือวงเล็บกลม
50% ของข้อมูลทดสอบ สตริงในคำถามทุกสตริงจะมีความยาวไม่เกิน 100
15% ของข้อมูลทดสอบ จะสอดคล้องกับเงื่อนไขด้านบนทั้งสองข้อ 

ที่มา
การแข่งขัน IOI Thailand League เดือนมิถุนายน 2553
โจทย์โดย: สุธี เรืองวิเศษ

ตัวอย่างข้อมูลนำเข้า ตัวอย่างข้อมูลส่งออก
3
(())            yes
(()))(()        no
(()())() yes 
3
({])[]          no
[({}])          no
()[{}()] yes

ความช่วยเหลือ: ไม่มีคำใบ้สำหรับปัญหานี้
ที่มาของโจทย์www.programming.in.th

วิเคราะห์โจทย์ 

  • รับค่าข้อมูลจำนวน 2 ค่า คือค่า จำนวนข้อมูลที่ต้องการตรวจสอบ เเละ ข้อมูลของ วงเล็บ
  • ทำการตรวจสอบข้อมูลว่าถูกต้องหรือไม่

เเนวคิดในการเเก้โจทย์ 

  • ทำการตรวจสอบเป็น "คู่" ว่าถูกต้องหรือไม่ถ้าถูกก็ให้เอาข้อมูลออกจาก List เเล้วเอาข้อมูลใน List ไปตรวจสอบ คือถ้ายังมีข้อมูลเหลืออยู่ใน List เเสดงว่าข้อมูลนั้นไม่ถูกต้อง เเต่ถ้าไม่มีข้อมูลเหลืออยู่เเสดงว่าข้อมูลนั้นถูกต้อง  

Code Python 

 
     def Get_Data(Input):
         New_List = []
             for i in range(len(Input)):
                 New_List.append(Input[i])
         return Check_Twain(New_List)
                       
     def Check_Twain(List_Data):
         for b in range(int((len(List_Data)/2)+1)):
             for a in range(len(List_Data)-1):
                 if List_Data[a] == "(" and List_Data[a+1] == ")" or List_Data[a] == "[" and List_Data[a+1] == "]" or List_Data[a] == "{" and List_Data[a+1] == "}":
                     List_Data.pop((a+1))
                     List_Data.pop(a)
                     break
         return len(List_Data)  
  
     Input_Number = int(input("กรุณาใส่จำนวนข้อมูลที่ต้องการตรวจสอบ : "))
     List_Data = []

     for i in range(Input_Number):
         List_Data.append(input("กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : "))
    
     for s in range(len(List_Data)):
         if Get_Data(List_Data[s]) > 0 :
             print (" no")
         else: 
             print(" yes")
                                                                  

ผลลัพธ์ที่ได้... 


         กรุณาใส่จำนวนข้อมูลที่ต้องการตรวจสอบ : 3
         กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : (())
         กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : (()))(()
         กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : (()())()
          yes
          no
          yes

         กรุณาใส่จำนวนข้อมูลที่ต้องการตรวจสอบ : 3
         กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : ({])[]
         กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : [({}])
         กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : ()[{}()]
          no
          no
          yes


ฝึกการเเก้โจทย์ด้วย Python โจทย์ "เติมวงเล็บ"

โจทย์ "เติมวงเล็บ"

       ให้สตริงที่ประกอบไปด้วยวงเล็บเปิด ‘(‘ และวงเล็บปิด ‘)’  จงคำนวณหาจำนวนวงเล็บเปิดหรือปิดที่น้อยที่สุดที่ต้องเติมในสตริงดังกล่าว เพื่อทำให้วงเล็บเปิดและปิดจับคู่กันได้อย่างถูกต้อง  (สำหรับนิยามอย่างเป็นทางการของการจับคู่ได้อย่างถูกต้องดูได้จากส่วนอธิบายเพิ่มเติมท้ายโจทย์)

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

ข้อมูลนำเข้า
มีบรรทัดเดียวเป็นสตริงที่ประกอบด้วยวงเล็บเปิดและวงเล็บปิด ความยาวไม่เกิน 200 ตัวอักษร

ข้อมูลส่งออก
มีหนึ่งบรรทัด เป็นจำนวนเต็มแทนจำนวนวงเล็บที่น้อยที่สุดที่ต้องเติมเข้าไปในสตริงเพื่อให้เป็นสตริงที่ถูกต้อง
คำอธิบายเพิ่มเติม (ไม่จำเป็นนักต่อการทำโจทย์)

       สำหรับสตริงที่ประกอบไปด้วยวงเล็บเปิดและวงเล็บปิด เราจะกล่าวว่าสตริงดังกล่าวมีการจับกันของวงเล็บเปิดและปิดอย่างถูกต้อง ก็ต่อเมื่อเราสามารถจับคู่วงเล็บเปิดกับวงเล็บปิดได้แบบ 1 ต่อ 1 โดยที่สอดคล้องกับเงื่อนไขต่อไปนี้:  ถ้าวงเล็บเปิดที่เป็นอักขระที่ i จับคู่กับวงเล็บปิดที่เป็นอักขระที่ j ในสตริง เราจะได้ว่า
  • i < j (วงเล็บเปิดอยู่หน้าวงเล็บปิด)
  • สำหรับวงเล็บเปิดใด ๆ ที่อยู่ที่ตำแหน่ง a ที่ i < a < j, วงเล็บเปิดนั้นจะต้องจับคู่กับวงเล็บปิดที่อยู่ที่ตำแหน่ง b ที่ a < b < j เท่านั้น
  • และในทางกลับกัน วงเล็บปิดใด ๆ ที่อยู่ที่ตำแหน่ง a ที่ i < a < j, วงเล็บปิดนั้นจะต้องจับคู่กับวงเล็บเปิดที่อยู่ที่ตำแหน่ง b ที่ i < b < a เท่านั้น เช่นกัน
ที่มา : IOI Thailand League 2010 เดือนพฤษภาคม

ตัวอย่างข้อมูลนำเข้า ตัวอย่างข้อมูลส่งออก
())(         2
(()()))()) 2

ความช่วยเหลือ: ไม่มีคำใบ้สำหรับปัญหานี้
ที่มาของโจทย์www.programming.in.th

วิเคราะห์โจทย์ 

  • รับค่าข้อมูลจำนวน 1 ค่า คือข้อมูลวงเล็บ
  • ทำการตรวจสอบข้อมูลว่าข้อมูลต้องใส่วงเล็บอีกกี่ตัวจึงจะทำให้ ข้อมูลชุดนั้นถูกต้อง

เเนวคิดในการเเก้โจทย์ 

  • ทำการตรวจสอบเป็นคู่เเล้วถอดออกจาก List ถ้าถูกต้อง เมื่อครบรอบการตรวจสอบก็จะได้ List ออกมาที่ทำการถอดคู่ที่ถูกต้องออกไปเเล้ว ถ้าเหลือเเสดงว่านั้นคือจำนวนวงเล็บที่ต้องเติม เเต้ถ้าไม่เหลือ เเสดงว่าข้อมูลนั้นถูกต้องเเล้ว

Code Python 

 
     Input_Data = input("กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : ")
     List_Data = []
     for i in range(len(Input_Data)):
          List_Data.append(Input_Data[i])
     for b in range(int((len(List_Data)/2)+1)):
          for a in range(len(List_Data)-1):
              if List_Data[a] == "(" and List_Data[a+1] == ")" :
                  List_Data.pop((a+1))
                  List_Data.pop(a)
                  break
     print("มีวงเว็บที่ต้องใส่เพิ่มอีกจำนวน "+str(len(List_Data))+" วงเล็บ")
                

ผลลัพธ์ที่ได้... 


        กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : ())(
        มีวงเว็บที่ต้องใส่เพิ่มอีกจำนวน 2 วงเล็บ

        กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : (()()))())
        มีวงเว็บที่ต้องใส่เพิ่มอีกจำนวน 2 วงเล็บ

        กรุณาใส่ข้อมูลที่ต้องการตรวจสอบ : ()(())()
        มีวงเว็บที่ต้องใส่เพิ่มอีกจำนวน 0 วงเล็บ
               

การติดตั้ง Python Plug-in ใน Eclipse

การติดตั้ง Python Plug-in ใน Eclipse 

       Plug in  คือ โปรแกรมเสริมชนิดหนึ่ง ที่จะเพิ่มความสามารถให้กับโปรแกรมหลัก ซึ่งเราจะติดตั้งเพื่อใช้งาน หรือไม่ติดตั้งก็ได้ โดย Plug in ถูกออกแบบให้มีความสามารถเฉพาะอย่าง ซึ่งเป็นความสามารถเสริมที่ช่วยให้โปรแกรมหลักทำงานได้ดีขึ้น เช่นช่วยเพิ่มลูกเล่นต่างๆให้โปรแกรมหลัก หรือเพิ่มความสามารถพิเศษบางให้โปรแกรมหลัก ตัวอย่าง Plug in ก็เช่น ถ้าใช้โปรแกรม  Windows Media Player แล้วดูไฟล์บางประเภทไม่ได้ ก็ต้องลงโปรแกรม Codec เพิ่ม ในกรณีนี้โปรแกรม Codec ถือเป็น Plug in นั้นเอง หรืออย่างเช่นในการชมวีดีโอ ผ่าน Web browser หากวีดีโอไม่สามารถเปิดได้ ก็ต้องลงโปรแกรม Adobe Flash Player ดังนั้น Adobe Flash Player จึงถือเป็น Plug in ในที่นี้คือ PyDev ที่เป็น Plug in ของ Python ที่ใช้กับโปรเเกรม Eclipse

       ขั้นตอนที่ 1 ให้เราเปิดโปรแกรม Eclipse ขึ้นมาครับ


       ขั้นตอนที่ 2 ไปที่ Help -> Install New Software  กด Add จากนั้นจะมีหน้าต่าง Add Repository ขึ้นมาครับให้กรอก Name: PyDev และ Location: http://pydev.org/updates ดังรูปครับ


       ขั้นตอนที่ 3 จากนั้นจะมี Software ขึ้นมาให้เราเลือกตามรูปครับ กดเลือกและกด Next ไปเรื่อยๆตามประสาการ Install Software เลยครับ จากนั้นก็รอๆ และเมื่อเราลงเสร็จโปรแกรมจะให้ทำการ Restart Eclipse ครับ



       ขั้นตอนที่ 4 ทำการเซต preference ของไพทอน ไปที่ Window -> Preferences จากนั้นเลือก PyDev -> Python - Interpreter


       ขั้นตอนที่ 5 คลิก Advanced Auto-Config จากนั้นให้เลือก Python ตามที่เราต้องการในที่นี้ผมจะเลือก Python3.4 น่ะครับ กด ok ตามรูป





       ขั้นตอนที่ 6 ทดลองเขียนโปรแกรม ไปที่ Window -> Open Perspective -> Other จากนั้นเลือก PyDev แล้วกด OK


       ขั้นตอนที่ 7 ไปที่ File -> New -> Other... คลิกที่ PyDev แล้วเลือก PyDev Project ดังรูปครับ



       ขั้นตอนที่ 8 คลิกขวาที่ src -> New -> PyDer Module





เสร็จสักทีนะครับวิธีลง PyDev คราวนี้ท่านผู้อ่านจะได้เขียนโปรแกรม Python สบายๆสักที

ปัญหาที่พบระหว่างลง Plug-in

     ปัญหาที่พบระหว่างลง Plug-in คือ ตอนเเรกลงเเล้วไม่ได้ก็เลยลอง Updates Eclipse ดูปรากฏว่าเมื่อทำการ Updates Eclipse เสร็จเเล้วก็สามารถลง Plug-in ได้ตามปรกติครับโดยเข้าไปที่
     Help -> Check for Updates

การติดตั้ง Eclipse บน Linux Ubuntu

Eclipse คืออะไร




      Eclipse คือโปรแกรมที่ใช้สำหรับพัฒนาภาษา Java ซึ่งโปรแกรม Eclipse เป็นโปรแกรมหนึ่งที่ใช้ในการพัฒนา  Application Server ได้อย่างมีประสิทธิภาพ และเนื่องจาก Eclipse เป็นซอฟต์แวร์ OpenSource ที่พัฒนาขึ้นเพื่อใช้โดยนักพัฒนาเอง ทำให้ความก้าวหน้าในการพัฒนาของ Eclipse เป็นไปอย่างต่อเนื่องและรวดเร็ว
      Eclipse มีองค์ประกอบหลักที่เรียกว่า Eclipse Platform ซึ่งให้บริการพื้นฐานหลักสำหรับรวบรวมเครื่องมือต่างๆจากภายนอกให้สามารถเข้ามาทำงานร่วมกันในสภาพแวดล้อมเดียวกัน และมีองค์ประกอบที่เรียกว่า Plug-in Development Environment (PDE) ซึ่งใช้ในการเพิ่มความสามารถในการพัฒนาซอฟต์แวร์มากขึ้น เครื่องมือภายนอกจะถูกพัฒนาในรูปแบบที่เรียกว่า Eclipse plug-ins ดังนั้นหากต้องการให้ Eclipse ทำงานใดเพิ่มเติม ก็เพียงแต่พัฒนา plugin สำหรับงานนั้นขึ้นมา และนำ Plug-in นั้นมาติดตั้งเพิ่มเติมให้กับ Eclipse ที่มีอยู่เท่านั้น Eclipse Plug-in ที่มีมาพร้อมกับ Eclipse เมื่อเรา download มาครั้งแรกก็คือองค์ประกอบที่เรียกว่า Java Development Toolkit (JDT) ซึ่งเป็นเครื่องมือในการเขียนและ  Debug โปรแกรมภาษา Java 
      ข้อดีของโปรแกรม Eclipse คือ ติดตั้งง่าย สามารถใช้ได้กับ J2SDK ได้ทุกเวอร์ชั่น  รองรับภาษาต่างประเทศอีกหลายภาษา มี plugin ที่ใช้เสริมประสิทธิภาพของโปรแกรม  สามารถทำงานได้กับไฟล์หลายชนิด เช่น HTML, Java, C, JSP, EJB, XML และ GIF  และที่สำคัญเป็นฟรีเเวร์ (ให้ใช้งานได้ 90 วัน ถ้าจะใช้งานเต็มประสิทธิภาพต้องเสียค่าใช้จ่ายภายหลัง) ใช้งานได้กับระบบปฏิบัติการ Windows, Linux และ Mac OS

ตัวอย่างโปรแกรม Eclipse 

การติดตั้ง Eclipse บน Linux Ubuntu

      ติดตั้งผ่าน Ubuntu Software Center
      ขั้นตอนการติดตั้งก็เพียงแค่เปิด Ubuntu Software Center จากนั้น Search หาคำว่า ‘Eclipse’ วิธีการนี้ น่าจะเป็นวิธีการที่สะดวกที่สุด แต่ข้อเสียคือ จะไม่ใช่เวอร์ชั่นล่าสุด โดยเวอร์ชั่นที่สูงสุดใน Ubuntu Software Center คือ 3.8 แต่ปัจจุบัน Eclipse ออกเวอร์ชั่น Kepler 4.3 แล้ว

      ติดตั้งผ่าน Ubuntu Software Center

      ติดตั้งผ่าน Command-Line
      วิธีการนี้ เหมือนกับการติดตั้งผ่าน Ubuntu Software Center เพียงแต่ไม่มีหน้าตา UI มาให้ แค่ใช้คำสั่งผ่าน command line แทน วิธีการติดตั้งคือ 
        sudo apt-get install eclipse

ติดตั้งผ่าน Command-Line

ที่มาของข้อมูล     http://mindphp.com
                            http://devahoy.com

วันจันทร์ที่ 24 สิงหาคม พ.ศ. 2558

ฝึกการเเก้โจทย์ด้วย Python โจทย์ "ABC..."

โจทย์ "ABC..."

     กำหนดจำนวนเต็มบวก 3 จำนวน คือ A B และ C ซึ่งค่าที่กำหนดให้ทั้งสามตัวอาจจะไม่ได้เรียงลำดับไว้ให้ เพียงแต่เราทราบเป็นที่แน่นอนว่า A มีค่าน้อยกว่า B ส่วน B มีค่าน้อยกว่า C 

โจทย์
     จงเรียงตัวเลขทั้งสามตัวตามลำดับที่กำหนดมาให้

ข้อมูลนำเข้า
     บรรทัดแรกประกอบด้วยตัวเลข 3 ตัว คือ A B และ C ซึ่งอาจจะไม่ได้เรียงลำดับไว้ โดยที่ตัวเลขทั้ง 3 ตัวเป็นตัวเลขจำนวนเต็มบวกที่มีค่าไม่เกิน 100
     บรรทัดที่สองประกอบด้วยตัวอักษรภาษาอังกฤษ 3 ตัว คือ A B และ C โดยที่ไม่มีเว้นวรรคคั่นระหว่างตัวอักษรทั้งสาม ซึ่งแสดงถึงลำดับที่โจทย์ต้องการ

ข้อมูลส่งออก
     มีทั้งหมด 1 บรรทัด แสดงตัวเลขทั้งหมดเว้นช่องว่างระหว่างตัวเลข 1 ช่อง และเรียงลำดับตามที่โจทย์ต้องการ 

ที่มา: Croatian Open Competition in Informatics
contest 2 – November 25, 2006
ตัวอย่างข้อมูลนำเข้า           ตัวอย่างข้อมูลส่งออก
1 5 3
ABC           1 3 5
6 4 2
CAB           6 2 4

ความช่วยเหลือ: ไม่มีคำใบ้สำหรับปัญหานี้
ที่มาของโจทย์www.programming.in.th

วิเคราะห์โจทย์ 

  • รับค่าข้อมูลจำนวน 2 ค่า คือค่า ตัวเลข เเละค่า ABC... 
  • ทำการเรียงข้อมูลตาม ABC... ซึ่ง A < B < C < D .... < Z

เเนวคิดในการเเก้โจทย์ 

  • สร้าง Function 4 ขุด มีหน้าที่ในการ ตรวจสอบข้อมูลว่ามีขนาดเท่ากันหรือไม่ มีตัวซ้ำหรือไม่ เเปลงข้อมูลใส่ใน List เเละ หาตำเเหน่งของข้อมูล 

Code Python 

 
    def strtodata(Input) :
        List = []
        Save = ""
        for i in range(len(Input)):
            if Input[i] == " " : 
                List.append(Save)
                Save = "" 
            else :
                Save = Save+Input[i]
        List.append(Save)
        List.sort()
        return(List)
    
    def Checkdouble(Input) :
        for i in range(len(Input)):
            for a in range(i+1,len(Input)):
                if Input[i] == Input[a] :
                    print("Check new data you double\n")
                    return False
        return True

    def Checkdata(InputA,InputB) :
        Save = 1
        for i in range(len(InputA)) :
            if InputA[i] == " " :
                Save = Save + 1
        if Save == len(InputB) :
            return True
        else :
            print("Data error check input you\n")
            return False

    def ABC (abc,InputA):
         for i in range(len(InputA)):
            if abc == InputA[i] :
                return i

    while True :
        InputA = raw_input("Input data number : ")
        InputB = raw_input("Input data ACB... : ")
        if Checkdata(InputA,InputB) == True and Checkdouble(strtodata(InputA)) == True and Checkdouble(InputB) == True :
            Listnew = []
            ListA = strtodata(InputA)
            Save =""
            for i in range(len(InputB)) :
                Listnew.append(InputB[i])
                Listnew.sort()

            for a in range(len(InputB)):
                Save = Save+str(ListA[ABC(InputB[a],Listnew)])+" "
            print("Output is : "+Save+"\n")    

ผลลัพธ์ที่ได้... 


         Input data number : 1 5 3
               Input data ACB... : ABC
               Output is : 1 3 5 

               Input data number : 6 4 2
               Input data ACB... : CAB
               Output is : 6 2 4 

               Input data number : 1 4 7 8 5 2 3 6 9
               Input data ACB... : ABCDEFGHI
               Output is : 1 2 3 4 5 6 7 8 9 

               Input data number : 1 4 7 2 5 8 3 6 9
               Input data ACB... : IHGFEDCBA
               Output is : 9 8 7 6 5 4 3 2 1 

               Input data number : 1 5 9 7 3 6 4 8 2
               Input data ACB... : BACDEFGIH
               Output is : 2 1 3 4 5 6 7 9 8 

               Input data number : 1 2 3 1
               Input data ACB... : ABCD
               Check new data you double

               Input data number : 1 2 3 4
               Input data ACB... : AABC
               Check new data you double       
           

ฝึกการเเก้โจทย์ด้วย Python โจทย์ "MJEHURIC"

โจทย์  " MJEHURIC "

     Goran มีท่อนไม้ 5 ชิ้นเรียงกันตามลำดับ ท่อนไม้แต่ละชิ้นจะมีตัวเลขที่มีค่าจาก 1-5 สลักอยู่ด้านบน ดังนั้น ค่าของตัวเลขที่กำกับอยู่ด้านบนของท่อนไม้ในแต่ละชิ้นจะปรากฏแค่เพียงครั้งเดียวเท่านั้น Goran ต้องการที่จะเรียงลำดับท่อนไม้แต่ละชิ้นให้มีค่า 1 2 3 4 5 ตามลำดับ โดยกระทำด้วยวิธีการดังนี้
 1.   ถ้าตัวเลขบนไม้ท่อนแรกมีค่ามากกว่าตัวเลขบนไม้ท่อนที่สอง   ให้สลับที่กัน
 2.   ถ้าตัวเลขบนไม้ท่อนที่สองมีค่ามากกว่าตัวเลขบนไม้ท่อนที่สาม   ให้สลับที่กัน
 3.   ถ้าตัวเลขบนไม้ท่อนที่สามมีค่ามากกว่าตัวเลขบนไม้ท่อนที่สี่   ให้สลับที่กัน
 4.   ถ้าตัวเลขบนไม้ท่อนที่สี่มีค่ามากกว่าตัวเลขบนไม้ท่อนที่ห้า   ให้สลับที่กัน
 5.   ถ้าท่อนไม้ทั้งหมดยังไม่เรียงกันตามลำดับ 1 2 3 4 5   ให้กลับไปทำขั้นที่ 1 ใหม่

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

ข้อมูลนำเข้า
     ในบรรทัดแรก ประกอบด้วยค่าของตัวเลขบนท่อนไม้ทั้ง 5 ท่อน ตามลำดับ ซึ่งแยกกันโดยใช้ช่องว่าง 1 ช่อง ตัวเลขทั้งหมดจะต้องมีค่าจาก 1 ถึง 5 และไม่มีตัวเลขใดมีค่าซ้ำกัน ค่าของตัวเลขบนท่อนไม้ในตอนเริ่มต้น จะต้องไม่ใช่ 1 2 3 4 และ 5 ตามลำดับ

ข้อมูลส่งออก
     หลังจากท่อนไม้ 2 ท่อนใด ๆ ถูกสลับที่กัน   ให้แสดงผลค่าของตัวเลขบนท่อนไม้เหล่านั้นซึ่งเรียงกันตามลำดับ ลงบนบรรทัดเดียวกัน โดยใช้ช่องว่างแยกตัวเลขแต่ละตัวออกจากกัน

ที่มา:  COCI 2008/2009, Contest #4 – January 17, 2009

ตัวอย่างข้อมูลนำเข้า                  ตัวอย่างข้อมูลส่งออก
 2 1 5 3 4                  1 2 5 3 4
                  1 2 3 5 4
                  1 2 3 4 5

 2 3 4 5 1                  2 3 4 1 5
                  2 3 1 4 5
                  2 1 3 4 5
                  1 2 3 4 5

ความช่วยเหลือ: ไม่มีคำใบ้สำหรับปัญหานี้
ที่มาของโจทย์  www.programming.in.th

วิเคราะห์โจทย์ 


  • รับข้อมูลเข้ามาหนึ่งชุดเป็นตัวเลข  1 - 5  มีช่องว่างเป็นตัวเเบ่ง ต้องไม่เรียงกัน เเละต้องไม่ซ้ำกัน 
  • ทำการสลับที่ตามเงื่อนไขที่โจทย์กำหนด 

  •       1. ถ้าตัวเลขบนไม้ท่อนแรกมีค่ามากกว่าตัวเลขบนไม้ท่อนที่สอง   ให้สลับที่กัน
          2. ถ้าตัวเลขบนไม้ท่อนที่สองมีค่ามากกว่าตัวเลขบนไม้ท่อนที่สาม   ให้สลับที่กัน
          3. ถ้าตัวเลขบนไม้ท่อนที่สามมีค่ามากกว่าตัวเลขบนไม้ท่อนที่สี่   ให้สลับที่กัน
          4. ถ้าตัวเลขบนไม้ท่อนที่สี่มีค่ามากกว่าตัวเลขบนไม้ท่อนที่ห้า   ให้สลับที่กัน
          5. ถ้าท่อนไม้ทั้งหมดยังไม่เรียงกันตามลำดับ 1 2 3 4 5   ให้กลับไปทำขั้นที่ 1 ใหม่ 

    เเนวคิดในการเเก้โจทย์


  • รับข้อมูลเข้ามาเเล้วทำการเเยกข้อมูลออกจากกันเเล้วก็เก็บไว้ใน List
  • ตรวจสอบว่า ข้อมูลเรียงเเล้วหรือยัง เเละมีตัวซ้ำหรือไม่
  • สลับข้อมูลตามที่โจทย์กำหนด

  • Code Python 

                                                                                                                                                                                                                              def NewData (Input) :
                  ListData = []
                  for i in range(len(Input)) :
                      if Input[i] == "  "  :
                          ListData.append(Input[i-1])
                  ListData.append(Input[len(Input)-1])
                  return ListData
    
              def Checkdouble (Input)  :
                  for i in range(len(Input)) :
                      for a in range(i+1,len(Input)) :
                          if Input[i] == Input[a] :
                              print("Check new data is you double")
                              return False 
                  return True
    
              def  Checkdata (Input) :
                  for i in range(len(Input)-1) :
                      if Input[i] > Input[i+1] :
                          return True
                  return False 
    
              def Sortdata(Input) :
                  Save = 0
                  for i in range(len(Input)-1) :
                      if Input[i] > Input[i+1] :
                          Save = Input[i]
                          Input[i] = Input[i+1]
                          Input[i+1] = Save
                          print Input
                          if Checkdata(Input) == True :
                              Sortdata(Input)
                  return Input
    
              while True :
                  Input = raw_input("Input data is : ")
                  if len(Input) == 9 and Checkdouble(NewData(Input)) :
                          if Checkdata(NewData(Input)) == True :
                              Sortdata(NewData(Input))
                          else :
                              print ("Check new data no input 1 2 3 4 5")
                              print("Error input check now")
                  else :
                      print("Error input check now")                                                                                                                                                                                            

    ผลลัพธ์ที่ได้

                                                                                                                                                                                                                              Input data is : 12345
              Error input check now
    
              Input data is : 123456
              Error input check now
    
              Input data is : 1 2 3 4 5
              Check new data no input 1 2 3 4 5
              Error input check now
    
              Input data is : 1 2 1 3 4
              Check new data is you double
              Error input check now
    
              Input data is : 2 1 5 3 4
              ['1', '2', '5', '3', '4']
              ['1', '2', '3', '5', '4']
              ['1', '2', '3', '4', '5']
    
              Input data is : 2 3 4 5 1
              ['2', '3', '4', '1', '5']
              ['2', '3', '1', '4', '5']
              ['2', '1', '3', '4', '5']
              ['1', '2', '3', '4', '5']