Aller au contenu

Mise à jour de la liste d'emprunt d'une bibliothèque

Le cadre

Pour simplifier à l'extrême la gestion d'une base d'emprunt de N livres d'une bibliothèque, on considère que :

  • Tous les livres sont indicés de 0 inclus à N exclu.
  • Chaque livre possède une date de disponibilité (un entier positif, sur une échelle de temps adaptée)
  • Un tableau disponibilité qui renseigne de la date de disponibilité de chaque livre.
    • Initialement, tous les livres sont disponibles à l'ouverture de la bibliothèque, à date = 0.
    • Si un livre est disponible depuis une date indiquée dans disponibilité, il peut effectivement être emprunté à nouveau dès la date indiquée.
    • Si un livre est emprunté pour une certaine durée à une date_emprunt, alors sa prochaine disponibilité sera date_emprunt + durée.

Exemple concret

Le jour de l'ouverture de la bibliothèque, il y a 5 livres, et on disponibilités = [0, 0, 0, 0, 0]

On envisage quelques requêtes d'usagers :

  1. On souhaite emprunter, le livre d'indice 1, à compter de la date 0, pour une durée de 5
    • C'est possible. Modification en place, disponibilités = [0, 5, 0, 0, 0]
  2. On souhaite emprunter, le livre d'indice 1, à compter de la date 2, pour une durée de 2
    • C'est impossible. Pas d'autre modification, disponibilités = [0, 5, 0, 0, 0]
  3. On souhaite emprunter, le livre d'indice 4, à compter de la date 3, pour une durée de 1
    • C'est possible. Modification en place, disponibilités = [0, 5, 0, 0, 4]
  4. On souhaite emprunter, le livre d'indice 2, à compter de la date 3, pour une durée de 10
    • C'est possible. Modification en place, disponibilités = [0, 5, 13, 0, 4]
  5. On souhaite emprunter, le livre d'indice 4, à compter de la date 4, pour une durée de 4
    • C'est possible. Modification en place, disponibilités = [0, 5, 13, 0, 8]
  6. On souhaite emprunter, le livre d'indice 1, à compter de la date 4, pour une durée de 7
    • C'est impossible. Pas d'autre modification, disponibilités = [0, 5, 13, 0, 8]

Exercice - Partie 1

Coder une fonction emprunt_possible

  • qui prend en paramètres :
    • disponibilités, un tableau d'entiers positifs qui indique la disponibilité de chaque livre de la bibliothèque.
    • i_livre, un indice qui indique le livre à emprunter
    • date_emprunt, la date souhaitée pour emprunter i_livre
    • durée, la durée souhaitée pour emprunter i_livre
  • et qui renvoie un booléen
    • False, si le livre n'est pas disponible pour l'emprunt souhaité.
    • True, sinon. Et dans ce cas le tableau disponibilités doit être modifié en place pour refléter l'emprunt souhaité.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013],5/fTr;nb _o=ylaepcwgu)vd46F13kméhtsP(S+2[i:050A0s0K0r0S0q0L0l0u0q0r0L0L0o010K0S0t010406050L0x0H0H0r0h0p040O0n0q0x0.0n0j050e0^0`0|0~0?0t04051e171h0e1e0?0A0S0z0$0(0*0,0J0S0w0J0q1v0J0K0;050X0k0q0s1q0)0+011u1w1y1w0K1E1G1C0K0h1f0K0J1I1s010f0Z0s0j0r0H0s010$110L0t0r0j0,0Q1C1:1=1Z1K1$1G1)1+0;0a0l0M0h0n0t0n0L0S140j0l0V1.0h0h0s0u2c171`0j1f0e1X2p1U1W1V1D0A1|0,1y0j1(291C1n1p0%1J2z0S2B0j0n2F1C0t2i1f2n2p2T0@1;2d2H1!2M0h0{0q0;0E2m2X0=2W1{2Z1K2#2%0;0Q2+1=2-2n2y012=0r2(040F2_2o0?2|2:0,2 310B342{2X2}3a0;0d3d363f382~0n2$300;0C3d1i2R172F2s0A1W2x3n0u2N1,1f3y1g3w2V182,053E0V2S3m1r1K0G0;0V0f3u373T0,0v0;0l3Z3S2I2~0f0;0s0H2Q0x0j0K0m280*0S1F0s3*2/3#010:040N3 2Y410j3W0S1:153|0Z2b0I0L462}430c3d3)3!3,49040S0m1y0z2i4j3n4l4n2.474q3W0r0K0s0m3:3=3@4y414A3M2`4o3+2!3W0x0h0I3~4Q2o4C4k0;0y0T3k0l4,4S403,3V4s3Y4!044.4D4U041n4c0j4e1y0K4h4N3,430R544{4t4v4x4@4$4z0;0b4B4p1!0n0;020q0K0i0o5i4T2;4F4H4J3;0h3?0K581K434*4@064-5I4_3g4a4~504g4i5d5j5D0;575R5t390;5a1o5c2V5S0,435h4@5K3n5l045r5,5e485v4I4K5z4M5=5(015/0P5s4/4{0A4W4Y4+5J4,5?4:0;2i0K4W165}5X010G0u0;0g5z4Z2T5H4-6b1!4;0s0!6q3N5~5E68696u3U6d0W6g624`3U6m040D300L6z2`0?0e3P0s2p2Q6X3x1o3z2s2v2q0r3}2p3y6U0V0X0Z0L04.

Exercice - Partie 2

Coder une fonction traitement

  • qui prend en paramètres :
    • disponibilités, un tableau d'entiers positifs qui indique la disponibilité de chaque livre de la bibliothèque.
    • un tableau requêtes composée de tuples (i, date_emprunt, durée)
  • et qui renvoie un tableau de booléens reflétant si les emprunts souhaités ont été acceptés, ou non. Le tableau disponibilités doit alors être mis à jour en place.

👍 La fonction emprunt_possible sera disponible, même si vous n'avez pas abordé la partie 1.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013.128077],5/f.qr;nb _oO=ylaeêpcwgu)vd41ç3kRAméhtsP(S0+2[-ji:@050E0v0P0u0!0t0Q0n0y0t0u0Q0Q0r010P0!0x010406050Q0B0M0M0u0j0s040T0p0t0B0`0p0l0n020u0M0x0k0n0K0v140j0i0B0v0Q050f111315170 0x04051C1v1F0f1C0 0E0!0D0/0;0?0^0O0!0A0O0t1T0O0P0}050*0m0t0v1O0=0@011S1U1W1U0P1$1(1!0P0j1D0P0O1*1Q010g0,0v0l1i0v010/1a0Q0x0u0l0^0W1!2a2c1~1,211(240M26040a0n0R0j0p0x0p0Q0!1d1f0(280j0j0v0y2A1v2h0l1D0f1|2M1_1{1`1#0E2j0^1W0l232x1!1L1N0:1+2W0!2Y0l0p2$1!0x2F1D2K2M2@102b1f2(1 2-0j140t0}0G2J2{0~2`2i2}1,2 310}0W352c372K2V013c0u32040I3g2L0 3j3a0^3m3o0F3r3i2{3k3x0}0e3A1G2=1v2$2P0E1{2U3v010y2.2p0%1M1D2;0v2?363H3S0(3!391P1,0J0}0(0g3H3u3+0^0z0}0n3;3C3Q0l0g0}1_0+0P1o230P3{3*2)010|040S472|3?3l3.0!2a1e0!0m0,2z0N1u1w3#3=494b0d3A3`4u2~0}2F1r0w434r2_4A1,4b0C0#3A060n4Q4z3|4g0l4C4q0B0t0*464s3h4S481 0p0}0r4y384f4v0}0X0c4O4R4(4:1 3-040g0p0j4.4J0^4b4d4$2L4/3D0}0!0o1W0D2F4e3k4w524T494V040E0u430o1o2;0B0l4#4I5l1 5j57044`5a5o0B0j0N0v5h3Q4L5k4)1,0p3^042+5O4{3b4C0v4E4G5L4g4b4N5C4P4_4R593}4W114Z5q5$494+040h5@4B040u0x0x230E5|4K0}565y5P3w0}5t0j5v0P0o2w0?4m1(6454666l4h5o4j2w0l4m4o0P4q6o5B2@5E5/5T5d1M5g5C5.5%0}4x5C6B4U3.5q0v5s1j6d5w6y6K5V5F0E5H5J6W040C0C4^5-53014}2F0P5H0l6Y6C5I5;4!4O1v3%3Z3I6 0f3L1v0P3N742S2N0u1%713L1B3)5W0^2F0M0o0g0u0J6R0O0I0}1n1p1r1t0n5)2_1I372$3k0u0E0M4l2A0n0`4b1B7C7E7G0!1e0Y0`0P1@040L0D2G0n5v1)1W0Q430n23286T0N0O232y1e1G7A1M3k1.1V1X1Z7f3k2l23250}2r0T0y0j0{0P2s0s1|7;6H3Y7f2^3#6~7}3Q4}3/6o5S3`6H6-3~400j42446V8q5z654c6o5n1L4k6t4n1W6w4H4t8z6m046L6A6I5m5Y5!1t6%4M6+4Q8R4|5Y6;0j6?6M8!8A0X8Y5,8+6a046c6e6g2x2y7b6%678L696p8E6s6u8I6x8y8 6z366N8S6D5e6G687g4a6X8*8r6P5r8?8x9f5i9i8Q9k5G5I5K969g5N5*5,6,8M6.0}4 519j9D558C5b6%8P998:906Q6S5u9o8~9y9r9P9t6!9v8W6@4g5R5b8)9s9D5n4D0B4F8V9A9C970}4@5*6}3T2M8e3K3W7e050!0M0A0n3n0P0^0b273Q0P0z1o0p0Z0!270Q0j0y1R1=0x0Q0#0f0f0y0E0l0h0Z0Q0(9d0h2Y0P0f1U0f0Z0(0y7n0E2Nag7Faj0$0G0e0h0G0h0U0f1+0)0Q1w0D0A0f0G0g0F0F0E0h0Qa)277S1(0^0#0V0G0#010f5D0q1f7i157u8u0n0;0n7l0H1e0n2C0x0;0y0v0jb87v850p0y7.0P0.0)bl0.0Q0u1c0.2C1:2Y5{7z0 72a23K0)0+0-04.