Skip to content

Instantly share code, notes, and snippets.

@buraste
Last active March 28, 2019 02:41
Show Gist options
  • Save buraste/10a6f2bbb069deaada50170436b59858 to your computer and use it in GitHub Desktop.
Save buraste/10a6f2bbb069deaada50170436b59858 to your computer and use it in GitHub Desktop.
Hastane Randevu Sistemi
# Hastanenin randevular için belirlediği saat ve hasta planı:
saatler = [
{'kota': 3, 'saat': '09:00'},
{'kota': 3, 'saat': '09:20'},
{'kota': 3, 'saat': '09:40'},
{'kota': 3, 'saat': '10:00'},
{'kota': 3, 'saat': '10:20'},
{'kota': 3, 'saat': '10:40'},
{'kota': 2, 'saat': '11:00'},
{'kota': 2, 'saat': '11:20'},
{'kota': 2, 'saat': '11:40'},
]
# Belirlenen saat ve kotalara göre mevcutta randevu alınmış saatler ve hasta sayıları:
randevular = [
{'kisi_sayisi': 2, 'saat': '10:40'},
{'kisi_sayisi': 3, 'saat': '09:00'},
{'kisi_sayisi': 1, 'saat': '11:40'},
{'kisi_sayisi': 2, 'saat': '11:20'},
{'kisi_sayisi': 1, 'saat': '09:40'},
{'kisi_sayisi': 3, 'saat': '09:00'},
{'kisi_sayisi': 4, 'saat': '10:00'}
]
def musait_saatler(saatler, randevular, kisi_sayisi):
"""
:param saatler: Hastanenin randevular için belirlediği saat ve hasta planı.
:param randevular: Belirlenen saat ve kotalara göre mevcutta randevu alınmış saatler ve hasta sayıları.
:param kisi_sayisi: Tek seferde randevu almak isteyen kişi sayısı.
:return: Hastane tarafından belirlenmiş saat/hasta planı dahilinde alınmış randevuları kontrol ederek hasta kabul edilebilecek
en uygun saatleri listeler. Eğer aynı anda birden fazla kişi randevu almak isterse sonraki saatleri de
kontrol eder.
"""
for randevu in randevular: # Alınmış randevu listesinin içine girdik.
randevu_kisi_sayisi = randevu.get('kisi_sayisi') # Liste içindeki kişi sayılarını get metoduyla ayırdık.
randevu_saati = randevu.get('saat') # Liste içindeki saatleri get metoduyla ayırdık.
for plan in saatler: # Hastanenin belirlediği plan listesinin içine girdik.
kabul_saati = plan.get('saat') # Liste içindeki saatleri get metoduyla ayırdık.
if randevu_saati == kabul_saati:
a = saatler.index(plan) # Kotada değişiklikler yapabilmek için randevu saatinin saat/hasta planı içerisinde hangi index'e denk geldiğini bulduk.
for i in range(0, randevu_kisi_sayisi):
guncellenecek_plan = saatler[a + i] # Saat/hasta planı içerisinde randevu almış hasta kadar ilerledik ve kotası güncellenecek plan_indexı bulduk.
guncellenecek_plan_saati = guncellenecek_plan.get('saat')
guncellenecek_plan_kotasi = guncellenecek_plan.get('kota')
guncellenecek_plan_kotasi = guncellenecek_plan_kotasi - 1 # Bulduğumuz plan_indexın kotasını 1 azalttık. Yani o planı o hastalara rezerve ettik.
rezervasyon = {'kota': guncellenecek_plan_kotasi,
'saat': guncellenecek_plan_saati} # Alınmış randevuları güncellemek için rezervasyon değerine atadık.
saatler[a + i].update(rezervasyon) # Planı alınmış randevular ile kapattık. Artık alacağımız paremetreye göre uygun saatleri söyleyebiliriz.
for saat_kontrol in saatler: # Tekrar hasta/saat planı içine girdik. Şimdi planın dışına çıkmadan randevu kabul edeceğiz.
randevu_durumu = True # Mesai bitene kadar randevu kabul edebiliriz. Buradaki mesai aslında planın başlangıç ve bitişidir.
plan_index = saatler.index(saat_kontrol) # Mesai saatlerimizi ölçtük.
if saat_kontrol.get('kota') == 0: # İki farklı olumsuz durum var:
# 1) Randevular dolmuş olabilir.
# 2) Aynı anda birden fazla kişi için (ardışık) uygun yer olmayabilir. Mesainin yetmemesi de buna dahil.
randevu_durumu = False # İlgili saatler için randevular doldu.
elif kisi_sayisi > plan_index +2:
print("Şuan aynı anda hizmet verebileceğimiz kapasitenin üzerinde başvuru yaptınız.")
break
elif plan_index >= plan_index - kisi_sayisi:
for i in range(1, kisi_sayisi):
guncellenecek_plan = saatler[plan_index + i]
if guncellenecek_plan.get('kota') == 0:
randevu_durumu = False # Plan içerisinde kotası dolmuş planların randevu durumunu gösterir.
if randevu_durumu == True:
a = saat_kontrol.get("saat") # From dicionary
print(a)
musait_saatler(saatler, randevular, 2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment