1-condition
1-boucle
5-difficile
à trous
Exercice 9 - Casseur de digicode ⭐
On cherche dans cet exercice à déterminer la combinaison d'un digicode. Celui-ci est représenté une fonction
digicode
prenant quatre paramètres a
, b
, c
et d
correspondant chacun à un entier compris entre \(0\) et \(9\) (inclus l'un et l'autre) et renvoyant True
si la combinaison formée par ces quatre chiffres est valide et False
sinon.
On peut prendre par exemple :
Python def digicode_1 ( a , b , c , d ):
return a + b - c - d == 0
L'appel digicode_1 ( 1 , 2 , 3 , 4 )
renvoie False
. ( 1 , 2 , 3 , 4 )
n'est donc pas une combinaison valide.
Par contre digicode_1 ( 4 , 5 , 4 , 5 )
renvoie True
. ( 4 , 5 , 4 , 5 )
est une combinaison valide.
Plusieurs solutions !
Ce digicode présente de nombreuses solutions valides (( 0 , 0 , 0 , 0 )
, ( 3 , 4 , 5 , 2 )
...).
De façon générale, un « digicode » peut avoir plusieurs solutions. On cherche à en déterminer une parmi celles-ci.
Vous devez écrire la fonction digicrack
qui prend en paramètre une fonction digicode
et renvoie
un tuple de quatre entiers, chacun compris entre \(0\) et \(9\) , correspondant à une combinaison acceptée par le digicode.
On garantit que le « digicode » admet au moins une combinaison valide.
Exemples
>>> def digicode_1 ( a , b , c , d ):
... return a + b - c - d == 0
...
>>> digicrack ( digicode_1 )
(4, 5, 4, 5)
>>> def digicode_2 ( a , b , c , d ):
... return 156 * a - 820 * b + 1463 * c - 465 * d == 7607
...
>>> digicrack ( digicode_2 )
(3, 5, 8, 1)
Indice
Votre fonction n'a pas besoin d'analyser le fonctionnement de la fonction digicode
.
Il n'y a pas tant de combinaisons possible que ça, vous pouvez toutes les tester !
En cryptanalyse, on appelle cette méthode attaque par force brute .
Version vide Version à compléter
.128013="m_eh(3yapl)7,dun sS:6w
gPi1vkr0-t25f4bco/030k090D0e0w0g0o0n0J0g0e0o0o05060D0w0f06020t030o0l07070e0A0d020p0K0g0l0$0K0m030L0,0.0:0=0*0f0203150~180L150*0k0w0y0U0W0Y0!0W0m0u0l0e0u090C0f0d0D0a0|0n0a0w0u0a0g1A0a0D0(030P0I0g091h0X0Z061z1B1D1B0D1J1L1H0D0A161v0U0^0o0f0e0m0!0E061N1j060G0R090m0e07091H1(1*1/1P1=1L1^1`0(040n0v0A0K0f0K0o0w0{0m0n0N1%0A0A090J2f0~1}0m160L1v2s1Z1#1!1I0k1 1k0w0m1@2c1H1e1g0V1O2C2E0m0K2I1H0f2l162q2s2V0+1)2g2K1:2O0A0/0g1H0e1y2l0G0!0108080J2P091D2N0K0C0E0C0x0(0x0~0e2W2Z0)2Y1~2#1P2%2(2*2,092.062:2=2@2_2F2|2|0(0E32341*362q2B063b0e2)162+0a2-2/2;2?0N3l2O3n0c0(0c3r2p350*3v390!3y3A033C3E3h3G3k2D3m2}0H0(0H3P0 3R372!1i3a0K2'3z3d3D3f3F3j3I3'3K2}0F0(0F3-2V3S2Z3w3W3`3!3i3H2^402{2}0r0(0r463/3T3=3V3@3c3B3e3g4e3%2`3n0i0(0i4n3t192T0~2I2v0k1#2A3U064f2H1f162S092U353Q4F4f4W1~0w0k0!2;2q3n2 4u4%4(3~4g4z2}2 0n23094/4f3J4i2~1H0L333:3w0z0(0N0G4Y2r0n534O0m0G561A0w0J0A0e0J0z594#3;2L060'020b5o5c4q3x5g0u5i2@5w4p5r5t0h0q5o0*3.4F3v4.064)2Z3n1-4-4'5Q4:4}5T1.4_4{4y3(3o2s330n5,5b5F1:55020G3@5o5.495d0(0e5^5x5r0K0s0(2D5~5/3a0I0(5k1m095E5`5y5t5v5M2r5 1:070w300B6d386f0(5I5K6q2g5P5R1*3L3d6y5Y4h6B4^1_4`5X4|6F2}3M5*025-6R5_6r5r5;5?0A656e5r0m0(0I6Z6U1:61630}6i6Q6k67691*1q6w3w6g6^4O6m6o6{6s026u6.5L2X5O5W6z0m3n3*5V5%3 4=0C3*6H1`7d4;5(7b3r6S7p6T5q5:0(6X6(7s3a0(0J7w3w6+02646.7r4a68026a6@6.6:0!6`7N660!6}020x6p7R6!1:5H5J736^6D4*426C776E7f437i6J3$7e5(436P7q7`7H4O6W5@7G7O5z020k7B4O7D7F2V7|5y0m7J7L6c7Y6)1P7Q757Z1P7U7W6 5G6t7$477'7,7)0C4k7c6K5'418x5#6I7k5Z4j505+7{8L815;0w58807S821e5B4f8p7!0(6h8k8h3V5|8X8i0(0j858b6%8(7P8*8,6#7z8/5s8;8R8l8%838^7#6v8g6x8v5S2}4B8z7=7l8C4B7:8G6M0C977o8L9j5,8N690O0l0A6-89818j4X8S6$025}926_8`9s9w8.9A4O5t8+8{8$827A9G709J9D8|8T8 6t912X0L4!4G4V4I4S0~0D4L9'2y2t0e1K9#0L4J5L0N0P0R0o02.
.128013="m_eh(3yapl)7,dun sS:6w
gPi1vkr0-t25f4bco/030k090D0e0w0g0o0n0J0g0e0o0o05060D0w0f06020t030o0l07070e0A0d020p0K0g0l0$0K0m030L0,0.0:0=0*0f0203150~180L150*0k0w0y0U0W0Y0!0W0m0u0l0e0u090C0f0d0D0a0|0n0a0w0u0a0g1A0a0D0(030P0I0g091h0X0Z061z1B1D1B0D1J1L1H0D0A161v0U0^0o0f0e0m0!0E061N1j060G0R090m0e07091H1(1*1/1P1=1L1^1`0(040n0v0A0K0f0K0o0w0{0m0n0N1%0A0A090J2f0~1}0m160L1v2s1Z1#1!1I0k1 1k0w0m1@2c1H1e1g0V1O2C2E0m0K2I1H0f2l162q2s2V0+1)2g2K1:2O0A0/0g1H0e1y2l0G0!0108080J2P091D2N0K0C0c0C0x0(0x0~0e2W2Z0)2Y1~2#1P2%2(2*2,092.062:2=2@2_2F2|0C1-020E32341*362q2B063b0e2)162+0a2-2/2;2?0N3l2O3n0c0(0c3s2p350*3w390!3z3B033D3F3h3H3k2D3m2}0H0(0H3Q0 3S372!1i3a0K2'3A3d3E3f3G3j3J3(3L2}0F0(0F3.2V3T2Z3x3X3{3#3i3I2^412{2}0r0(0r473:3U3?3W3^3c3C3e3g4f3'2`3n0i0(0i4o3u192T0~2I2v0k1#2A3V064g2H1f162S092U353R4G4g4X1~0w0k0!2;2q3n2 4v4'4)3 4h4A2}2 0n23094:4g3K4j2~1H0L333;3x0z0(0N0G4Z2r0n544P0m0G571A0w0J0A0e0J0z5a4$3=2L060'020b5p5d4r3y5h0u5j2@5x4q5s5u0h0q5p0*3/4G3w4/064*2Z3n3p3Z0n5Q3%404?3o1.4`4|4z3)5$2s330n5.5c5G1:56020G3^5p5:4a5e0(0e5`5y5s0K0s0(2D605;3a0I0(5l1m095F5|5z5u5w5N2r611:070w300B6f386h0(5J5L6s2g5Y084+2}3N4.4(5R4;4~3M5%1_4{6H4}4i6K5,025/6U5{6t5s5?5^0A676g5s0m0(0I6$6X1:63650}6k6T6m696b1*1q6y3x6i6{4P6o6q6~6u026w6;5M2X5P6G5S1*3n3+6F5(5!5*3+4_6M7g4=7i515-6V7r6?0!6Z5_6;6W5r2$0(0J6+7z1P6.02667x7t3y6a026c6`6;7K6}7Q680!70020x6r7T6%1:5I5K766{6A6C0C447f6O5)427,6L1`7m6J437p6T7r7}5.7K7v6#7J7U5A020k7D3x7G7I2V7y4b7M7O6e7!6,1P7S787#1P7W7Y725H6v7'487)7a6B5T4k3d6A6P5#4l7k7@7/7h7;4l6S7~8N5/806559838n3W5B5D0N8r7$0(6j8m8j8V025 8i7E0!5u0j885}026*8+6|0(8/8T8'857C8@4P8.8:5z6(868Z8k8t6x8@7*8z0C4C7.5Z7n7;4C8G6N9g7_9d7{8O9q8P845?2l0D0l0A6:8c7R8#968(8*8%8,5t8_926'6)9D9I028`9A84948~9G8^9P9K7A958 730h992X0L4#4H4W4J4T0~0D4M9/2y2t0e1K9,0L4K5M0N0P0R0o02.
Fonction d'ordre supérieur
Une des caractéristique du paradigme de programmation fonctionnelle est de considérer une fonction comme n'importe quelle variable.
Une fonction peut ainsi être un paramètre d'une autre fonction.
On appelle fonction d'ordre supérieur une fonction qui a comme paramètre une autre fonction.
# Tests
(insensible à la casse)(Ctrl+I)