9: Nested Structure

9-3: Break

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

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

ฟังก์ชัน count_digit(x, d) รับ x เป็นลิสต์ของจำนวนเต็ม และ d เป็นจำนวนเต็มที่เก็บเลขโดด 0 ถึง 9 ตัวใดตัวหนึ่ง ฟังก์ชันนี้คืนจำนวนเลขโดดใน d ที่ปรากฎในจำนวนเต์มทั้งหมดของ x (เช่น x = [333, 23, 4], d = 3 นับแล้วจะคืน 4 เพราะมี 3 อยู่ 4 ตัวใน x) จงแยกวงวน while ออกเป็นฟังก์ชัน และปรับให้เรียกใช้ฟังก์ชันใหม่ เพื่อให้ทำงานได้เหมือนเดิม แต่ไม่มีวงวนซ้อนกัน

def count_digit(x, d): c = 0 for n in x: while n > 0: if n%10 == d: c += 1 n //= 10 return c def count(n, d): c = 0 while n > 0: if n%10 == d: c += 1 n //= 10 return c def count_digit(x, d): c = 0 for n in x: c += count(n, d) return c q = "`" fname = "count_digit" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') body = func.check_body().check_for_loop(missing_msg = "วงวน for เดิมหายไปไหน").check_body() body.multi( check_not(check_while(), msg="โจทย์ให้ย้าย วงวน while ออกไปเป็นฟังก์ชัน"), check_not(has_code(r"\.\s*count"), msg="อย่าใช้ count นะ ฝึกย้ายวงวน while ออกเป็นฟังก์ชัน") ) for p in ['[111,211,313,141], 1', '[204,234,100],0', '[123,456],9']: fcall = fname + "(" + p + ")" func.check_call(fcall).has_equal_value(incorrect_msg = (q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 9-3 ข้อที่ 2

จงเขียนฟังก์ชัน longest_suffix(words) รับ words เป็นลิสต์ของสตริง ฟังก์ชันนี้คืน สตริงที่ยาวสุดที่ปรากฏเป็นส่วนท้ายของทุกสตริงใน words เช่น longest_suffix(["programming", "scramming", "Diagramming"]) ได้ "ramming"

def longest_suffix(words): def longest_suffix(words): for i in range(-1, -(len(words[0])+1), -1): c = words[0][i] for j in range(1,len(words)): if i < -len(words[j]) or \ c != words[j][i]: if i == -1: return "" return words[j][i+1:] return words[0] q = "`" fname = "longest_suffix" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์หนึ่งตัว') for p in [['ramming', 'cramming', 'tramming'], ['super', 'supper', 'doper'], ['boy', 'toy', 'coin']]: fcall = fname + "(" + str(p) + ")" func.check_call(fcall).has_equal_value(incorrect_msg = (q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 9-3 ข้อที่ 3

ฟังก์ชัน reverse_and_add(n) คืนผลบวกของ n กับเลขที่เขียนกลับลำดับของ n เช่น 96+69 ได้ 165 ถ้าเราเริ่มที่จำนวนเต็มค่าหนึ่ง แล้วทำ reverse_and_add ไปเรื่อย ๆ มักจะจบทีจำนวนเต็มที่เป็นพาลินโดรม เช่น 96 -> 96+69 = 165 -> 165+561 = 726 -> 726+627 = 1353 -> 1353+3531 = 4884 เป็นพาลินโดรม แต่ก็มีจำนวนเต็มบางจำนวนที่ทำแบบนี้แล้วไม่เป็น เช่น 196 เราเรียกจำนวนแบบนี้ว่า Lychrel number

จงเขียนโปรแกรมรับจำนวนเต็ม N แล้วแสดง Lychrel number ที่มีค่าน้อยที่สุดที่มากกว่า N กำหนดให้ การสรุปว่าเป็น Lychrel number คือเมื่อทำ reverse_and_add ไปแล้ว 30 รอบ ก็ยังไม่ใช่พาลินโดรม (ต้องขอบอกว่า ข้อกำหนดนี้ไม่เป็นความจริงนะ เพียงต้องการให้เขียนโปรแกรมง่ายเท่านั้น)

___inp___ = ["1"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def reverse_and_add(n): return n + int(str(n)[::-1]) #-------------------------------- def is_palindrome(n): m = str(n) return m == m[::-1] #-------------------------------- N = int(input()) print( ??? ) def reverse_and_add(n): return n + int(str(n)[::-1]) #-------------------------------- def is_palindrome(n): m = str(n) return m == m[::-1] #-------------------------------- N = int(input()) while True: N = N+1 n = N for k in range(30): n = reverse_and_add(n) if is_palindrome(n): break if not is_palindrome(n): break print(N) import random n = random.randint(600,1000) for v in [1, n]: Ex().has_equal_output(pre_code = "___inp___[0] = "+str(v), incorrect_msg = "ยังได้ผลไม่ต้องตามโจทย์ เช่น กรณีอินพุตเป็น " + str(n))

___inp___ = ["1"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def reverse_and_add(n): return n + int(str(n)[::-1]) #-------------------------------- def is_palindrome(n): m = str(n) return m == m[::-1] #-------------------------------- N = int(input()) print( ??? ) def reverse_and_add(n): return n + int(str(n)[::-1]) #-------------------------------- def is_palindrome(n): m = str(n) return m == m[::-1] #-------------------------------- N = int(input()) while True: N = N+1 n = N for k in range(30): n = reverse_and_add(n) if is_palindrome(n): break if not is_palindrome(n): break print(N) import random n = random.randint(600,1000) for v in [1, n]: Ex().has_equal_output(pre_code = "___inp___[0] = "+str(v), incorrect_msg = "ยังได้ผลไม่ต้องตามโจทย์ เช่น กรณีอินพุตเป็น " + str(n))