จงเขียนฟังชัน dot
ที่รับลิสต์ของจำนวนจริง 2 ลิสต์ แต่ละลิสต์แทนเวกเตอร์มีขนาดเท่ากัน ฟังก์ชันนี้คำนวณและคืน dot product ของสองเวกเตอร์ที่ได้รับ
def dot(u, v):
d = 0
for i in range(len(u)):
d += u[i]*v[i]
return d
func = Ex().check_function_def('dot', missing_msg="ไม่พบฟังก์ชัน dot")
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว')
for v in ["[1,2,3], [2,3,4]", "[2.2, 3.3], [4.4, 5.5]"]:
func.check_call("dot("+v+")").\
has_equal_value(incorrect_msg = "ผิด เช่น " + v)
จงเขียนฟังชัน add
ที่รับลิสต์ของจำนวนจริง 2 ลิสต์ แต่ละลิสต์แทนเวกเตอร์มีขนาดเท่ากัน ฟังก์ชันนี้คำนวณและคืนผลบวกของสองเวกเตอร์ที่ได้รับ
def add(u, v):
w = []
for i in range(len(u)):
w.append(u[i]+v[i])
return w
func = Ex().check_function_def('add', missing_msg="ไม่พบฟังก์ชัน add")
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว')
for v in ["[1,2,3], [2,3,4]", "[2.2, 3.3], [4.4, 5.5]"]:
func.check_call("add("+v+")").\
has_equal_value(incorrect_msg = "ผิด เช่น " + v)
func.check_call("add("+v+")").\
has_equal_value(expr_code="type(add("+v+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
จงเขียนฟังชัน to_list_of_strings
ที่รับลิสต์หนึ่งตัว เพื่อสร้างและคืนลิสต์อีกตัวที่ภายในเก็บค่าที่นำข้อมูลจากลิสต์ที่รับมาแปลงเป็นสตริง เช่น รับ [1,2,3] จะคืน ['1', '2', '3']
def to_list_of_strings(x):
results = []
for e in x:
results.append(str(e))
return results
func = Ex().check_function_def('to_list_of_strings', missing_msg="ไม่พบฟังก์ชัน to\_list\_of\_strings")
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
for v in ["[1, 2, 5]", "[1.2, 3.4]"]:
func.check_call("f("+v+")").\
has_equal_value(incorrect_msg = "ผิด เช่น " + v)
func.check_call("f("+v+")").\
has_equal_value(expr_code="type(to_list_of_strings("+v+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
จงเขียนฟังก์ชัน get_positive(x)
ฟังก์ชันนี้รับลิสต์ของจำนวน เพื่อคืนลิสต์ใหม่ที่เก็บจำนวนใน x เฉพาะตัวที่เป็นจำนวนบวก (เก็บเรียงลำดับก่อนหลังเหมือนใน x) เช่น x = [0,1,0,-2,9,3-4] จะคืน [1,9,3]
# อย่าเปลี่ยนหัวฟังก์ชันข้างล่างนี้
def get_positive(x):
def get_positive(x):
p = []
for e in x:
if e > 0:
p.append(e)
return p
func = Ex().check_function_def('get_positive', missing_msg="ไม่พบฟังก์ชัน get\_positive")
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
for v in [[0,-1,-2], [1,2,3], [0,-2,2,3,-1]]:
func.check_call("f("+str(v)+")").\
has_equal_value(incorrect_msg = "ผิด เช่น " + str(v))
func.check_call("f("+str(v)+")").\
has_equal_value(expr_code="type(get_positive("+str(v)+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
func.check_body().set_context(v).\
has_equal_value(name = "x", incorrect_msg = "ไม่จำเป็นต้องเปลี่ยน x ในฟังก์ชันนี้")
จงเขียนฟังก์ชัน get_peak_indexes(x)
ฟังก์ชันนี้รับลิสต์ของจำนวน เพื่อหาและคืนอินเด็กซ์ต่าง ๆ ของ x ที่มีข้อมูลที่มากกว่าตัวที่ติดกันทางซ้ายและขวา เช่น x = [0,1,9,3,4,99,3,4,6,0,9] จะคืน [2,5,8]
def get_peak_indexes(x):
def get_peak_indexes(x):
p = []
for i in range(1, len(x)-1):
if x[i-1] < x[i] > x[i+1]:
p.append(i)
return p
func = Ex().check_function_def('get_peak_indexes', missing_msg="ไม่พบฟังก์ชัน get\_peak\_indexes")
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
for v in ["[1,2,3,4,5]", "[9,0,9]", "[0,9,0]", "[0,9,0,9,0,9,0,9,9,9,8]"]:
func.check_call("f("+v+")").\
has_equal_value(incorrect_msg = "ผิด เช่น " + v)
func.check_call("f("+v+")").\
has_equal_value(expr_code="type(get_peak_indexes("+v+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
จงเขียนฟังก์ชัน all_even
ที่รับ x เป็นลิสต์ของจำนวนเต็ม ฟังก์ชันนี้คืนจริงถ้าทุกค่าใน x เป็นจำนวนคู่ ไม่เช่นนั้นก็คืนเท็จ และเขียนอีกฟังก์ชัน all_even_positions_even
ที่รับ x เป็นลิสต์ของจำนวนเต็ม ฟังก์ชันนี้คืนจริง ถ้าทุกค่าที่ index คู่ใน x เป็นจำนวนคู่ ไม่เช่นนั้นก็คืนเท็จ
def all_even(x):
for e in x:
if e%2==1: return False
return True
def all_even_positions_even(x):
y = x[::2]
return all_even(y)
func = Ex().check_function_def('all_even', missing_msg="ไม่พบฟังก์ชัน all\_even")
func.has_equal_part_len('args', 'all\_even รับพารามิเตอร์แค่ตัวเดียว')
func.multi(
check_call("all_even([2,4,6,2])").has_equal_value(incorrect_msg="all\_even คืนผลไม่ถูกต้อง เมื่อ x เก็บคู่ทั้งหมด"),
check_call("all_even([2,4,6,2,1])").has_equal_value(incorrect_msg="all\_even คืนผลไม่ถูกต้อง เมื่อมีบางตัวใน x เป็นคี่")
)
msg1 = "all\_even\_positions\_even คืนผลไม่ถูกต้อง เมื่อ"
func = Ex().check_function_def('all_even_positions_even', missing_msg="ไม่พบฟังก์ชัน all\_even\_positions\_even")
func.has_equal_part_len('args', 'all\_even\_positions\_even รับพารามิเตอร์แค่ตัวเดียว')
func.multi(
check_call("f([2,4,6,2,8,1,2])").has_equal_value(incorrect_msg=msg1 + " index คู่ใน x เก็บคู่หมด"),
check_call("f([2,4,6,2,1,10,2])").has_equal_value(incorrect_msg=msg1 + "มีบางตัวใน index คู่ของ x เป็นคี่"),
check_body().check_function("all_even", missing_msg="all\_even\_positions\_even ควรใช้ all\_even ให้เป็นประโยชน์")
)
จงเขียนฟังชัน prime_factor
ที่รับจำนวนเต็มบวกหนึ่งค่า เพื่อนำไปแยกตัวประกอบเป็นจำนวนเฉพาะต่าง ๆ เก็บผลลัพธ์ในลิสต์ซึ่งเรียงค่าจากน้อยไปมาก และคืนลิสต์นี้เป็นผลลัพธ์ของฟังก์ชัน เช่น คำสั่ง prime_factor(8568) จะได้ [2, 2, 2, 3, 3, 7, 17] เพราะ 2x2x2x3x3x7x17 = 8568
def prime_factor(n):
k = 2
factors = []
while k <= n:
if n%k == 0:
factors.append(k)
n //= k
else:
k += 1
return factors
func = Ex().check_function_def('prime_factor', missing_msg="ไม่พบฟังก์ชัน prime\_factor")
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
for n in ["617", "1024", "49321", "126225"]:
func.check_call("prime_factor("+str(n)+")").\
has_equal_value(incorrect_msg = "ผิด เช่น " + str(n))