ฟังก์ชัน 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) + " ให้ผลผิด")
จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
ฟังก์ชัน 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))