จงเขียนฟังก์ชัน to_buckets(d)
รับ d เป็นลิสต์ของจำนวนเต็ม ฟังก์ชันนี้คืนลิสต์ 10 ช่อง ช่องที่ k จะเก็บจำนวนเต็มใน d ที่มีหลักหน่วยเป็น k (ลำดับซ้าย/ขวาของข้อมูลในลิสต์ย่อย ให้เป็นไปตามลำดับซ้าย/ขวาใน d) เช่น to_buckets([33,21,143,33,11])
จะได้ [[], [21, 11], [], [33, 143, 33], [], [], [], [], [], []]
def to_buckets(d):
def to_buckets(d):
b = []
for i in range(10):
b.append([])
for e in d:
b[e%10].append(e)
return b
q = "`"
fname = "to_buckets"
func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q))
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
import random
d = [random.randint(100,999) for i in range(10)]
params = ["[13,22,41,64,56,75,87,19,100,8]", d]
for p in params:
fcall = fname + "(" + str(p) + ")"
func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
จงเขียนฟังก์ชัน read_points()
ซึ่งคืนลิสต์ของพิกัดจุดต่าง ๆ ที่อ่านได้จากอินพุต ลิสต์ที่คืนอยู่ในรูปแบบ [[x0,y0], [x1,y1], ...]
ส่วนอินพุตมีบรรทัดเดียวอยู่ในรูปแบบ x0:y0, x1:y1, ...
เช่น 1.0:2.4, 3:5, 6:9.0
___inp___ = ['2:3, 4.5:4.0']
def input():
t = ___inp___.pop(0)
___inp___.append(t)
return t
# input: 2:3, 4:4
# return: [[2.0, 3.0], [4.0, 4.0]]
def read_points():
# input: 2:3, 4:4
# return: [[2.0, 3.0], [4.0, 4.0]]
def read_points():
points = []
x = input().split(", ")
for s in x:
x,y = s.split(":")
p = [float(x), float(y)]
points.append(p)
return points
q = "`"
fname = "read_points"
func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q))
func.has_equal_part_len('args', 'ฟังก์ชันนี้ไม่รับพารามิเตอร์ใด ๆ')
import random
p = ""
for i in range(4):
x = float(random.randint(-9,9))
y = float(random.randint(-9,9))
p += str(x)+":"+str(y)+", "
p = p[:-2]
for v in ["2:3", p]:
fcall = fname + "()"
func.check_call(fcall).has_equal_value(pre_code="___inp___[0] = '" + v + "'",
incorrect_msg = "ผิด กรณีอินพุตเป็น " + v)
จงเขียนฟังก์ชัน all_closest_pairs(points)
รับ points
เป็นลิสต์ที่เก็บพิกัดของจุดต่าง ๆ แต่ละพิกัดเป็นลิสต์สองช่องเก็บพิกัด x และ y ฟังก์ชันนี้คืนลิสต์ของทุก ๆ คู่จุดที่อยู่ใกล้กันที่สุด (ใช้อินเด็กซ์ใน points เป็นเลขกำกับจุด) เช่น all_closest_pairs([[30,30], [30,31], [31,30], [30,32]])
ได้ [[0, 1], [0, 2], [1, 3]]
(ให้สังเกตการเรียงข้อมูลในลิสต์ผลลัพธ์ คือต้องเรียงจากน้อยไปมาก)
def all_closest_pairs(points):
def distance(p1, p2):
dx = p1[0] - p2[0]
dy = p1[1] - p2[1]
return (dx**2 + dy**2)**0.5
#-------------------------------------
def all_closest_pairs(points):
min_distance = distance(points[0],points[1])
for i in range(len(points)):
for j in range(i+1, len(points)):
d = distance(points[i],points[j])
if d < min_distance:
min_distance = d
closest_pairs = []
for i in range(len(points)):
for j in range(i+1, len(points)):
d = distance(points[i],points[j])
if d == min_distance:
closest_pairs.append([i,j])
return closest_pairs
q = "`"
fname = "all_closest_pairs"
func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q))
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
import random
x = [random.randint(-3,3) for i in range(6)]
y = [random.randint(-3,3) for i in range(6)]
points = [[x[i],y[i]] for i in range(len(x))]
params = ["[[10,10],[11,10],[9,10]]", str(points)]
for p in params:
fcall = fname + "(" + p + ")"
func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
จงเขียนฟังก์ชัน to_dict(like_list)
รับลิสต์ในรูปแบบ [[u1,u2], [u3,u4], ...]
ที่เก็บรายการที่ระบุว่าใครชอบใครในสื่อสังคมออนไลน์แห่งหนึ่ง สิ่งที่ฟังก์ชันนี้ต้องทำคือ สร้าง dict ในรูปแบบ {user: ลิสต์ของ users ทั้งหมดที่ user ที่เป็นคีย์ชอบ}
เช่น to_dict([['A', 'B'], ['A', 'C'], ['C', 'B']])
จะได้ {'A': ['B', 'C'], 'C': ['B']}
def to_dict(like_list):
def to_dict(like_list):
like_dict = {}
for u1,u2 in like_list:
if u1 not in like_dict:
like_dict[u1] = [u2]
else:
like_dict[u1].append(u2)
return like_dict
q = "`"
fname = "to_dict"
func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q))
func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว')
params = [[['A','B'],['A','C'],['C', 'B']], [['A','B'],['A','C'],['A','D']], [['A','Z'],['B','Z'],['C','Z']]]
for p in params:
fcall = fname + "(" + str(p) + ")"
func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")