Skip to content

Instantly share code, notes, and snippets.

@lhoang
Last active April 16, 2021 09:33
Show Gist options
  • Save lhoang/8c33924cc48581658f5b3db6a67ed04d to your computer and use it in GitHub Desktop.
Save lhoang/8c33924cc48581658f5b3db6a67ed04d to your computer and use it in GitHub Desktop.
Datalake Last Code Challenge

Avec WhatsApp/FB qui fait n'importe quoi avec nos données, il fallait qu'on trouve un moyen de communiquer de manière sécurisée une dernière fois.

Voici un compte-rendu du point Data Eng où on a mis le protocole Phantom en place.

Aga : On dirait que le fichier en input contient des nombres entre 0 et 999. Tiens, c'est pas un beau rectangle. Et si on reformait le rectangle ?

Jalil : Comment on connait la largeur ?
Bilal : On pourrait entraîner un modèle qui nous permettrait de la déterminer.
Jalil : Avec un petit Random Forest et les bons hyperparamètres, ça devrait être easy !
Moez : Bah avec le PGCD ? ou la décomposition en nombres premiers ?

Etape 1 : Recomposer un beau rectangle en concatenant et redécoupant en N lignes de X élements

X est le plus grand nombre premier composant le nombre d'éléments total.
Validation : Le nombre de lignes N est < 10.

Chacune de ces N lignes va désormais s'appeler un calque.


Etape 2 : Conversion en Ternaire sur 6 trits

Pour chacun des calques, il n'y a qu'une dimension pour le moment (ex: 456 234 34 123).
On va "étaler" le calque en rajoutant une dimension : en convertissant le nombre en ternaire sur 6 trits et en imprimant chaque nombre sur une nouvelle ligne. https://en.wikipedia.org/wiki/Ternary_numeral_system
Par ex: 456 donne 121220 en ternaire, 42 donne 001120

Exemple de calque obtenu à partir de la ligne 456 234 34 123 :

121220    
022200
001021
011120

Etape 3 : Rotation

Sylvain : Ah mais on tient plus les calques dans le bon sens !
Dorra : Moez ! It's your time to shine !

Il faut tourner chaque calque de 90° dans le sens trigonométrique.
Validation: sur 2e ligne du 2e calque, le nombre de '2' multiplié par le nombre de 1 donne 924.


Etape 4 : Empilage des calques

David : Mais pourquoi on appelle ça des calques depuis le début ?
Andrew : Parce que des calques, ça peut se superposer et on voit toujours à travers. (Ratata!)

Le premier calque est celui qui va tout en haut de la pile.
Quand on regarde à travers tous les calques d'un coup, le résultat pixel par pixel va dépendre des valeurs traversées:

  • 0 : pixel noir opaque
  • 1 : pixel blanc opaque
  • 2 : pixel transparent.

Si pour un pixel, on traverse (dans l'ordre calque 1 -> dernier calque) : 2 2 1 0, la valeur du pixel sera 1 car le calque 1 est transparent, le 2e est transparent, le 3e est blanc et le 4e est recouvert par le 3e calque.

Ex:
Calque 1:

2 1  
2 0  

Calque 2:

2 1  
2 2  

Calque 3:

0 1  
2 0  

Calque 4:

2 1  
1 1  

Le résultat de la pile de calque sera :

0 1  
1 0  

Etape 5 : Affichage de l'image

Quentin : Pas que j'aime pas ça mais y a des bits partout, je vois pas bien l'image.
Hicham : Je suis alternant mais je propose qu'on remplace par des caractères plus lisibles.

Remplacer les pixels blancs par "█" (code ASCII=9608) et les pixels noirs par " " (code ASCII=32)

Bonus pour les plus chauds !

En réduisant au max, le contenu de ma méthode de décodage fait 358 caractères !

674 539 242 719 728 722 727 701 728 701
728 647 718 485 728 643 725 728 701 242
727 728 728 377 726 726 644 240 727 728
485 404 674 728 242 161 728 485 647 725
692 242 241 728 728 647 701 558 674 212
644 728 699 647 701 377 485 692 727 728
689 728 725 728 674 230 728 719 728 485
728 728 726 701 242 728 719 728 728 728
701 728 242 728 719 241 728 620 701 671
592 375 717 728 728 403 674 647 512 696
566 468 485 647 558 484 719 699 647 559
386 611 134 708 709 560 476 701 644 646
719 8 242 242 467 668 458 728 725 665
674 480 647 485 647 373 139 720 480 605
242 160 638 719 212 404 683 474 724 614
727 475 674 35 218 719 557 724 728 728
728 692 485 240 726 728 485 728 728 367
512 483 647 611 211 230 593 671 647 528
669 726 728 716 129 701 643 722 584 642
520 239 473 306 88 719 590 134 645 710
719 527 240 222 711 241 447 560 717 472
287 483 161 80 448 178 458 728 602 188
322 566 404 728 214 556 45 698 677 395
391 566 467 644 647 665 709 480 629 475
217 24 576 707 726 557 726 700 485 728
413 233 483 240 710 482 644 644 71 620
315 242 638 402 217 644 673 673 537 285
724 161 655 261 701 564 512 699 723 449
188 154 310 693 709 147 485 564 464 485
305 559 656 151 356 163 622 646 448 155
627 320 75 19 466 44 402 584 187 321
701 323 526 456 227 380 707 698 285 204
301 458 469 134 404 706 714 620 647 471
209 528 233 602 299 646 421 401 620 690
149 465 218 606 458 718 368 131 494 623
320 95 537 637 644 422 404 361 716 116
593 65 585 473 727 476 527 150 165 595
714 118 564 520 467 510 374 175 286 35
18 411 566 131 653 622 232 723 257 204
600 311 97 601 455 566 434 188 540 451
534 556 576 176 278 682 3 582 236 695
86 615 503 445 699 617 386 528 366 209
688 236 618 473 327 143 131 674 240 66
180 169 271 614 322 587 127 636 25 364
266 669 53 589 134 438 109 223 590 147
52 95 628 248 157 152 599 44 656 209
395 251 326 236 364 686 41 293 388 554
243 108 423 553 341 49 101 120 167 11
351 695 480 160 690 673 30 497 175 66
323 660 497 220 579 720 644 199 125 73
392 652 446 91 537 562 41 132 1 122
618 228 700 162 319 580 391 113 225 516
288 18 9 695 694 361 19 19 602 49
285 638 471 426
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment