เฉลยแบบฝึกหัด: สตริง#
โจทย์ปัญหาเรื่องสตริง#
ข้อ 1#
def detect_prefix_suffix(word, affix):
"""
ตัวอย่าง
>>> detect_prefix_suffix('หน้าเนื้อ', 'หน้า')
'-เนื้อ'
>>> detect_prefix_suffix('การเดินทาง', 'การ')
'-เดินทาง'
>>> detect_prefix_suffix('เหลือใจ', 'ใจ')
'เหลือ-'
>>> detect_prefix_suffix('ใจ', 'ใจ')
''
>>> detect_prefix_suffix('หน้าเนื้อใจเสือ', 'ใจ')
''
"""
if affix == word: # ถ้า affix เท่ากับ word
return '' # ไม่ต้องทำอะไร
elif word[:len(affix)] == affix: # ถ้า word ขึ้นต้นด้วย affix
return '-' + word[len(affix):] # ตัด affix ออกจาก word แล้วเติม - ไว้ข้างหน้า
elif word[-1 * len(affix):] == affix: # ถ้า word ลงท้ายด้วย affix
return word[:-len(affix)] + '-' # ตัด affix ออกจาก word แล้วเติม - ไว้ข้างหลัง
else: # ถ้า affix ไม่ใช่ prefix หรือ suffix ของ word
return ''
print(detect_prefix_suffix('หน้าเนื้อ', 'หน้า'))
print(detect_prefix_suffix('การเดินทาง', 'การ'))
print(detect_prefix_suffix('เหลือใจ', 'ใจ'))
print(detect_prefix_suffix('ใจ', 'ใจ'))
print(detect_prefix_suffix('หน้าเนื้อใจเสือ', 'ใจ'))
-เนื้อ
-เดินทาง
เหลือ-
ข้อ 2#
def is_word(word):
"""is word a valid word?
Assume four words in the vocabulary
"""
return word in ['head', 'band', 'set', 'war']
def splittable(word):
"""
ตัวอย่าง
>>> splittable('headband')
True
>>> splittable('warhead')
True
>>> splittable('bandid')
False
"""
# แบ่ง word ออกเป็นสองส่วน โดยเริ่มจากส่วนหน้าที่ยาวที่สุด
for i in range(1, len(word)):
first_half = word[:i] # ส่วนหน้า
second_half = word[i:] # ส่วนท้าย
# ถ้าส่วนหน้าเป็นคำที่ถูกต้อง และส่วนท้ายเป็นคำที่ถูกต้อง
if is_word(first_half) and is_word(second_half):
return True # คืนค่า True
return False # คืนค่า False
ข้อ 3#
def reverse_string(text):
reversed_text = '' # สร้าง string ว่าง ไว้เก็บคำที่กลับหลัง
for i in range(len(text)-1, -1, -1): # วนลูปตั้งแต่ตัวสุดท้ายจนถึงตัวแรก
reversed_text += text[i] # เพิ่มตัวอักษรจาก text ไปใน reversed_text
return reversed_text
print(reverse_string('Hello'))
print(reverse_string('Natural'))
olleH
larutaN
ข้อ 4#
def is_palindrome(word):
# create a reversed string
reversed_word = word[::-1] # หรือจะใช้วิธีแบบข้อ 3 ก็ได้ reverse_string(word)
# compare the reversed string with the original string
if word == reversed_word:
return True
else:
return False
print(is_palindrome('noon'))
print(is_palindrome('TENET'))
print(is_palindrome('Tenet'))
True
True
False
ข้อ 5#
def eng_to_pig_latin(english_word):
first_letter = english_word[0] # ตัวอักษรตัวแรก
rest_of_word = english_word[1:] # ตัวอักษรที่เหลือ
pig_latin = rest_of_word + first_letter + 'a' # ต่อตัวอักษรที่เหลือ ตัวอักษรตัวแรก และ a
return pig_latin
print(eng_to_pig_latin('hello'))
print(eng_to_pig_latin('sleep'))
elloha
leepsa
ข้อ 6#
def flip_string(text_to_flip):
# หาความยาวของ text_to_flip
length = len(text_to_flip)
if length % 2 == 0: # ถ้าความยาวเป็นเลขคู่
middle = length // 2 # หาตำแหน่งกึ่งกลาง
first_half = text_to_flip[:middle] # ตัดคำตั้งแต่ตัวแรกจนถึงตำแหน่งกึ่งกลาง
second_half = text_to_flip[middle:] # ตัดคำตั้งแต่ตำแหน่งกึ่งกลางจนถึงตัวสุดท้าย
return second_half + first_half # ต่อคำตัวหลัง แล้วต่อคำตัวหน้า
else: # ถ้าความยาวเป็นเลขคี่
no_first_letter = text_to_flip[1:] # ตัดตัวอักษรตัวแรกออก
middle = len(no_first_letter) // 2 # หาตำแหน่งกึ่งกลาง
first_half = no_first_letter[:middle] # ตัดคำตั้งแต่ตัวแรกจนถึงตำแหน่งกึ่งกลาง
second_half = no_first_letter[middle:] # ตัดคำตั้งแต่ตำแหน่งกึ่งกลางจนถึงตัวสุดท้าย
first_letter = text_to_flip[0] # ตัวอักษรตัวแรก
return first_letter+second_half+first_half # ต่อตัวอักษรตัวแรก ต่อคำตัวหลัง แล้วต่อคำตัวหน้า
print(flip_string('bear'))
print(flip_string('hello'))
print(flip_string('language'))
print(flip_string('natural'))
arbe
hloel
uagelang
nralatu
ข้อ 7#
def sum_except15():
result = 0
for i in range(100): # วนลูปตั้งแต่ 0 ถึง 99
if "1" not in str(i) and "5" not in str(i): # ถ้าไม่มีเลข 1 หรือ 5 ใน i
result += i # บวก i เข้ากับ result
return result
ข้อ 8#
def postal_table(raw_text):
new_string = ''
for i in range(len(raw_text)): # วนลูปตั้งแต่ตัวแรกจนถึงตัวสุดท้าย
if raw_text[i] != ' ': # ถ้าไม่ใช่ space
new_string += raw_text[i] # เพิ่มตัวอักษรเข้าไปใน new_string
else: # ถ้าเป็น space
if raw_text[i+1].isdigit(): # ถ้าตัวถัดไปเป็นตัวเลข
new_string += '\t' # เพิ่ม tab ใน new_string
else:
new_string += '\n' # เพิ่ม newline ใน new_string
return new_string
print(postal_table('Wattana 10110 Yannawa 10120 Dusit 10300'))
Wattana 10110
Yannawa 10120
Dusit 10300
ข้อ 9#
def is_float():
user_input = input('Please enter the input: ') # รับ input จากผู้ใช้
print('User Input: '.format(user_input))
user_input = user_input.replace('-', '') # ลบ - ออกจาก user_input (ถ้ามี)
if user_input.count('.') == 1 and user_input.replace('.', '').isdigit(): # ถ้า user_input มี . 1 ตัว และเป็นตัวเลข
return True
else:
return False
ข้อ 10#
import string, random
def generate_password(n):
if n < 6:
n = 6
num_char = n - 2 # จำนวนตัวอักษรที่เป็นตัวอักษรภาษาอังกฤษ
password = ''
for i in range(num_char): # สุ่มตัวอักษรภาษาอังกฤษ ตามจำนวนที่กำหนด
password += random.choice(string.ascii_letters) # เพิ่มตัวอักษรภาษาอังกฤษ
for i in range(2): # สุ่มตัวเลข จำนวน 2 ตัว
password += random.choice(string.digits) # เพิ่มตัวเลข
return password
ข้อ 11#
11.1#
def is_past_form(word):
"""
ตัวอย่าง
>>> is_past_form('pasted')
True
>>> is_past_form('brushed')
True
>>> is_past_form('SpotTed')
False
>>> is_past_form('ate')
False
>>> is_past_form('M34ed')
False
"""
# ถ้า word ลงท้ายด้วย ed และเป็นตัวอักษร และไม่ขึ้นต้นด้วยตัวพิมพ์ใหญ่
if word[-2:] == 'ed' and word.isalpha() and not word[0].isupper():
return True
else:
return False
print(is_past_form('pasted'))
print(is_past_form('brushed'))
print(is_past_form('SpotTed'))
print(is_past_form('ate'))
print(is_past_form('M34ed'))
True
True
False
False
False
11.2#
def pronounce_ed(word):
"""
ตัวอย่าง
>>> pronounce_ed('SpotTed')
''
>>> pronounce_ed('spotted')
'/id/'
>>> pronounce_ed('1254ed')
''
>>> pronounce_ed('refreshed')
'/t/'
"""
if is_past_form(word): # ถ้า word เป็น past form
if word[-3] == 't' or word[-3] =='d': # ถ้า word ลงท้ายด้วย t หรือ d
return '/id/'
elif word[-3] == 's' or word[-4:-2] == 'sh': # ถ้า word ลงท้ายด้วย s หรือ sh
return '/t/'
else: # ถ้า word ลงท้ายด้วยอักษรอื่น
return '/d/'
else:
return ''
print(pronounce_ed('SpotTed'))
print(pronounce_ed('spotted'))
print(pronounce_ed('1254ed'))
print(pronounce_ed('refreshed'))
/id/
/t/
ข้อ 12#
def initial_name(name):
"""
>>> initial_name('Mary Beth')
MB
>>> initial_name('Lara Jean')
LJ
>>> initial_name('Alexander')
Please enter valid name.
>>> initial_name('Mary McLeod')
Please enter valid name.
"""
initial = '' # สร้าง string ว่าง
for char in name: # วนลูปตั้งแต่ตัวแรกจนถึงตัวสุดท้าย
if char.isupper(): # ถ้าเป็นตัวพิมพ์ใหญ่
initial += char # เพิ่มตัวอักษรใน initial
if len(initial) == 2: # ถ้า initial มีความยาว 2
return initial # คืนค่า initial
else: # ถ้า initial ไม่มีความยาว 2
return 'Please enter valid name.'
print(initial_name('Mary Beth'))
print(initial_name('Lara Jean'))
print(initial_name('Alexander'))
print(initial_name('Mary McLeod'))
MB
LJ
Please enter valid name.
Please enter valid name.
ข้อ 13#
def count_anomalies(word):
"""
ตัวอย่าง input และ output ที่ถูกต้อง:
>>> num_anomalies("Hello")
0
>>> num_anomalies("hello")
0
>>> num_anomalies("hEllo")
1
>>> num_anomalies("HeLLo")
2
>>> num_anomalies("hELLo")
3
>>> num_anomalies("HELLO")
4
"""
num_anomalies = 0
for character in word[1:]: # วนลูปตั้งแต่ตัวที่ 2 จนถึงตัวสุดท้าย
if character.isupper(): # ถ้าเป็นตัวพิมพ์ใหญ่
num_anomalies += 1 # เพิ่มค่า num_anomalies ขึ้น 1
return num_anomalies
print(count_anomalies("Hello"))
print(count_anomalies("hello"))
print(count_anomalies("hEllo"))
print(count_anomalies("HeLLo"))
print(count_anomalies("hELLo"))
print(count_anomalies("HELLO"))
0
0
1
2
3
4