Автор: Alexandra Diaconu
În sediul nostru de maximă securitate, folosim o tastatură specială, proiectată să fie imposibil de hackuit. Din fabrică, ea este Ultra-Secure: de fiecare dată când apeși o tastă, sistemul alege la întâmplare un font complet diferit pentru a genera o imagine de 28 ✕ 28 pixeli a caracterului.
Totul mergea conform planului până într-o seară de marți, când administratorul de sistem a vărsat un cocktail de energizant și cafea direct în circuitele acestui hardware de mii de euro. Rezultatul? Tastatura a suferit un accident și acum mai are doar 12 taste funcționale, restul fiind stricate:
Litere: A, B, E, F, O, I
Cifre: 0, 1, 2, 4, 7, 8

Problema e că fiecare apăsare a acestor taste nu mai trimite un semnal curat (o imagine de 28✕28 pixeli) ci una alterată de un model de un zgomot fix și o rotație, unice pentru fiecare caracter.
Mai mult, sistemul are un mecanism de protecție la supratensiune: dacă un pixel încearcă să aibă o valoare mai mică de 0 sau mai mare de 255 din cauza zgomotului, hardware-ul îl forțează la 0, respectiv 255. Rezultatul? O pierdere iremediabilă de informație, de parcă tastatura ar încerca să ascundă dovezile accidentului.
amprente_digitale)Sunt „analizele de sânge” ale tastaturii imediat după incident. Fișierul conține 50 de perechi (în total 600 de imagini cu numele 0_01.png, 0_02.png etc.) pentru fiecare din cele 12 taste.
Acestea sunt imagini de 42 ✕ 84 pixeli reprezentând o pereche [original | transformat].
| Caracter | Tip | Exemplu |
|---|---|---|
| E | Literă | ![]() |
| 0 | Cifră | ![]() |
| 1 | Cifră | ![]() |
| 7 | Cifră | ![]() |
Imaginea alterată a fost obținută prin:
[-25, +25] doar în zona centrală28×28 pixeli a fost plasată centrat într-un canvas negru de 42×42 pixeli[-30, 30]imagini_antrenare)Acestea sunt mostre de caractere „sănătoase”:
28 ✕ 28 pixeli| Caracter | Tip | Exemplu |
|---|---|---|
| B | Literă | ![]() |
| 0 | Cifră | ![]() |
imagini_suspecte)Acesta este un set de imagini brute extrase din sistem după incident.
Folderul imagini_suspecte conține:
Nu toate imaginile provin din tastatura avariată.
Sistemul a fost expus și la alte surse externe, astfel încât în acest set pot apărea:
parole)Acesta este fluxul de date brute capturat în timp real de la terminalul defect.
Conține:
Realitatea din teren:

Sistemul de securitate a intrat într-un mod degradat.
Pentru că hardware-ul este prea avariat pentru a recunoaște fiecare caracter cu precizie, s-a activat o metodă bazată pe vot majoritar.
Sistemul verifică doar „natura majoritară” a parolei.
Exemplu:
Dacă eticheta coincide cu cea din baza de date → acces permis.
Folosind datele din arhiva de calibrare (amprente_digitale), determinați unghiul de rotație asociat fiecărui caracter.
Pentru fiecare caracter trebuie identificat:
unghi_rotatie ∈ [-30°, +30°]
Pe baza acestor rezultate veți construi un dicționar de forma:
{
"A": <valoare_unghi>,
"B": <valoare_unghi>,
"E": <valoare_unghi>,
...
"8": <valoare_unghi>
}
Folosind datele din arhiva de calibrare (amprente_digitale), determinați modelul de zgomot asociat fiecărui caracter.
Pentru fiecare dintre cele 12 caractere funcționale, imaginea transformată conține o perturbare adăugată peste forma originală, iar această perturbare este specifică acelui caracter.
Pentru fiecare caracter trebuie identificat:
zgomot_caracter
Acest zgomot reprezintă componenta de alterare aplicată imaginii caracterului înainte de obținerea versiunii finale corupte.
Pe baza acestor rezultate veți construi un dicționar de forma:
{
"A": <zgomot_A>,
"B": <zgomot_B>,
"E": <zgomot_E>,
...
"8": <zgomot_8>
}
unde fiecare valoare asociată unui caracter descrie zgomotul specific aplicat acelui caracter.
Primești un folder cu imagini grayscale suspecte (imagini_suspecte), fiecare reprezentând un singur caracter.
Pentru fiecare imagine, trebuie să decizi dacă aceasta aparține unuia dintre cele 12 caractere care încă pot fi produse de tastatura defectă.
Astfel, pentru fiecare imagine vei atribui una din următoarele etichete:
1 - dacă imaginea conține un caracter care poate fi generat de tastatura modificată, adică unul dintre:A, B, E, F, O, I, 0, 1, 2, 4, 7, 8
0 - dacă imaginea conține orice alt caracter.Sistemul de autentificare funcționează într-un mod degradat și nu mai verifică parolele la nivel de caracter exact. În schimb, decizia finală se bazează pe tipul majoritar de caractere din fiecare parolă.
Folosind datele disponibile, determinați pentru fiecare imagine din folderul parole natura sa finală:
letters sau digits
Fiecare caracter aparține uneia dintre categoriile:
A, B, E, F, O, I0, 1, 2, 4, 7, 8Pentru fiecare parolă trebuie să determinați categoria majoritară a caracterelor.
Eticheta finală:
letters — dacă majoritatea caracterelor sunt literedigits — dacă majoritatea caracterelor sunt cifreSubmisia trebuie să fie un fișier arhivă .zip care conține exact următoarele două fișiere:
amprente_digitale.npyparole.csvamprente_digitale.npyAcest fișier este folosit pentru Misiunea 1 și Misiunea 2 și trebuie să conțină un dicționar cu informațiile estimate pentru fiecare dintre cele 12 caractere:
A, B, E, F, O, I, 0, 1, 2, 4, 7, 8
Structura trebuie să fie de forma:
{
"A": {
"angle": <valoare_unghi>,
"noise": <matrice_28x28>
},
"B": {
"angle": <valoare_unghi>,
"noise": <matrice_28x28>
},
...
"8": {
"angle": <valoare_unghi>,
"noise": <matrice_28x28>
}
}
Cerințe:
28 ✕ 28parole.csvAcest fișier este folosit pentru Misiunea 3 și Misiunea 4 și trebuie să conțină exact următoarele coloane:
file: numele fișierului pentru care a fost realizată predicția;subtaskID: indicele misiunii (va avea valoarea 3 sau 4);class: clasa prezisă pentru acel fișier.Exemplu
file,subtaskID,class
task3_000.png,3,1
task3_001.png,3,0
task4_000.png,4,letters
task4_001.png,4,digits
classÎnregistrările cu subtaskID = 3 trebuie să aibă:
1 — dacă imaginea conține un caracter valid al tastaturii defecte0 — altfelÎnregistrările cu subtaskID = 4 trebuie să aibă:
lettersdigitsîn funcție de categoria majoritară a caracterelor din parola respectivă.
.zip trebuie să conțină ambele fișiere la rădăcină:
amprente_digitale.npyparole.csvÎn starter kit este disponibilă o funcție care primește ca argumente rezultatele pentru:
și generează automat fișierul amprente_digitale.npy în formatul corect.
Punctajul se acordă după cum urmează:
score = 10 (dacă MAE ≤ 0)
score = 10 × (1 - MAE / 1) (dacă 0 < MAE < 1)
score = 0 (dacă MAE ≥ 1)
Punctajul se acordă după cum urmează:
score = 10 (dacă MAE ≤ 2.5)
score = 10 × (1 - MAE / 10) (dacă 2.5 < MAE < 10)
score = 0 (dacă MAE ≥ 10)
Punctajul se acordă după cum urmează:
score = 0 (dacă Accuracy ≤ 0.50)
score = 30 × (Accuracy - 0.50) / (0.80 - 0.50) (dacă 0.50 < Accuracy < 0.80)
score = 30 (dacă Accuracy ≥ 0.80)
Punctajul se acordă după cum urmează:
score = 0 (dacă Accuracy ≤ 0.50)
score = 50 × (Accuracy - 0.50) / (0.93 - 0.50) (dacă 0.50 < Accuracy < 0.93)
score = 50 (dacă Accuracy ≥ 0.93)