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

Kivy(Layout)

Layouts
  Layout คือรูปแบบในการจัดวาง widgets โดยแต่ละ layout ที่ทาง Kivy ได้จัดมาให้เรานั้นจะมีอยู่หลายแบบด้วยกันโดยแต่ละแบบนั้นจะมีลักษณะการจัดวางที่ต่างกันออกไปโดยในที่นี้มีอยู่ 7 แบบเริ่มที่

1.FloatLayout

  Floatlayout โดย layout แบบนี้นั้นจะใช้แบบหน้าต่าง size ของจอแสดงผลการทำงานของโค้ดเรานั้นมีสเกลเริ่มต้นที่ 0 และสุดที่ 1 โดยจะให้เราสามารถเลือกตำแหน่งที่ต้องการจัดว่าตัว widgets ได้โดยใช้ตัวเลขทศนิยม(0.0-1)เพื่อเลือกตำแหน่งที่ใช้ในการจัดวาง widgets ของเรายกตัวอย่างโค้ดเช่น

โค้ดในไฟล์ .py

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout

class FloatLayoutApp(App):
    def build(self):
        return FloatLayout()

FloatLayoutApp().run()

โค้ดในไฟล์ .kv

<Button>:
  color: .8,.9,0,1
  font_size: 32
  size_hint: .4, .3

<FloatLayout>:
  Button:
    text: 'Hello'
    pos_hint: {'x': 0, 'top':1}
  Button:
    text: 'world!'
    pos_hint: {'right': 1, 'y':0}

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


จะเห็นได้ว่าจากไฟล์ .kv นั้นเราได้ทำการกำหนดปุ่มแรกที่มีคำว่าHello นั้นไว้ที่จุด x=0 และ top = 1 ซึ่งก็คือค่าในแนวแกน x คือ0 คือชิดขอบด้านซ้ายและ top คือแถบบนของตัวปุ่มในแนวแกน y จะชิดกันกับขอบบนสุดของหน้าต่างซึ่งอีกปุ่มนึงก็ทำในหลักการเดียวกันเลยไปอยู่ชนกับขอบล่างสุดขวาสุดของหน้าต่างซึ่งถ้าเราลองเปลี่ยนค่าในแนวแกน y ที่ไฟล์ .kv เป็น 0.5 ตัวbutton hello ก็จะถูกเลื่อนลงมาและตัว button world! ก็จะถูกเลื่อนขึ้นไปแทน


2.Relative Layout
  ในส่วนของ layout นี้ก็ยังใช้หลักการเดียวกันกับ floatlayout เพียงแต่ว่าค่า 0-1 นั้นจะสัมพันธ์กับ size ของตัว layout เองไม่ได้สัมพันธ์กับค่าจอแสดงผล(window size)เหมือนอย่าง floatlayout

3.Grid Layout
 จะใช้คอลั่มกับแถวเข้ามาช่วยโดยจะมีคำสั่ง col: กับ row: เพิ่มขึ้นมา

4.Box Layout
  ค่าที่ใช้กำหนดในlayout นี้นั้นจะเป็นค่าที่ขึ้นอยู่กับในแนวตั้งและแนวยาว

5.Stack Layout
  layout นี้มีความคล้ายคลึงกับ Box layout แต่ว่าถ้าหมดแถวนึงหรือคอลั่มนึงแล้วจะทำการขึ้นแถวหรือคอลั่มนั้นใหม่โดยที่ layout นี้มีความยืดหยุ่นในการใช้งานมากกว่า box layout โดยจะมีตัวกำหนดค่ามาช่วยให้ใช้งานได้ง่ายขึ้นคือlr(left to right),rl(right to left),tb(top to bottom),bt(bottom to top)

6.Anchor Layout
  มีความสามารถในการจัดการ widgets ให้อยู่ในกรอบหรืออยู่ตรงกลางได้โดย anchor_x_property แสดงถึงตำแหน่งในแกน x และ anchor_y_property แสดงถึงพิกัดในแกน y

7.Scatter Layout
  การใช้งานคล้ายคลึงกับ Relative layout แต่ว่ามีลุกเล่นเยอะกว่าตรงการใช้ multitouch ได้หรือแม้แต่กลับด้าน แปลภาษา ก็ยังสามารถทำได้ซึ่งในหนังสือไม่ได้เจาะรายละเอียดมาให้

Embeding layouts
  คือการฝังตัวของ layouts โดยจะให้โค้ดตัวอย่างที่ใช้ทดสอบมาคือ

โค้ดในไฟล์ .py

from kivy.app import App
from kivy.uix.gridlayout import GridLayout

class MyGridLayout(GridLayout):
    pass

class LayoutsApp(App):
     def build(self):
        return MyGridLayout()

LayoutsApp().run()

จะเห็นได้ว่าโค้ดด้านบนนั้นไม่ได้มีอะไรแตกต่างจากโค้ดก่อนๆเท่าไหร่เพียงแต่ว่าเราได้ทำการนำ Gridlayouts เข้ามาใช้งานเเพื่อช่วยแสดงผลตัวอย่าง layouts ทั้งหมดนั้นเองโดยจะแบ่งได้เป็นส่วนๆ 5ส่วนย่อยโดยจะประกอบด้วย

โค้ดในไฟล์ .kv
  ส่วนที่:1

<MyGridLayout>:
  rows: 2
  FloatLayout:
    Button:
      text: 'F1'
      size_hint: .3, .3
      pos:0, 0
  RelativeLayout:
    Button:
      text: 'R1'
      size_hint: .3, .3
      pos: 0,0

  ส่วนที่:2

  GridLayout:
    cols: 2
    spacing: 10
    Button:
      text: 'G1'
      size_hint_x: None
      width: 50
    Button:
      text: 'G2'
    Button:
      text: 'G3'
      size_hint_x: None
      width: 50

  ส่วนที่:3

  AnchorLayout:
    anchor_x: 'right'
    anchor_y: 'top'
    Button:
      text: 'A1'
      size_hint:[.5, .5]
    Button:
      text: 'A2'
      size_hint: [.2, .2]

  ส่วนที่:4

  BoxLayout:
    orientation: 'horizontal'
    Button:
      text: 'B1'
    Button:
      text: 'B2'
      size_hint: [2,.3]
      pos_hint: {'y',.4}
    Button:
      text 'B3'

  ส่วนที่:5

  StackLayout:
    orientation: 'rl-tb'
    padding: 10
    Button:
      text: 'S1'
      size_hint: [.6,.2]
    Button:
      text: 'S2'
      size_hint: [.4,.4]
    Button:
      text: 'S3'
      size_hint: [.3,.2]
    Button:
      text: 'S4'
      size_hint: [.4,.3]

จากโค้ดจากด้านบนทั้งหมดจะได้ผลลัพธ์แสดงเป็นตัวอย่างของแต่ละ layouts ให้เราเห็นคือ


(ภาพจากหนังสือKivy-Interactive-Applications-in-Python)

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

Comic-Creator
  เราได้รู้เกี่ยวกับคุณสมบัติที่จะใช้ในการสร้าง interface ไปทั้งหมดแล้วในส่วนนี้จะเกี่ยวกับการสร้างพื้นฐานคือการวาด stickman แล้วมี interface ไว้รับค่า sketch คือในรูปด้านล่างนี้


(ภาพจากหนังสือKivy-Interactive-Applications-in-Python)

โดนจากภาพ sketch เบื้องต้นด้านบนเราควรจะเลือก layouts ที่ใช้งานให้เหมาะสมเพื่อสะดวกในการจัดการโดยทางหนังสือที่อ่านแนะนำให้เลือกดังนี้
  Anchor layouts ใช้กับกล่องเครื่องมือด้านบนซ้ายมือ
  Grid layouts สำหรับคอลั่มเลือกฟังก์ชั่นด้านล่าง
  Anchor layouts ใช้สำหรับช่องว่างข้างบนขวามือ
  Relative layouts ใช้สำหรับจัดการตำแหน่งในช่องขวาบนเพื่อจัดตำแหน่ง stickman
  Anchor layouts ใช้สำหรับการสร้างกล่องแสดงสถานะด้านล่างสุด
  Box layouts ใช้สำหรับสร้างกล่องข้อความฟังก์ชั่นด้านล่างเพื่อให้เราสามารถกำหนดอัตราส่วน

โดยจากการร่างก่อนว่าจะทำอะไรด้านบนนั้นทางหนังสือก็มีตัวอย่างโค้ดมาให้ลองว่าจะได้ผลลัพท์หรือไม่

โค้ดจากไฟล์ .py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout

Builder.load_file('toolbox.kv')
Builder.load_file('drawingspace.kv')
Builder.load_file('generaloptions.kv')
Builder.load_file('statusbar.kv')

class ComicCreator(AnchorLayout):
    pass

class ComicCreatorApp(App):
    def build(self):
        return ComicCreator()

ComicCreatorApp().run()

โค้ดจากไฟล์.kv

<ComicCreator>:
  AnchorLayout:
    anchor_x: 'left'
    anchor_y: 'top'
    ToolBox:
    id: _tool_box
    size_hint: None,None
    width: 100
  AnchorLayout:
    anchor_x: 'right'
    anchor_y: 'top'
    DrawingSpace:
    size_hint: None,None
    width: root.width - _tool_box.width
    height: root.height - _general_options.height-_status_bar.height
  AnchorLayout:
    anchor_x: 'center'
    anchor_y: 'bottom'
    BoxLayout:
      orientation: 'vertical'
      GeneralOptions:
    id: _general_options
    size_hint: 1,None
    height: 48
      StatusBar:
    id: _status_bar
    size_hint: 1,None
    height: 24

โค้ดจากไฟล์ toolbox.kv

<ToolButton@ToggleButton>:
  size_hint: None,None
  size: 48,48
  group: 'tool'

<ToolBox@GridLayout>:
  cols:2
  padding:2
  ToolButton:
    text: 'O'
    toolButton:
    text: '/'
  ToolButton:
    text: '?'

โค้ดจากไฟล์ drawingspace.kv

<DrawingSpace@RelativeLayout>:
  Label:
    markup: True
  text: '[size=32px][color=#3e6643]The[/color] [sub]Comic[/sub]
[i][b]Creator[/b][/i][/size]'

โค้ดจากไฟล์ generaloptions.kv

<GenaralOptions@BoxLayout>:
  oriention: 'horizontal'
  padding: 2
  Button:
    text: 'Clear'
  Button:
    text: 'Remove'
  Button:
    text: 'Group'
  Button:
    text: 'Color'
  Button:
    text: 'Gestures'

โค้ดจากไฟล์ statusbar.kv

<StatusBar@BoxLayout>:
  orientation: 'horizontal'
  Label:
    text: 'Total Figures: ?'
  Label:
    text: "Kivy started"

และจากโค้ดข้างบนทั้งหมดจะได้ผลลัพท์ออกมาดังรูปภาพด้านล่างนี้


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

Kivy(Button&Widgets)

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

  sudo add-apt-repository ppa:kivy-team/kivy

  sudo apt-get update

  sudo apt-get install python3-kivy

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

  sudo apt-get install kivy-examples

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

 
และจากการศึกษา Kivy จากหนังสือ Kivy-Interactive-Applications-in-Python นั้น
เรื่องแรกจะเป็นเรื่องเกี่ยวกับ การใช้งาน Kivy เบื้องต้นโดยจะมีตัวอย่างโค้ดมาให้โดยตัวอย่างโค้ดแรกนั้นก็คือ

from kivy.app import App#ดึง kivy มาใช้โดยให้เหมือนเป็นคลาสแม่
from kivy.uix.button import Label#ดึงส่วนนึงของ kivy มาใช้เป็นตัวแสดงผลในชื่อ Label


class HelloApps(App):#สร้างคลาสโดยสร้างเป็นคลาสลูกของ App
    def build(self):#เรียกใช้เมทอดเพื่อสร้างหน้าต่างแสดงผล
        return Label(text = 'Hello world')#คืนค่าตัวแสดงผลโดยให้แสดงคำว่า'Hello World!'


HelloApps().run()

  กล่าวต่อไปคือ kivy นั้นไม่ได้เป็นแค่ library ของ python ทั้งหมดเรายังสามารถเพิ่มเติมคำสั่งเข้าไปเองได้โดยใช้การสร้างไฟล์ .kv ขึ้นมาแล้วทำการตั้งชื่อเหมือนกันกับไฟล์ .py และอยู่ในพื้นที่เดียวกันกับไฟล์ .py เพื่อให้คำสั่งมาเรียกใช้เพิ่มเติมจากไฟล์.kvได้อีกด้วย(เราสามารถสร้างไฟล์.kyโดยใช้notepad ใน window หรือ texteditor ใน ubuntu)
จากนั้นก็จะมีโค้ดตัวอย่างมาให้คือ

from kivy.app import App
from kivy.uix.button import Label

class HelloApps2(App):
    def build(self):
        return Label()#ต่างกับอันแรกแค่ไม่มีการส่งค่าเข้าไป


HelloApps2().run() 

และให้เราสร้างไฟล์ .kv ขึ้นมาโดยให้ตัวอย่างโค้ดมาดังนี้

<Label>:
   text = 'Hello World!'

ให้เรานำทั้ง 2 ไฟล์ไปไว้ใน directory เดียวกันและทำการเรียกใช้โดยผลลัพท์ที่ได้จะได้เหมือนกับในตัวอย่างที่ 1 เพียงแต่เราสามารถแก้ไขคำที่เราจะแสดงได้ในไฟล์ .kv ไม่จำเป็นต้องไปแก้ในโค้ด
(หากเราต้องการลดหน้าต่างการแสดงผลให้เล็กลงสามารถไปเรียกใช้ใน terminal(ubuntu)หรือ commandline(window)เพื่อทำการเลือกไซส์แสดงผลเองได้โดยให้เราใช้คำสั่ง python <name>.py --size=(width)x(height) จะแสดงผลออกมาให้เราเลยแต่ไซส์จะเท่าที่เรากำหนดไว้)

ตัวอย่างต่อมาจะเป็นการสร้าง widgets แบบพื้นฐานโดยในตัวอย่างที่แล้ว Label ก็เป็น widgets ตัวนึงที่ Kivy นั้นมีให้เราใช้และยังมีอีกหลายตัวยกตัวอย่างเช่น button,label,checkboxes โดยตัว widgets นั้นจะเป็นการสร้างเพื่อทำเป็น interface ติดต่อกับผู้ใช้งาน
โดยตัวอย่างโค้ดที่ได้เป็นดังนี้

from kivy.app import App
from kivy.uix.widget import Widget#ดึงในส่วนwidgetsมาใช้

class MyWidget(Widget):
    pass

class widgets(App):
    def build(self):
        return MyWidget()

widgets().run() 


โดยเราต้องทำการสร้างไฟล์ .kv มาอีกไฟล์เพื่อทำการเขียน widgetsของเราเองโดยในหนังสือให้ตัวอย่างโค้ดที่ต้องนำมาเขียนในไฟล์ .kv คือ

<MyWidget>:#ในคลาส widgets จะให้เรามาเขียนเองตรงนี้

  Button:#เป็นการสร้างส่วนแสดงผลแบบเป็นปุ่ม
    text:'Hello'#แสดงผลคำว่า Hello
    pos: 0, 100#แสดงในตำแหน่ง x = 0, y = 100
    size: 100,50#กำหนดขนาด
    color: .8,.9,0,1#กำหนดสี
    font_size: 32#กำหนดขนาดตัวอักษร


  Button:
    text:'World!'
    pos: 100, 50
    size: 100, 50
    color: .8,.9,0,1
    font_size: 32


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


แต่จะเห็นได้ว่าตำแหน่งนั้นเราได้ทำการระบุค่าไว้แล้วซึ่งเมื่อเรานำไปกด size ที่เล็กกว่าค่าที่ระบุไว้ก็จะทำให้ปุ่มที่เราสร้างขึ้นมานั้นมองไม่เห็นตัวอย่างโค้ดต่อไปเลยเป็นการนำตัวแปรของระบบมาใช้งานโดยโค้ดคือ

<Mybutton@Button>:
  color: .8,.9,0,1
  font_size: 32
  size: 100, 50

<MyWidget>:


  Mybutton:
    text: 'Hello'
    pos: root.x, root.top-self.height


  Mybutton:
    text: 'World!'
    pos: root.right - self.width , root.y
 


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


 Size = 200x150

 

Size = 400x300



จะเห็นได้ว่าถึงขนาด size จะใหญ่ขึ้นหรือเล็กลงตัว widgets ของเรานั้นก็จะยังอยู่ที่เดิมต่างจากตัวอย่างโค้ดอันแรกที่ตัวwidgetsจะไม่เปลี่ยนตามขนาดไซส์


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

Practice

โจทย์
ณ ห้องเรียนแห่งหนึ่ง ค่อนข้างบ่อยครั้งที่พบว่ามีเสียงรบกวนมากมายในระหว่างคาบเรียนและแทนที่นักเรียนจะตั้งใจฟังในสิ่งที่คุณครูสอน นักเรียนกลับเอาแต่สนทนากันในเรื่องวิกฤตการณ์ทางเศรษฐกิจ หรือการเข้าร่วมสหภาพยุโรปของ Croatia 
เสียงที่ดังที่สุดจะพบได้บ่อยเมื่อเวลาที่นักเรียนกำลังเกียจคร้าน ด้วยเหตุนี้ คุณครูจึงให้งานจำนวนมากแก่เด็ก ๆ เพื่อให้เด็ก ๆ เงียบเสียงลง และในงานประเภทหนึ่งที่คุณครูให้ นักเรียนจะต้องคำนวณหาผลลัพธ์ของการดำเนินการทางคณิตศาสตร์ของตัวเลขที่มีค่ามาก 2 ค่า
การดำเนินการทางคณิตศาสตร์ที่เราสนใจในที่นี้จะมีแค่เพียงการบวกและการคูณกันเท่านั้นและตัวถูกดำเนินการ (Operand) จะต้องเป็นตัวเลขที่สามารถเขียนให้อยู่ในรูปของ 10 ยกกำลังตัวเลขใดๆ และมีค่าไม่เกิน 100 หลัก 

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

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

ในบรรทัดแรก ประกอบด้วยเลขจำนวนเต็มบวกของตัวถูกดำเนินการตัวแรก (A)
บรรทัดที่ 2 คืออักขระ ‘+’ หรือ ‘*’ ซึ่งแทนการบวกและการคูณกันนั่นเอง
บรรทัดที่ 3 คือเลขจำนวนเต็มบวกของตัวถูกดำเนินการตัวที่สอง (B)
ตัวเลข A และ B จะต้องเป็นตัวเลขที่สามารถเขียนให้อยู่ในรูปของ 10 ยกกำลังตัวเลขใดๆ และมีค่าอย่างมาก 100 หลัก

ข้อควรระวัง: ตัวเลขในข้อมูลนำเข้าอาจมีค่ามากเกินกว่าที่จะเก็บใน int หรือ long long ได้

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

จงแสดงผลผลลัพธ์ของการดำเนินการทางคณิตศาสตร์

ที่มา: COCI 2008/2009, Contest #6 – March 7, 2009
ตัวอย่างข้อมูลนำเข้า                                                                               ตัวอย่างข้อมูลส่งออก
1000                                                                                                       100000
*
100
10000                                                                                                     10010
+
10
10                                                                                                            1010
+
1000
โค้ดที่ใช้งาน
def buka(input_data):
    temp = input_data
    input_data = input('input your operation(+ or *) :')
    if(input_data == '+'):
        input_process = input('+ ')
        temp = temp+int(input_process)
    elif(input_data == '*'):
        input_process = input('* ')
        temp = temp*int(input_process)
    return temp

print(buka(int(input('input :'))))
----------------------------------------------------------------------------------------------------------------
โจทย์
กำหนดจำนวนเต็ม A,B เมื่อ A modulo B จะได้ผลลัพธ์เป็นเศษจากการหาร A ด้วย B ยกตัวอย่างเช่น 7 , 14 , 27 , 38 เมื่อ modulo ด้วย 3 จะได้ผลลัพธ์เป็น 1 , 2 , 0 และ 2 ตามลำดับ จงเขียนโปรแกรมรับจำนวนเต็ม 10 ค่า จากนั้นทำการ modulo จำนวนทั้งสิบด้วย 42 และแสดงผลเป็นจำนวนแบบของเศษที่เหลือจากการ modulo ด้วย 42 ที่ไม่ซ้ำกัน

ข้อมูลนำเข้า
ในข้อมูลนำเข้าจะประกอบไปด้วยจำนวนเต็มบวก 10 จำนวน แต่ละจำนวนมีค่าน้อยกว่า 1,000 บรรทัดละ 1 จำนวน

ข้อมูลส่งออก
จำนวนแบบของเศษที่ไม่ซ้ำกัน เมื่อนำทั้ง 10 จำนวนจากข้อมูลนำเข้ามา modulo ด้วย 42

ที่มา: Croatian Open Competition in Informatics
Contest 1 – October 28, 2006

ตัวอย่างข้อมูลนำเข้า                            ตัวอย่างข้อมูลส่งออก
1
2
3
4
5
6
7
8
9
10
10
42
84
252
420
840
126
42
84
420
126
1
39
40
41
42
43
44
82
83
84
85


โค้ดที่ใช้งาน

def modulo():
    temp = []
    count = 1
    for i in range(0,10):
        input_data = int(input('input data :'))
        temp.append(input_data % 42)
    for j in range(0,9):
        temp.sort()
        if(temp[j] != temp[j+1]):
            count = count+1
    return count
print(modulo())



































6
----------------------------------------------------------------------------------------------------------------
โจทย์
อ้วน กฤติศักดิ์ ไชยกุล (นามสมมติ) ต้อง การจะลดน้ำหนักของเขา เนื่องจากเขามีน้ำหนักเยอะเกินขนาดและมีพุงที่ใหญ่ยื่นยาวจนกระทั่งปิด เข็มขัด เขาได้คิดวิธีการลดน้ำหนักแบบใหม่คือการเล่นมุกแป๊กๆ เพื่อจะได้ใช้พลังงานจากการพูดสิ่งไร้สาระออกมาด้วยเหตุนี้จึงทำให้ในแต่ละวัน อ้วน เล่นมุกแป๊กออกมาจำนวนหลายมุกมาก (บ้างก็เป็นมุกซ้ำที่เคยเล่นแล้ว) เขาจึงต้องการจดบันทึกมุกของเขาให้เป็นระเบียบด้วยการเรียงมุกทั้งหมดตามลำดับตัวอักษร Dictionary โดยจะไม่จดบันทึกมุกซ้ำหลายครั้ง
ข้อมูลนำเข้า
บรรทัดแรก : จำนวนนับ N ( 1 < N < 1000 ) แทนจำนวนของมุกที่ อ้วน เล่นในวันนี้
บรรทัดถัดมา N บรรทัดแต่ละบรรทัดประกอบด้วยสตริง 1 สตริงยาวไม่เกิน 30 ตัวอักษร ประกอบด้วยตัวอักษรพิมพ์เล็กเท่านั้น
ข้อมูลส่งออก
มี หลาย บรรทัด แต่ละบรรทัดแสดงสตริงมุกที่ อ้วน เล่น เรียงตามลำดับตัวอักษร โดยจะไม่แสดงมุกเดิมซ้ำ
ตัวอย่างข้อมูลนำเข้า                                                           ตัวอย่างข้อมูลส่งออก
4
toppykung
krittisakchaiyakul
noob
nakornpathom
krittisakchaiyakul
nakornpathom
noob
toppykung
6
mai
hen
longsob
ma
pid
sala
hen
longsob
ma
mai
pid
sala
6
maidai
leoi
maidai
tong
maidai
nakornpathom
leoi
maidai
nakornpathom
tong
โค้ดที่ใช้งาน
def input_joke():
    quatify_joke = int(input('input number :'))
    list_joke = []
    for i in range(quatify_joke):
        input_joke = input('what joke do you want :')
        list_joke.append(input_joke)
    list_joke.sort()
    return list_joke
def mem_joke():
    joke_played = input_joke()
    lists_duplicate = []
    i = 0
    while(i<len(joke_played)-1):
        if(joke_played[i] == joke_played[i+1]):
            joke_played.remove(joke_played[i])
            i = i-1
        i = i+1
    return joke_played
print(mem_joke())
-----------------------------------------------------------------------------------------------------------------
โจทย์
ร้านสั่งทำเค้กแห่งหนึ่งแถวมหาวิทยาลัยขอนแก่น รับใบสั่งเค้กเฉพาะช่วงที่มีการแข่งขันคอมพิวเตอร์โอลิมปิกของ สอวน เท่านั้น เจ้าของร้านเค้กนี้จะผลิตเค้กขนาดหนึ่ง ปอนด์ แต่แบ่งขายเป็นห้าแบบคือ เต็มปอนด์ เศษสามส่วนสี่ปอนด์ ครึ่งปอนด์ หนึ่งส่วนสี่ปอนด์ และ หนึ่งส่วนแปดปอนด์ เผอิญว่าเจ้าของร้านเค้กเป็นนักคณิตศาสตร์ที่รักความสวยงามและความอร่อย ดังนั้นเวลาขายเค้กแต่ละครั้งเจ้าของร้านจะไม่ยอมเอาเค้กแบบที่เล็กกว่ามารวมให้ได้ขนาดของเค้กตามที่ลูกค้าต้องการ 

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

ด้วยความคุ้นเคยของลูกค้า ลูกค้าจะสั่งเค้กเป็นจำนวนเต็ม a b c d e สำหรับก้อนของขนาดเค้กเต็มปอนด์ เศษสามส่วนสี่ปอนด์ ครึ่งปอนด์ หนึ่งส่วนสี่ปอนด์ และ หนึ่งส่วนแปดปอนด์ ตามลำดับ (0≤a,b,c,d,e ≤ 10000) ในวันหนึ่งจะมีรายการสั่งของทั้งหมดจากลูกค้า n ราย เจ้าของร้านจะรับรายการสั่งของวันนี้เพื่อคำนวณว่าจะต้องทำเค้กทั้งหมดกี่ปอนด์เพื่อให้เพียงพอในการส่งของให้ลูกค้าในวันถัดไป 
คำสั่ง
จงเขียนโปรแกรมเพื่อรับข้อมูลรายการสั่งเค้กของลูกค้าและคำนวณว่าจะต้องทำเค้กอย่างน้อยที่สุดกี่ปอนด์ 
ข้อมูลนำเข้า
บรรทัดแรก มีจำนวนเต็ม n (1≤ n ≤10) 
ต่อจากนั้น n บรรทัด จะเป็นข้อมูลของลูกค้าคนที่ 1 ถึงคนที่ n โดยแต่ละบรรทัดจะประกอบด้วย จำนวนเต็ม a b c d e (0≤a,b,c,d,e≤10000) โดยแต่ละค่าจะคั่นด้วยช่องว่างหนึ่งช่อง 
ข้อมูลส่งออก
มีบรรทัดเดียว ประกอบด้วยจำนวนเต็มหนึ่งค่า ซึ่งเป็นจำนวนของเค้กเต็มปอนด์ที่น้อยที่สุดที่เจ้าของร้านต้องเตรียมให้เพียงพอตามรายการที่ลูกค้าสั่ง 
ที่มา: การแข่งขันคอมพิวเตอร์โอลิมปิก สอวน. ครั้งที่ 3 มหาวิทยาลัยขอนแก่น
ตัวอย่างข้อมูลนำเข้า                                                           ตัวอย่างข้อมูลส่งออก
3                                                                                                                  4
1 0 1 0 0
0 1 0 1 0
0 1 0 0 0
5                                                                                                                  2
0 0 1 0 0
0 0 0 0 1
0 0 1 0 0
0 1 0 0 0
โค้ดที่ใช้งาน
def input2int(data):
    lists = []
    for i in range(len(data)):
        lists.append(int(data[i]))
    return lists
def plus_order():
    quantify = int(input('input your value to order :'))
    check = 0
    sum_array = [0,0,0,0,0]
    while(check<quantify):
        input_data = input2int(input('input your quantify of size(5 value with spacebar) :').split())
        if(quantify == 1):
            return input_data
        else:
            for i in range(len(input_data)):
                sum_array[i] = sum_array[i]+input_data[i]
        check = check + 1
    return sum_array
def cal_cake():
    order_list = plus_order()
    size_cake = [1,0.75,0.5,0.25,0.125]
    sum_cake = order_list[0]+order_list[1]
    sum_quarter = sum_cake-order_list[0]-(order_list[1]*size_cake[1])
    print('default_sum :',sum_cake) 
    if((((order_list[3])%4 == 0) or ((order_list[4])%8 == 0))):
        if((order_list[3])%4 == 0):
            sum_cake = sum_cake+(order_list[3]*size_cake[3])
            order_list[3] = 0
        if((order_list[4])%8 == 0):
            sum_cake = sum_cake+(order_list[4]*size_cake[4])
            order_list[4] = 0
    print('check1/4and1/8_sum :',sum_cake)
    print('quarter1 :',sum_quarter)
    sum_cake = sum_cake+(order_list[2]*size_cake[2])
    print('sum+0.5 :',sum_cake)
    if(sum_quarter != 0):
        sum_quarter = sum_quarter-(order_list[3]*size_cake[3])-(order_list[4]*size_cake[4])
        print('quarter2_full :',sum_quarter)
        if(sum_quarter < 0):
            sum_cake = sum_cake-sum_quarter
    print('semi-finalout',sum_cake)
    if(sum_cake% 1 == 0):
        return int(sum_cake)
    else:
        return int(sum_cake)+1
print(cal_cake())
-------------------------------------------------------------------------------------------------------------------------------------------
โจทย์

ให้นักเรียนตรวจสอบว่า สายอักขระที่โจทย์กำหนดให้นี้ เป็นตัวอักษรพิมพ์เล็กทั้งหมด หรือตัวอักษรพิมพ์ใหญ่ทั้งหมด หรือมีทั้งตัวอักษรพิมพ์ใหญ่และพิมพ์เล็กผสมกันอยู่ 
ข้อมูลนำเข้า
บรรทัดแรกเพียงบรรทัดเดียว
 สายอักขระ ที่ประกอบไปด้วยตัวอักษร 'a' - 'z' หรือ 'A' - 'Z' เท่านั้น ความยาวไม่เกิน 10,000 ตัวอักษร 
ข้อมูลส่งออก
ให้พิมพ์คำตอบตามเงื่อนไขต่อไป
นี้
  • ถ้าสายอักขระประกอบด้วยตัวพิมพ์ใหญ่ทั้งหมด ให้พิมพ์ว่า "All Capital Letter" โดยไม่ต้องมีเครื่องหมาย ""
  • ถ้าสายอักขระประกอบด้วยตัวพิมพ์เล็กทั้งหมด ให้พิมพ์ว่า "All Small Letter" โดยไม่ต้องมีเครื่องหมาย ""
  • ถ้าสายอักขระประกอบด้วยตัวอักษรพิมพ์เล็กและพิมพ์ใหญ่ผสมกันไป ให้พิมพ์ว่า "Mix" โดยไม่ต้องมีเครื่องหมาย ""
ที่มา: Programming.in.th (Northern_series)
ตัวอย่างข้อมูลนำเข้า                                                           ตัวอย่างข้อมูลส่งออก
ABCDEFG                   All Capital Letter
abcdefgAll Small Letter
AbCdEfGMix
โค้ดที่ใช้งาน
def check_char(Str):#สร้างฟังก์ชั่นมาเพื่อใช้งาน
    if(Str.isupper()):#ถ้าตัวที่รับมาเป็นตัวใหญ่ทั้งหมด
        print('All Capital Letter')#แสดงข้อความ
    if(Str.islower()):#ถ้าตัวที่รับมาเป็นตัวเล็กทั้งหมด
        print('All Small Letter')#แสดงข้อความ
    else:
        print('Mix')
check_char('input('input your data :')#เรียกใช้งานฟังก์ชั่น

------------------------------------------------------------------------------------------------------------------