เฉลยแบบฝึกหัด: สตริง#

โจทย์ปัญหาเรื่องสตริง#

ข้อ 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