# Hệ thống quản lý công việc học tập (phiên bản mô phỏng)
# Chạy được trực tiếp trên Ideone
from datetime import datetime
# ----- Dữ liệu mẫu -----
users = [ ]
tasks = [ ]
subjects = [ ]
# ----- Các hàm quản lý -----
def add_user( name, email ) :
user = { "id" : len ( users) +1 , "name" : name, "email" : email }
users.append ( user )
return user
def add_subject( name) :
subject = { "id" : len ( subjects) +1 , "name" : name}
subjects.append ( subject)
return subject
def add_task( title, subject_id, owner_id, due_date) :
task = {
"id" : len ( tasks) +1 ,
"title" : title,
"subject_id" : subject_id,
"owner_id" : owner_id,
"due_date" : due_date,
"status" : "todo"
}
tasks.append ( task)
return task
def update_task( task_id, **kwargs) :
for t in tasks:
if t[ "id" ] == task_id:
t.update ( kwargs)
return t
return None
def search_tasks( keyword = None , status= None ) :
result = tasks
if keyword :
result = [ t for t in result if keyword .lower ( ) in t[ "title" ] .lower ( ) ]
if status:
result = [ t for t in result if t[ "status" ] == status]
return result
# ----- Mô phỏng hoạt động -----
u1 = add_user( "Nguyễn Khang" , "khang@example.com" )
u2 = add_user( "Minh An" , "minhan@example.com" )
s1 = add_subject( "Toán học" )
s2 = add_subject( "Lịch sử" )
add_task( "Ôn tập chương 3" , s1[ "id" ] , u1[ "id" ] , "2025-10-20" )
add_task( "Làm bài tập số 5" , s1[ "id" ] , u1[ "id" ] , "2025-10-21" )
add_task( "Đọc tài liệu chiến tranh thế giới" , s2[ "id" ] , u2[ "id" ] , "2025-10-22" )
update_task( 2 , status= "done" )
# ----- Khai thác thông tin -----
print ( "=== Danh sách người dùng ===" )
for u in users:
print ( f"- {u['name']} ({u['email']})" )
print ( "\n === Danh sách môn học ===" )
for s in subjects:
print ( f"- {s['name']}" )
print ( "\n === Công việc cần làm ===" )
for t in tasks:
sub = [ s for s in subjects if s[ "id" ] == t[ "subject_id" ] ] [ 0 ] [ "name" ]
print ( f"[{t['status']}] {t['title']} ({sub}) - hạn {t['due_date']}" )
print ( "\n === Tìm kiếm công việc chứa 'bài tập' ===" )
for t in search_tasks( keyword = "bài tập" ) :
print ( f"- {t['title']} ({t['status']})" )
IyBI4buHIHRo4buRbmcgcXXhuqNuIGzDvSBjw7RuZyB2aeG7h2MgaOG7jWMgdOG6rXAgKHBoacOqbiBi4bqjbiBtw7QgcGjhu49uZykKIyBDaOG6oXkgxJHGsOG7o2MgdHLhu7FjIHRp4bq/cCB0csOqbiBJZGVvbmUKCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgojIC0tLS0tIEThu68gbGnhu4d1IG3huqt1IC0tLS0tCnVzZXJzID0gW10KdGFza3MgPSBbXQpzdWJqZWN0cyA9IFtdCgojIC0tLS0tIEPDoWMgaMOgbSBxdeG6o24gbMO9IC0tLS0tCmRlZiBhZGRfdXNlcihuYW1lLCBlbWFpbCk6CiAgICB1c2VyID0geyJpZCI6IGxlbih1c2VycykrMSwgIm5hbWUiOiBuYW1lLCAiZW1haWwiOiBlbWFpbH0KICAgIHVzZXJzLmFwcGVuZCh1c2VyKQogICAgcmV0dXJuIHVzZXIKCmRlZiBhZGRfc3ViamVjdChuYW1lKToKICAgIHN1YmplY3QgPSB7ImlkIjogbGVuKHN1YmplY3RzKSsxLCAibmFtZSI6IG5hbWV9CiAgICBzdWJqZWN0cy5hcHBlbmQoc3ViamVjdCkKICAgIHJldHVybiBzdWJqZWN0CgpkZWYgYWRkX3Rhc2sodGl0bGUsIHN1YmplY3RfaWQsIG93bmVyX2lkLCBkdWVfZGF0ZSk6CiAgICB0YXNrID0gewogICAgICAgICJpZCI6IGxlbih0YXNrcykrMSwKICAgICAgICAidGl0bGUiOiB0aXRsZSwKICAgICAgICAic3ViamVjdF9pZCI6IHN1YmplY3RfaWQsCiAgICAgICAgIm93bmVyX2lkIjogb3duZXJfaWQsCiAgICAgICAgImR1ZV9kYXRlIjogZHVlX2RhdGUsCiAgICAgICAgInN0YXR1cyI6ICJ0b2RvIgogICAgfQogICAgdGFza3MuYXBwZW5kKHRhc2spCiAgICByZXR1cm4gdGFzawoKZGVmIHVwZGF0ZV90YXNrKHRhc2tfaWQsICoqa3dhcmdzKToKICAgIGZvciB0IGluIHRhc2tzOgogICAgICAgIGlmIHRbImlkIl0gPT0gdGFza19pZDoKICAgICAgICAgICAgdC51cGRhdGUoa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdAogICAgcmV0dXJuIE5vbmUKCmRlZiBzZWFyY2hfdGFza3Moa2V5d29yZD1Ob25lLCBzdGF0dXM9Tm9uZSk6CiAgICByZXN1bHQgPSB0YXNrcwogICAgaWYga2V5d29yZDoKICAgICAgICByZXN1bHQgPSBbdCBmb3IgdCBpbiByZXN1bHQgaWYga2V5d29yZC5sb3dlcigpIGluIHRbInRpdGxlIl0ubG93ZXIoKV0KICAgIGlmIHN0YXR1czoKICAgICAgICByZXN1bHQgPSBbdCBmb3IgdCBpbiByZXN1bHQgaWYgdFsic3RhdHVzIl0gPT0gc3RhdHVzXQogICAgcmV0dXJuIHJlc3VsdAoKIyAtLS0tLSBNw7QgcGjhu49uZyBob+G6oXQgxJHhu5luZyAtLS0tLQp1MSA9IGFkZF91c2VyKCJOZ3V54buFbiBLaGFuZyIsICJraGFuZ0BleGFtcGxlLmNvbSIpCnUyID0gYWRkX3VzZXIoIk1pbmggQW4iLCAibWluaGFuQGV4YW1wbGUuY29tIikKCnMxID0gYWRkX3N1YmplY3QoIlRvw6FuIGjhu41jIikKczIgPSBhZGRfc3ViamVjdCgiTOG7i2NoIHPhu60iKQoKYWRkX3Rhc2soIsOUbiB04bqtcCBjaMawxqFuZyAzIiwgczFbImlkIl0sIHUxWyJpZCJdLCAiMjAyNS0xMC0yMCIpCmFkZF90YXNrKCJMw6BtIGLDoGkgdOG6rXAgc+G7kSA1IiwgczFbImlkIl0sIHUxWyJpZCJdLCAiMjAyNS0xMC0yMSIpCmFkZF90YXNrKCLEkOG7jWMgdMOgaSBsaeG7h3UgY2hp4bq/biB0cmFuaCB0aOG6vyBnaeG7m2kiLCBzMlsiaWQiXSwgdTJbImlkIl0sICIyMDI1LTEwLTIyIikKCnVwZGF0ZV90YXNrKDIsIHN0YXR1cz0iZG9uZSIpCgojIC0tLS0tIEtoYWkgdGjDoWMgdGjDtG5nIHRpbiAtLS0tLQpwcmludCgiPT09IERhbmggc8OhY2ggbmfGsOG7nWkgZMO5bmcgPT09IikKZm9yIHUgaW4gdXNlcnM6CiAgICBwcmludChmIi0ge3VbJ25hbWUnXX0gKHt1WydlbWFpbCddfSkiKQoKcHJpbnQoIlxuPT09IERhbmggc8OhY2ggbcO0biBo4buNYyA9PT0iKQpmb3IgcyBpbiBzdWJqZWN0czoKICAgIHByaW50KGYiLSB7c1snbmFtZSddfSIpCgpwcmludCgiXG49PT0gQ8O0bmcgdmnhu4djIGPhuqduIGzDoG0gPT09IikKZm9yIHQgaW4gdGFza3M6CiAgICBzdWIgPSBbcyBmb3IgcyBpbiBzdWJqZWN0cyBpZiBzWyJpZCJdID09IHRbInN1YmplY3RfaWQiXV1bMF1bIm5hbWUiXQogICAgcHJpbnQoZiJbe3RbJ3N0YXR1cyddfV0ge3RbJ3RpdGxlJ119ICh7c3VifSkgLSBo4bqhbiB7dFsnZHVlX2RhdGUnXX0iKQoKcHJpbnQoIlxuPT09IFTDrG0ga2nhur9tIGPDtG5nIHZp4buHYyBjaOG7qWEgJ2LDoGkgdOG6rXAnID09PSIpCmZvciB0IGluIHNlYXJjaF90YXNrcyhrZXl3b3JkPSJiw6BpIHThuq1wIik6CiAgICBwcmludChmIi0ge3RbJ3RpdGxlJ119ICh7dFsnc3RhdHVzJ119KSIp