7: String Processing

7-1: Index & Slice Revisited

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 7-1 ข้อที่ 1

จงเขียนฟังก์ชัน is_palindrome(s) ตรวจว่า s เป็น palindrome หรือไม่ (palindrome คือสตริงที่มีลำดับอักขระจากซ้ายไปขวา เหมือนกับลำดับอักขระจากขวาไปซ้าย เช่น ABBA หรือ 12-343-21)

def is_palindrome(s): def is_palindrome(s): return s == s[::-1] q = "`" fname = "is_palindrome" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์แค่ตัวเดียว') params = ["", "a", "12321", "12301"] results = [True, True, True, False] for i in range(len(params)): fcall = fname + "('" + params[i] + "')" func.check_call(fcall).\ has_equal_value(incorrect_msg=(q+fcall+q) + " ต้องคืนค่า " + str(results[i]))
แบบฝึกหัด 7-1 ข้อที่ 2

จงเขียนฟังก์ชัน ngrams(s, n) ที่คืนลิสต์ของตัวอักขระ n ตัวติดกันทุกแบบใน s เริ่มจากซ้ายไปขวา เช่น ngrams("ABCDEF", 3) ได้ ["ABC", "BCD", "CDE", "DEF"]

def ngrams(s, n): def ngrams(s, n): ng = [] for i in range(len(s)-n+1): ng.append(s[i:i+n]) return ng q = "`" fname = "ngrams" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') s = "ABCDEFGHIJ" params = ["'"+s+"', 1", "'"+s+"', 2", "'"+s+"', 5"] for p in params: fcall = fname + "(" + p + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 7-1 ข้อที่ 3

จงเขียนฟังก์ชัน strip_all(s, c) ที่คืนสตริงที่เหมือน s แต่ลบอักขระที่เก็บในสตริง c ออกหมด เช่น strip_all("I-dont-know-how-to-code-this", "-") จะคืนสตริง "Idontknowhowtocodethis"

def strip_all(s, c): def strip_all(s, c): t = "" for ch in s: if ch != c: t += ch return t q = "`" fname = "strip_all" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') for p in ["", "aaaaa", "aaa123aa1a23aa", "1234"]: fcall = fname + "('" + p + "', 'a')" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 7-1 ข้อที่ 4

จงเขียนฟังก์ชัน zero_pad(n, d) มี n และ d เป็นจำนวนเต็ม ฟังก์ชันนี้คืนสตริงที่เก็บเลขเหมือนที่ปรากฎใน n แต่จะเติมเลข 0 ทางซ้ายให้สตริงที่ได้มีความยาว d (ถ้า n มีอย่างน้อย d หลักอยู่แล้ว ก็ไม่ต้องเติม) เช่น zero_pad(123, 5) จะได้ "00123" ในขณะที่ zero_pad(123, 2) จะได้ "123"

def zero_pad(n, d): def zero_pad(n, d): return ("0"*d + str(n))[-max(d,len(str(n))):] q = "`" fname = "zero_pad" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') for p in ["0, 3", "1, 3", "12, 6", "123, 3", "12345, 4"]: fcall = fname + "(" + p + ")" func.check_call(fcall).has_equal_value(incorrect_msg = (q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 7-1 ข้อที่ 5

จงเขียนฟังก์ชัน thousands_separator(n) รับจำนวนเต็ม n เพื่อคืนสตริงที่มีเลขเหมือน n แต่จะเติม comma คั่นตามหลักการเขียนจำนวนที่ใช้กันทั่วไป เช่น thousands_separator(1234567) จะได้ "1,234,567"

def thousands_separator(n): def thousands_separator(n): x = str(n)[::-1] s = "" for i in range(0, len(x), 3): s += x[i:i+3] + "," return s[:-1][::-1] q = "`" fname = "thousands_separator" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for p in [0, 1, 10, 101, 1001, 100001, 120000002, 229129192919]: fcall = fname + "(" + str(p) + ")" func.check_call(fcall).has_equal_value(incorrect_msg = (q+fcall+q) + " ให้ผลผิด")