วันจันทร์ที่ 5 ตุลาคม พ.ศ. 2558

Chapter 5 : Invaders Revenge – An Interactive Multitouch Game

ในบทนี้เราจะรวมเอาส่วนประกอบต่างๆ และเทคนิคที่เรียนมาเพื่อสร้าง อนิเมชั่น และไดนามิก แอปพลิเคชั่น ส่วนใหญ่เน้นไปทางการสร้างเกมส์ มีส่วนประกอบ มีการควบคุมอีเวนท์มากมายในเวลาเดียวกัน
โดยเกมส์ที่จะมาให้ศึกษาเป็นตัวอย่างชื่อว่าเกมส์ ผู้รุกรานจากอวกาศ (Space Invaders) ข้างล่างนี่คือ ส่วนประดอบหลักๆที่เราจะทำ :

• Atlas: แพ็คเกจ Kivy ที่ใช้ในการโหลดภาพมาใช้
• Sound: คลาสที่คุมเรื่องเสียง
• Animations: Transitions, time control, events, และการทำงานของ widgets ต่างๆ
• Clock: ควบคุมการเกิด event
• Multitouch: ควบคุมแอคชั่นที่แตกต่างกัน จากการสัมผัส
• Keyboard: จับอีเวนท์ที่เกิดจากคีย์บอด

Invaders Revenge – an animated multitouch game 


รูปภาพนี้แสดงให้เราเห็นส่วนต่างๆของโปรเจค ทำให้เราแยกเป็นโครงสร้างของเกมส์ออกได้ ก็จะมีตัว Shooter (ผู้เล่น) ยิง shot เพื่อไปทำลาย invader ซึ่งตัว invader ก็ยิง missile เพื่อทำลายผู้เล่นเหมือนกัน

วันอังคารที่ 22 กันยายน พ.ศ. 2558

Chapter 4 : Improving the User Experience

ใน chapter นี้จะอธิบายในส่วนที่ Kivy มีไว้ช่วยให้นักโปรแกรมเมอร์ สามารถพัฒนา User Experince ซึ่งจะเกี่ยวข้องกับ widget ที่เฉพาะเจาะจง

สรุปสิ่งที่เราจะได้เรียนรู้ ;

- สับเปลี่ยนไปมาระหว่าง screens ที่แตกต่างกัน
- การใช้ pre-build complex widgets เพื่อที่จะเลือกสี
- การควบคุม พื้นที่ของ Canvas
- หมุน และขยายด้วย  multi-touch gestures 
- สร้าง single gestures เพื่อวาด screen

Screen manager – selecting colors for the figures

ScreenManager class คือส่วนที่ให้เราจัดการกับ screen ต่างๆ ใน window เดียวกันได้ ซึ่งในส่วนนี้ User จะเป็นคนเพิ่มสีเองได้ Kivy เตรียม widget ที่ชื่อว่า ColorPicker ดังรูปต่อไปนี้


ปัญหาที่เราพบคือ widget นี้กินพื้นที่มาก จึงไม่เหมาะกับ interface ของเราเลย เราจึงจะใช้ ScreenManager ในการแก้ปัญหานี้ ให้เราสร้างไฟล์ kivy ขึ้นมา ชื่อว่า comicscreenmanager มีโค้ดดังนี้


ในบรรทัดที่ 5 มีการเรียกใช้ ColorPicker 
และเราก็ต้องมีไฟล์ kivy อีกไฟล์ชื่อว่า comiccreator มีโค้ดดังนี้


นอกจากนี้เราต้องไปแก้โค้ดใน Chapter 3, Widget Events – Binding Actions ในส่วนที่เราจะระบุ ColorPicker Screen ด้วยชื่อ colorscreen เพื่อเริ่มการใช้ ColorPicker ให้แก้โค้ดตรงที่  method of generaloptions.py

ทีนี้เราก็ปุ่ม Color เพื่อสลับ Screen ให้แสดง ColorPicker

ComicScreenManager ได้กลายมาเป็น Widget หลัก ของ comic creator project ดังนั้น ไฟล์ comicreator.py  ควรจะเปลี่ยนตามนี้

เมื่อเปลี่ยนเสร็จแล้ว เราสามารถสลับไปมา 2  screens ระหว่าง ColorPicker และ ComicCreator

Color Control on the canvas – coloring figures 

เมื่อซักครู่เราได้เรียนวิธีการเลือกสีไปแล้ว ต่อมาเราจะใช้สีที่เลือกใส่ให้กับ elements ใน widget นั้นๆ
ศึกษาจากตัวอย่างต่อไปนี้


ใน Label จะมี properties หนึ่งชื่อว่า color เราเปลี่ยน color ตรงนี้ให้เป็นสีแดง ดูผลลัพท์


ใน Label เราเรียก color ให้เป็นสีแดง Line จึงเป็นสีแดง แต่มันกลับใส่สีแดงให้กับ  Line ใน widget ด้วย
สามารถแก้ปัญหาด้วย 3 เมธอดนี้ ในไฟล์ toolbox.py

• Method draw in ToolStickman:

• Method draw (class ToolFigure): 

• Method widgetize (class ToolFigure): 

จะเห็นว่าทั้งสามเมธอดมีโค้ดส่วนที่ไปดึง ค่า ColorPicker ไปใส่เป็น Color instruction ให้กับ canvas




วันจันทร์ที่ 21 กันยายน พ.ศ. 2558

Chapther 1 : GUI Basics - Building an Interface (Embedded Layout)

จากในตอนเริ่ม Chapter เราได้เรียนการสร้าง widget แล้วเราเอามารวมๆกันจึงเรียกว่า Embedded widget จากนั้นเราได้เรียน Layout มันก็มี Embedded Layout เช่นกัน

ด้านล่างคือ ตัวอย่าง Code Python พื้นฐานที่ใช้อธิบาย embedded Layout ได้ :


ผลลัพท์ที่จะได้



เราจะทำการพัฒนา MyGridLayout class โดยจะรวมเรา Layout ทั้งหมดของ kivy มา embedded ใน GridLayout โดยกำหนดให้มี 2 แถว 3 หลัก 
ในการจะศึกษาเราจะแบ่ง code ภาษา Kivy ออกเป็น 5 ส่วน อย่าเพิ่งตกใจ มันเป็นโค้ดที่ไม่ซับซ้อน

code ด้านล่างนี้คือ fragment 1 :





Chapther 1 : GUI Basics - Building an Interface (Layouts)

Layout คือ คลาสย่อยของ Widget ที่กำหนดรูปแบบต่างๆ ของ Embedded widget
ยกตัวอย่างง่ายๆ เช่น FloatLayout เป็นการจัดการกับ widget ที่เรามีการใช้ proportional coordinates  ซึ่งมันจะดีกว่า การใช้เป็น fixed coordinates (exact pixels) จึงช่วยลดภาระการคำนวนต่างๆลงไปได้

ทดลองโค้ดดังนี้ :

floatlayer.py


floatlayer.kv


ผลที่ได้



ใน Layout เองก็มี properties เฉพาะที่ใช้ในตัวมัน เช่น size_hint และ pos_hint และมี key ต่างๆมากมายเช่น x หรือ top , y หรือ right ซึ่ง positioning และ sizing properties มีให้ศึกษาได้จากตารางดังต่อนี้ 


สิ่งหนึ่งที่ต้องระวังก็คือ แต่ละ properties นั้นจะทำงานแตกต่างกันตาม Layout นั้นๆ 
ในปัจจุบัน Kivy นั้นมีทั้งหมด 7 Layout จะอธิบายแต่ละ Layout คร่าวๆดังนี้

FloatLayout
   จัดการ widget ที่มี พิกัด(เช่น size_hint และ pos_hint) เป็นแบบสัดส่วน ค่าจะมีตั้งแต่ 0-1 จากสัดส่วนของ window size 

RelativeLayout    
   ทำงานคล้ายๆ FloatLayout แต่ในเรื่องของ positioning properties (เช่น pos, x, center_x, right) จะสัมพันธ์กับ Layout size ไม่ใช่ window size

GridLayout
   จัดการ widget ใน Grid ต้องระบุอย่างน้อย 2 properties นั่นคือ cols (หลัก) และ rows (แถว)

BoxLayout
   จัดการ widget ในแถวหนึ่ง หรือหลักหนึ่ง ขึ้นอยู่กับค่า property orientation ว่าเป็น horizontal หรือ vertical

StackLayout
   คล้ายๆ BoxLayout แต่มันจะข้ามไปทำงานในแถว และหลักต่อไปทันที เมื่อไม่มีที่ว่างเหลือแล้ว ซึ่งทำให้ Layout นี้มีความซับซ้อนมากกว่า

AnchorLayout
   จัดการกับ widget ที่รอบๆ หรือ ตรงกลาง anchor_x property หมายถึง x position (ซ้าย กลาง หรือ ขวา)  anchor_y หมายถึง  y position (บน กลาง หรือล่าง)

ScatterLayout
   ทำงานคล้าย RelativeLayout แต่มันสามารถทำ multitouch gesturing เพื่อใช้การ rotating, scaling
หรือ translating

วันพุธที่ 16 กันยายน พ.ศ. 2558

Chapther 1 : GUI Basics - Building an Interface (Basic widgets - labels and buttons)

Widget คือ ส่วนที่เป็น GUI เช่น Button ,Label หรือ Checkbox ซึ่งเป็นสิ่งที่มีอยู่ใน Kivy อยู่แล้ว สามารถศึกษาเพิ่มเติมได้ที่ http://kivy.org/docs/api-kivy.html ยกตัวอย่างโค้ดที่มีการใช้ widget

โค้ดในส่วนของ .py มีดังนี้ (ตั้งชื่อว่า widgets)



จะเห็นว่าเราใช่การสืบทอด class (สร้างคลาสลูก) ดีกว่าไปเปลี่ยนแปลงข้อมูลที่คลาสแม่
จากนั้นให้

โค้ดในส่วนของ .kv มีดังนี้ (ตั้งชื่อว่า widgets)



ผลการรันโค้ด


จะเห็นว่าในโค้ดมีอยู่ 2 object และเราก็มีการตั้งค่า properties ให้กับแต่ละ object (สำหรับ color มีฟอร์มการใส่คึอ RGBA : Red ,Green ,Blue และ alpha/transparency)

ใน Button มี properties บางอันที่เหมือนกันอยู่เราจึงจะสร้างต้นแบบของ Button ขึ้นมา เพื่อจะได้ประหยัดการเขียนโค้ดซ้ำๆ ดังนี้



ผลการรันโค้ด







Chapther 1 : GUI Basics - Building an Interface (Hello World!)

เราจะทดลองสร้างโปรแกรม hello world ด้วยโค้ดที่เตรียมมาให้ (ใช้ Python IDE ในการเขียนโค้ดส่วน .py)



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


จะพบว่าโปรแกรมใช้สองคลาส นั่นคือ App และ Label ซึ่งเราใช้เป็น inheritance คลาส App เป็นคลาสแม่ของ HelloApp ส่วนในคลาสก็มี เมธอด build(self) เป็นเมธอดที่รีเทิร์น window content
ต่อไปเราจะแยกเป็นสองส่วน เพราะภาษา Kivy ต้องการแยกลอจิก ออกจากการแสดงผล ฉะนั้นเราจะแยกเป็นสองไฟล์

ไฟล์แรก hello2.py เขียนด้วย Python IDE


ไฟล์ที่สอง hello2.kv เขียนด้วย notepad แล้วใส่นามสกุลไฟล์เป็น .kv


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


*จะทำงานได้ กุญแจสำคัญอยู่ที่ชื่อ subclass ของ คลาส App นั่นคือ HelloApp เพราะชื่อ subclass จะเกี่ยวข้องกับชื่อไฟล์ Kivy ยกตัวอย่างเช่น ชื่อ class FooApp(App) ไฟล์ Kivy ก็จะชื่อ foo.kv และที่สำคัญ สองไฟล์นี้ต้องอยู่ directory เดียวกัน

จะเห็นว่าการแยกโค้ดนั้นทำให้มันดูง่าย และเป็นระเบียบ



วันอังคารที่ 15 กันยายน พ.ศ. 2558

Kivy และการติิดตั้ง

Kivy คือ library ชนิดหนึ่งในภาษา Python ที่ใช่ในการพัฒนาแอพพลิเคชั่น ตัวภาษา Kivy นั้น จะช่วยแยกลอจิก ออกจากการแสดงผล ให้เราสามารถสร้าง User Interface ได้ ตัวอย่างเช่น multi-touch apps

- มีลักษณะ cross platform
- FREE ! สามารถใช้พัฒนาโปรแกรม และใช้ในธุรกิจได้แบบไม่ต้องเสียค่าลิขสิทธิ์
- ออกแบบกราฟฟิกด้วย OpenGL ES 2 ทำให้มีความรวดเร็ว และทันสมัย
- มีอุปกรณ์ให้เลือกใช้มากกว่า 20 widgets จึงออกแบบงานได้หลากหลาย และมีความยืดหยุ่น

   ใน blog นี้จะอ้างอิงข้อมูลที่ศึกษาจากหนังสือ Kivy : Interactive Application In Python

ข้อมูลเพิ่มเติมที่ http://kivy.org/#home

การติดตั้ง 

ใน Ubuntu http://kivy.org/docs/installation/installation-linux.html#installation-linux

ใน Window http://kivy.org/docs/installation/installation-windows.html

วันพุธที่ 2 กันยายน พ.ศ. 2558

โจทย์(ครั้งที่ 2)

1035 : Prime Palindrome
Problem type : Batch
Time limit : 1.0 second(s)
Memory limit : 64 megabyte(s)
จำนวนเต็มใดๆ จะถูกเรียกว่า Palindrome ก็ต่อเมื่อ ค่าที่ได้เมื่ออ่านจากหน้าไปหลังและหลังไปหน้า มีค่าเท่ากัน ยกตัวอย่างเช่น 79197 และ 324423 เป็น Palindrome ทั้งคู่ หน้าที่ของคุณคือ คุณจะได้รับจำนวนเต็ม N (1 <= N <= 1 000 000) จากนั้น คุณต้องหาจำนวนที่น้อยที่สุด M โดยที่ M >= N และ M ต้องมีสมบัติเป็นทั้งจำนวนเฉพาะ และ Palindrome

ข้อมูลนำเข้า
บรรทัดแรกเพียงบรรทัดเดียว ระบุจำนวนเต็ม N

ข้อมูลส่งออก

บรรทัดเดียว ระบุจำนวนเฉพาะที่มีค่าน้อยที่สุด แต่ต้องมีค่ามากกว่าหรือเท่ากับ N

ที่มา: Indian National Olympiad in Informatics Online Programming Contest 4-5 September 2004
ตัวอย่างข้อมูลนำเข้าตัวอย่างข้อมูลส่งออก
31101

ความช่วยเหลือ: ไม่มีคำใบ้สำหรับปัญหานี้


Troubleshoot
   เราจะเอาค่าที่มีค่ามากว่า input มาเช็ค 2 อย่าง นั่นคือ เป็นจำนวนเฉพาะ กับ Palindrome หรือไม่ ถ้าเป็นก็ให้ print ค่านั้นออกมาเลย ถ้าไม่ใช่ให้เพิ่มค่าทีละ +1 (ในโค้ดจะแบ่งเป็น function อย่างชัดเจน)

Code 



Test code



1093 : หยิบหนังสือ
Problem type : Batch
Time limit : 1.0 second(s)
Memory limit : 16 megabyte(s)
เนื่องจากคุณมาเข้าแถวสาย คุณจึงโดนทำโทษให้จัดหนังสือในห้องสมุด หนังสือแต่ละเล่มที่คุณจัดล้วนแต่เป็นหนังสือเรียนหนา ๆ น่าเบื่อ  ทันทีที่ถึงเวลาพักเที่ยงและอาจารย์ห้องสมุดของคุณไม่อยู่ คุณจึงคิดเกมหนึ่งขึ้นมาเล่นกับตัวเอง

เกมนี้คุณคิดเองเล่นเองคนเดียว เริ่มต้นจากมีหนังสืออยู่ n เล่มวางเรียงอยู่บนกองเดียวกันกองหนึ่ง หนังสือแต่ละเล่มถูกติดหมายเลขไว้บนสันปก ซึ่งเป็นจำนวนเต็มไม่ติดลบซึ่งมีค่าไม่เกิน 1,000,000

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

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

ข้อมูลนำเข้า

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

ข้อมูลส่งออก

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

โจทย์โดย
วรภัทร จรางกูล
ที่มา
ดัดแปลงจากข้อสอบพี่ช่วยน้อง โรงเรียนมหิดลวิทยานุสรณ์ พ.ศ. 2552
ตัวอย่างข้อมูลนำเข้าตัวอย่างข้อมูลส่งออก
7
1
2
3
4
5
6
7
5
9
5
5
5
5
5
5
5
5
100
10

Troubleshoot
   ในหนังสือกองหนึ่ง (ข้อมูล 1 ชุด) เราเลือกออกมาได้ ครั้งละ 3 เล่ม กี่ครั้งก็ได้ เหมือนกับเรื่องความน่าจะเป็น เราต้องหาว่าวิธีในการเลือกมีกี่วิธี และวิธีนั้นให้ผลลัพท์เท่าไหร่ และจึงเอาวิธีที่ให้ผลลัพท์มากที่สุดมาตอบ

Code



Test Code

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

ทดลองเขียน class Stack และ ตัวอย่าง

Class Stack



*อ้างอิงข้อมูลใน class จาก http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html
**เพิ่ม method show

ตัวอย่าง โปรแกรมพิสูจน์คู่วงเล็บ



Output



การสร้าง class ใน Python

Python ก็เป็นอีกภาษาหนึ่งที่เขียนโปรแกรมแบบ Object-Oriented ได้ แถมสามารถเขียนได้สั้น เพราะเป็นภาษา script

เริ่มต้นด้วยการสร้าง class

1. ตั้งชื่อ class
ตัวอย่าง



จะเห็นว่าใช้การย่อหน้าเพื่อแยก code ส่วนที่เป็น code ใน class 

2. ในส่วนของ constructure เราสามารถตั้งค่า attribute ให้กับ object นั้นๆได้เลย แต่ถ้ามีการเรียกใช้ค่า attribute ที่ไม่เคยประกาศมาก่อน จะถือว่า error
ตัวอย่าง



หรือเราจะให้มีการระบุค่าเริ่มต้นตอนสร้าง object เลยก็ได้ โดยเขียน method ที่ชื่อว่า __init__


Output



3. สร้าง Method
ตัวอย่าง



Output


หากเมธอดของเราต้องการให้ใช้ parameter จาก attribute ใน object นั้น เราจะใช้คำว่า self ในช่อง parameter และเมื่อเรียกใช้ ภายในเมธอดจะใช้คำสั่งว่า self.(attribute ที่ต้องการ)
   เวลาเรียกใช้ถ้าเป็น เมธอดที่มี self ในวงเว็บ จะต้องใส่วงเล็บด้วย ถ้าในวงเล็บไม่มี self เวลาเรียกใช้ไม่จำเป็นต้องใส่ก็ได้
 

การสืบทอด class (Extends)
ตัวอย่าง



Output


   การสืบทอด class จะทำให้สามารถใช้ attribute, constructure และ method ต่างๆใน class แม่ได้

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

เขียนภาษา Python ด้วย NetBeans

1. สิ่งแรกที่คุณต้องมี คือ โปรแกรม NetBeans IDE 8.0.2 สามารถดาวน์โหลดได้ ที่นี่



ติดตั้งจนเสร็จสรรพแล้ว ในหน้า Desktop จะมี Icon ดังรูป


2. โหลด Python Plugins ที่นี่


จะได้ไฟล์ zip มา แตกเป็นโฟเดอร์ให้เรียบร้อย


3. เปิดโปรแกรม NetBeans ขึ้นมา แล้วไปเลือกแถบ Tool -->Plugins จะได้หน้าต่างดังรูป


4. ไปที่แถบ Downloads แล้วคลิ๊ก Add Plugins... แล้วเลือกที่อยู่ของโฟลเดอร์ ที่ได้จากข้อ 2 จากนั้นให้เลือกไฟล์ในโฟลเดอร์นั้นให้หมด กด open และกด Install


รอจน install เสร็จก็เป็นอันเรียบร้อย

5. เมื่อต้องการจะสร้าง Project ที่เป็นภาษา Python ให้เลือกหา โฟลเดอร์ที่เขียนว่า Python


เสร็จสิ้น


ขอบคุณข้อมูลจาก https://blogs.oracle.com/geertjan/entry/python_in_netbeans_ide_81

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

โจทย์(ครั้งที่ 1)

1.ในทะเลทรายแห่งหนึ่ง มีจิงโจ้ 3 ตัวกำลังเล่นบนเส้นจำนวน (จำนวนเต็ม) เริ่มต้นนั้นแต่ละตัวจะอยู่บนจำนวนที่แตกต่างกัน ในตาหนึ่ง จะมีจิงโจ้ตัวหนึ่ง กระโดดเข้าไปในตำแหน่งตัวเลขจำนวนเต็มที่อยู่ระหว่างจิงโจ้อีก 2 ตัว และไม่มีครั้งใดที่จิงโจ้จะกระโดดไปอยู่ในตำแหน่งจำนวนเดียวกับตัวอื่นเลย

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

ข้อมูลนำเข้า บรรัดแรก จำนวนเต็ม 3 จำนวน A, B, C โดยที่ 0 < A < B < C < 100 คือตำแหน่งเริ่มต้นของจิงโจ้ทั้งสามตัว

ข้อมูลส่งออก บรรทัดเดียว จำนวนตาเล่นที่จิงโจ้สามารถเล่นได้มากที่สุด

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

3 5 9                                         4

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

โค๊ดที่ได้




ทดลองโค๊ด



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

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

งานของคุณ
รับข้อมูลการ ลูบไล้ทั้งหมด แล้วหาความคิดเห็นที่ถูก ลูบไล้มากที่สุด

ข้อมูลนำเข้า
บรรทัดแรกระบุจำนวนเต็ม N (2 ≤ N ≤ 1,000) แทนจำนวนการ ลูบไล้ทั้งหมด

บรรทัดถัดไประบุจำนวนเต็ม N จำนวน แทนหมายเลขความคิดเห็นที่ถูก ลูบไล้หมายเลขความคิดเห็นเป็นจำนวนเต็มตั้งแต่ 1 ถึง 10,000

ข้อมูลส่งออก
บรรทัดเดียว ระบุหมายเลขความคิดเห็นที่ถูก ลูบไล้มากที่สุด หากมีหลายความคิดเห็นที่ถูก ลูบไล้มากที่สุดเท่ากัน ให้พิมพ์หมายเลขความคิดเห็นเหล่านั้นจากน้อยไปมาก คั่นด้วยช่องว่างหนึ่งช่อง

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

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

โค๊ดที่ได้



ทดลองโค๊ด




ขอบคุณโจทย์จาก http://www.programming.in.th/task/rev2_problemset.php?page=0