Sau khi kết thúc khóa học với 100% các bạn sinh viên hoàn thành. Như một lời chia tay năm học đã qua cũng như chào mừng mùa hè rộn rã sắp về, nhà trường tổ chức một buổi cắm trại tại một nơi thật đẹp cho các lớp. Chương trình văn nghệ đêm cắm trại đang trở nên nóng hổi với 150 lượt sinh viên đăng ký. Vì thời lượng đêm diễn có hạn, nên nhà trường đã đưa ra phương án tổ chức một cuộc bốc thăm may mắn kèm theo các điều kiện sàng lọc người tham gia biểu diễn. Phương án này được thực hiện như sau:
- Với 150 sinh viên đăng ký tham gia, Ban tổ chức sẽ phân thành 6 nhóm (A, B, C, D, E, F) với 25 người mỗi nhóm. Có 6 bộ thẻ bài, mỗi bộ thẻ bài gồm 100 lá được đánh dấu từ 1 đến 100.
- Mỗi nhóm (A, B, C, D, E, F) sẽ được phát 1 bộ thẻ bài, và 25 thành viên trong mỗi nhóm nhỏ này sẽ lần lượt lấy và cầm bất kì thẻ bài nào trong bộ thẻ được phát. Lá bài này sẽ được coi đó như là số báo danh của mỗi sinh viên.
- Sau khi phần bốc thăm số báo danh đã xong, các điều kiện sàng lọc tiếp theo sẽ được thực hiện lần lượt như bên dưới:
Sàng lọc 1:
Các bạn sinh viên trong mỗi nhóm (A, B, C, D, E, F) sẽ xếp thành 1 hàng ngẫu nhiên (6 nhóm 6 hàng) với số báo danh được bốc thăm tương ứng.
Với nhóm gộp (A,B,C), xét 3 bạn một lượt theo thứ tự từ đầu hàng đến cuối hàng, sẽ loại trừ các bạn có số báo danh nhỏ nhất (có thể loại 1, 2 hoặc cả 3 nếu 3 sinh viên cùng một số trong lượt xét).
Tương tự với nhóm gộp (D, E, F)
Sàng lọc 2:
Với mỗi nhóm riêng lẻ (A, B, C, D, E, F), nhân tất cả các số báo danh của những thành viên trong nhóm, rồi chia cho (số báo danh lớn nhất - số báo danh nhỏ nhất), nếu phép chia CÓ DƯ, thì sẽ loại các bạn có số báo danh số báo danh lớn nhất và nhỏ nhất, ngược lại thì không loại ai cả.
Sàng lọc 3:
Trong mỗi nhóm gộp (A,B,C) hoặc (D,E,F), nếu có báo danh nào tồn tại 3 lần, thì sẽ loại những bạn sinh viên có số báo danh đó
Cuối cùng:
Trải qua 3 giai đoạn của sàng lọc 1, 2 và 3, các bạn còn lại sẽ được tham gia biểu diễn văn nghệ. Và ban tổ chức muốn biết có tổng cộng bao nhiêu số báo danh khác nhau trong tất cả các nhóm (A + B + C + D + E + F) sau khi sàng lọc
Ví dụ chi tiết:
150 sinh viên được phân chia các 6 nhóm và xếp thành 6 dãy hàng với số báo danh bốc thăm tương ứng như bên dưới:
A: 55 59 73 65 56 52 71 70 72 57 64 74 66 61 53 50 60 62 51 69 63 68 58 67 54
B: 60 51 69 53 74 73 61 66 70 55 72 71 54 56 65 58 63 68 64 59 50 52 67 62 57
C: 51 55 70 50 53 52 67 64 65 61 60 57 62 69 63 74 56 54 71 58 68 73 59 72 66
D: 70 74 63 58 55 54 61 68 52 56 59 66 65 62 53 60 51 72 64 50 57 73 71 67 69
E: 51 72 50 70 63 60 68 71 61 67 55 69 66 59 52 74 54 53 64 56 62 57 73 65 58
F: 67 71 51 62 56 55 64 57 70 52 66 74 69 50 59 65 58 73 72 53 63 54 68 61 60
Sàng lọc 1:
Tìm số báo danh nhỏ nhất của mỗi nhóm gộp (A,B,C) và (D,E,F) với 3 sinh viên một lượt từ hàng đầu đến hàng cuối
A: 55 59 73 65 56 52 71 70 72 57 64 74 66 61 53 50 60 62 51 69 63 68 58 67 54
B: 60 51 69 53 74 73 61 66 70 55 72 71 54 56 65 58 63 68 64 59 50 52 67 62 57
C: 51 55 70 50 53 52 67 64 65 61 60 57 62 69 63 74 56 54 71 58 68 73 59 72 66
D: 70 74 63 58 55 54 61 68 52 56 59 66 65 62 53 60 51 72 64 50 57 73 71 67 69
E: 51 72 50 70 63 60 68 71 61 67 55 69 66 59 52 74 54 53 64 56 62 57 73 65 58
F: 67 71 51 62 56 55 64 57 70 52 66 74 69 50 59 65 58 73 72 53 63 54 68 61 60
Số báo danh nhỏ nhất trong A, B, C theo từng lượt thứ tự
51 51 69 50 52 61 64 65 55 60 57 54 56 53 50 56 54 51 58 50 52 58 62 54
Số báo danh nhỏ nhất trong D, E, F theo từng lượt thứ tự
51 71 50 58 55 54 61 57 52 52 55 66 65 50 52 60 51 53 64 50 57 54 68 61 58
Với quy tắc sàng lọc 1, các sinh viên bị loại trừ (RM) của các nhóm sẽ như sau:
A: 55 59 73 65 56 RM 71 70 72 57 64 74 66 61 RM RM 60 62 RM 69 63 68 RM 67 RM
B: 60 RM RM 53 74 73 RM 66 70 RM 72 71 RM RM 65 58 63 68 64 59 RM RM 67 RM 57
C: RM 55 70 RM RM RM 67 RM RM 61 RM RM 62 69 63 74 RM RM 71 RM 68 73 59 72 66
D: 70 74 63 RM RM RM RM 68 RM 56 59 RM RM 62 53 RM RM 72 RM RM RM 73 71 67 69
E: RM 72 RM 70 63 60 68 71 61 67 RM 69 66 59 RM 74 54 RM RM 56 62 57 73 65 RM
F: 67 RM 51 62 56 55 64 RM 70 RM 66 74 69 RM 59 65 58 73 72 53 63 RM RM RM 60
Sàng lọc 2:
Với nhóm A: Số báo danh nhỏ nhất nhóm A là 55, lớn nhất của nhóm A là 74, kết quả nhân của tất cả số báo danh có trong nhóm A là 24706114253832042444183504814080000, và số dư của phép chia là: 0
Vì số dư của phép chia là 0, nên giữ nguyên các sinh viên của nhóm A
Tương tự cho nhóm B
Với nhóm C: Số báo danh nhỏ nhất nhóm C là 55, lớn nhất của nhóm C là 74, kết quả nhân của tất cả số báo danh có trong nhóm C là 31009658378006367135014400, và số dư của phép chia là: 7
Vì là chia có dư, nên sẽ loại trừ các bạn sinh viên có số báo danh là 55 và 74 trong nhóm C
Tương tự cho các nhóm còn lại
Sau phép sàng lọc 2, tình trạng sinh viên các nhóm là:
A: 55 59 73 65 56 RM 71 70 72 57 64 74 66 61 RM RM 60 62 RM 69 63 68 RM 67 RM
B: 60 RM RM 53 74 73 RM 66 70 RM 72 71 RM RM 65 58 63 68 64 59 RM RM 67 RM 57
C: RM RM 70 RM RM RM 67 RM RM 61 RM RM 62 69 63 RM RM RM 71 RM 68 73 59 72 66
D: 70 74 63 RM RM RM RM 68 RM 56 59 RM RM 62 53 RM RM 72 RM RM RM 73 71 67 69
E: RM 72 RM 70 63 60 68 71 61 67 RM 69 66 59 RM 74 54 RM RM 56 62 57 73 65 RM
F: 67 RM 51 62 56 55 64 RM 70 RM 66 74 69 RM 59 65 58 73 72 53 63 RM RM RM 60
Sàng lọc 3:
Nhóm gộp (A + B + C) sẽ bao gồm các bạn có số báo danh sau đây:
55, 59, 73, 65, 56, 71, 70, 72, 57, 64, 74, 66, 61, 60, 62, 69, 63, 68, 67, 60, 53, 74, 73, 66, 70, 72, 71, 65, 58, 63, 68, 64, 59, 67, 57, 70, 67, 61, 62, 69, 63, 71, 68, 73, 59, 72, 66
Nhóm gộp (D + E + F) sẽ bao gồm các bạn có số báo danh sau đây:
70, 74, 63, 68, 56, 59, 62, 53, 72, 73, 71, 67, 69, 72, 70, 63, 60, 68, 71, 61, 67, 69, 66, 59, 74, 54, 56, 62, 57, 73, 65, 67, 51, 62, 56, 55, 64, 70, 66, 74, 69, 59, 65, 58, 73, 72, 53, 63, 60
Ta thấy rằng trong nhóm gộp (A + B + C) có những số báo danh xuất hiện 3 lần
59, 73, 71, 70, 72, 66, 63, 68, 67
Ta thấy rằng trong nhóm gộp (D + E + F) có những số báo danh xuất hiện 3 lần
70, 74, 63, 56, 59, 62, 72, 73, 67, 69
Vậy là sau khi nhóm gộp loại trừ những bạn sinh viên có số báo danh xuất hiện 3 lần, thì các bạn sinh viên có số báo danh còn lại:
Nhóm gộp (A + B + C):
55, 65, 56, 57, 64, 74, 61, 60, 62, 69, 60, 53, 74, 65, 58, 64, 57, 61, 62, 69
Nhóm gộp (D + E + F)
68, 53, 71, 60, 68, 71, 61, 66, 54, 57, 65, 51, 55, 64, 66, 65, 58, 53, 60
Kết quả, chúng ta có thể đếm được có 17 số báo danh khác nhau trong tất cả các nhóm A + B + C + D + E + F
Bạn cần thực hiện các công việc sau:
Tiến hành lập trình để nhập 6 chuỗi ký tự( nhóm A, nhóm B, nhóm C, nhóm D, nhóm E, nhóm F), sau đó viết chương trình để trả về giá trị kết quả
Ví dụ lời gọi chương trình:
ChallengeClass().FindTalent("55,59,73,65,56,52,71,70,72,57,64,74,66,61,53,50,60,62,51,69,63,68,58,67,54","60,51,69,53,74,73,61,66,70,55,72,71,54,56,65,58,63,68,64,59,50,52,67,62,57","51,55,70,50,53,52,67,64,65,61,60,57,62,69,63,74,56,54,71,58,68,73,59,72,66","70,74,63,58,55,54,61,68,52,56,59,66,65,62,53,60,51,72,64,50,57,73,71,67,69","51,72,50,70,63,60,68,71,61,67,55,69,66,59,52,74,54,53,64,56,62,57,73,65,58","67,71,51,62,56,55,64,57,70,52,66,74,69,50,59,65,58,73,72,53,63,54,68,61,60")
Ràng buộc:
- Mỗi chuỗi số trong tham gia sẽ có 25 sinh viên với giá trị tương ứng là số báo danh
- Các số báo danh sẽ nằm trong vùng [1..100]
Mọi người giúp mình với ngôn ngữ được dùng là python
Hạn chế dùng for và while
import re
class ChallengeClass:
def FindTalent(self, groupA, groupB, groupC, groupD, groupE, groupF):
def filter_group(group):
group = list(map(int, group.split(',')))
group = group[1::3] + group[2::3]
group = [x for i, x in enumerate(group) if (x != max(group) and x != min(group)) or sum(group) % (max(group) - min(group)) == 0]
return group
def remove_triplicate_ids(merged_group):
return [x for x in set(merged_group) if merged_group.count(x) < 3]
groupA = filter_group(groupA)
groupB = filter_group(groupB)
groupC = filter_group(groupC)
groupD = filter_group(groupD)
groupE = filter_group(groupE)
groupF = filter_group(groupF)
merged_group1 = groupA + groupB + groupC
merged_group2 = groupD + groupE + groupF
final_group1 = remove_triplicate_ids(merged_group1)
final_group2 = remove_triplicate_ids(merged_group2)
return len(set(final_group1 + final_group2))
challenge = ChallengeClass()
result = challenge.FindTalent("55,59,73,65,56,52,71,70,72,57,64,74,66,61,53,50,60,62,51,69,63,68,58,67,54", "60,51,69,53,74,73,61,66,70,55,72,71,54,56,65,58,63,68,64,59,50,52,67,62,57", "51,55,70,50,53,52,67,64,65,61,60,57,62,69,63,74,56,54,71,58,68,73,59,72,66", "70,74,63,58,55,54,61,68,52,56,59,66,65,62,53,60,51,72,64,50,57,73,71,67,69", "51,72,50,70,63,60,68,71,61,67,55,69,66,59,52,74,54,53,64,56,62,57,73,65,58", "67,71,51,62,56,55,64,57,70,52,66,74,69,50,59,65,58,73,72,53,63,54,68,61,60")
print(result)
challenge = ChallengeClass()
Giải thích:result = challenge.FindTalent("55,59,73,65,56,52,71,70,72,57,64,74,66,61,53,50,60,62,51,69,63,68,58,67,54", "60,51,69,53,74,73,61,66,70,55,72,71,54,56,65,58,63,68,64,59,50,52,67,62,57", "51,55,70,50,53,52,67,64,65,61,60,57,62,69,63,74,56,54,71,58,68,73,59,72,66", "70,74,63,58,55,54,61,68,52,56,59,66,65,62,53,60,51,72,64,50,57,73,71,67,69", "51,72,50,70,63,60,68,71,61,67,55,69,66,59,52,74,54,53,64,56,62,57,73,65,58", "67,71,51,62,56,55,64,57,70,52,66,74,69,50,59,65,58,73,72,53,63,54,68,61,60")
print(result)
Hàm filter_group(group): Hàm này nhận vào một chuỗi các số báo danh của một nhóm, thực hiện Sàng lọc 1 và 2, và trả về danh sách các số báo danh còn lại sau khi sàng lọc.
Chuyển đổi chuỗi thành danh sách số nguyên: group = list(map(int, group.split(',')))
Sàng lọc 1: Lấy các phần tử có chỉ số 1, 4, 7,... và 2, 5, 8,... để loại bỏ phần tử nhỏ nhất trong mỗi nhóm 3: group = group[1::3] + group[2::3]
Sàng lọc 2: Sử dụng list comprehension để giữ lại các phần tử thỏa mãn điều kiện: group = [x for i, x in enumerate(group) if (x != max(group) and x != min(group)) or sum(group) % (max(group) - min(group)) == 0]
Hàm remove_triplicate_ids(merged_group): Hàm này nhận vào danh sách đã gộp của 3 nhóm, thực hiện Sàng lọc 3, và trả về danh sách các số báo danh duy nhất xuất hiện ít hơn 3 lần.
Sử dụng set để loại bỏ trùng lặp: [x for x in set(merged_group) if merged_group.count(x) < 3]
Phần chính của chương trình (FindTalent):
Áp dụng filter_group cho từng nhóm A, B, C, D, E, F.
Gộp 3 nhóm đầu thành merged_group1, 3 nhóm sau thành merged_group2.
Áp dụng remove_triplicate_ids cho merged_group1 và merged_group2.
Trả về tổng số lượng phần tử duy nhất (không trùng lặp) trong cả hai nhóm sau khi sàng lọc bằng len(set(final_group1 + final_group2)).
Lưu ý: Chương trình này sử dụng list comprehension và các hàm như map, sum, max, min để tránh sử dụng vòng lặp for và while một cách trực tiếp.
import re
class ChallengeClass:
def FindTalent(self, groupA, groupB, groupC, groupD, groupE, groupF):
def filter_group(group):
group = list(map(int, group.split(',')))
group = group[1::3] + group[2::3]
group = [x for i, x in enumerate(group) if (x != max(group) and x != min(group)) or sum(group) % (max(group) - min(group)) == 0]
return group
def remove_triplicate_ids(merged_group):
return [x for x in set(merged_group) if merged_group.count(x) < 3]
groupA = filter_group(groupA)
groupB = filter_group(groupB)
groupC = filter_group(groupC)
groupD = filter_group(groupD)
groupE = filter_group(groupE)
groupF = filter_group(groupF)
merged_group1 = groupA + groupB + groupC
merged_group2 = groupD + groupE + groupF
final_group1 = remove_triplicate_ids(merged_group1)
final_group2 = remove_triplicate_ids(merged_group2)
return len(set(final_group1 + final_group2))
challenge = ChallengeClass()
result = challenge.FindTalent("55,59,73,65,56,52,71,70,72,57,64,74,66,61,53,50,60,62,51,69,63,68,58,67,54", "60,51,69,53,74,73,61,66,70,55,72,71,54,56,65,58,63,68,64,59,50,52,67,62,57", "51,55,70,50,53,52,67,64,65,61,60,57,62,69,63,74,56,54,71,58,68,73,59,72,66", "70,74,63,58,55,54,61,68,52,56,59,66,65,62,53,60,51,72,64,50,57,73,71,67,69", "51,72,50,70,63,60,68,71,61,67,55,69,66,59,52,74,54,53,64,56,62,57,73,65,58", "67,71,51,62,56,55,64,57,70,52,66,74,69,50,59,65,58,73,72,53,63,54,68,61,60")
print(result)