Revizia anterioară Revizia următoare
| Fișierul intrare/ieșire | controlnode.in, controlnode.out | Sursă | Testare IQ-Academy 2023 |
|---|---|---|---|
| Autor | David Demetriad | Mihai Tuțu | Adăugată de |
|
| Timp de execuție pe test | 0.4 sec | Limită de memorie | 3000 KB |
| Scorul tău | N/A | Dificultate | N/A |
Vezi soluțiile trimise | Statistici
Control Node
Ești noul administrator de rețea la compania Anavdren și trebuie să gestionezi rețeaua de servere.
Fiecare server se identifică printr-o adresă de tip IPv6. Un IPv6 este de forma y1 : y2 : y3 : y4 : y5 : y6 : y7 : y8. Fiecare element yi ( 0 < i ≤ 8 ) este format din 4 caractere hexazecimale, fie ele ‘x1x2x3x4’ , unde xi poate fi oricare cifră sau literele mici de la a la f (reprezentând de fapt valorile de la 10 la 15). Din adresa IPv6, grupul y1 : y2 : y3 : y4 reprezintă grupa din care face parte serverul, iar y5:y6:y7:y8 reprezintă numărul de ordine al serverului curent în cadrul grupei sale.
De exemplu, pentru adresa IPv6 ‘1111:2222:3333:4444:5555:6666:7777:aaaa’, grupa din rețea este ‘1111:2222:3333:4444’. iar numărul de ordine din grupa sa este ‘5555:6666:7777:aaaa’.
Ordinea lexicografică a două servere este definită în felul următor: Fie două servere ( să le zicem A și B ) având IPv6-urile:
A —> y1 : y2 : y3 : y4 : y5 : y6 : y7 : y8
B —> z1 : z2 : z3 : z4 : z5 : z6 : z7 : z8
A este mai mic decât B dacă există un i ( 0 < i <= 8 ) , astfel încât ( z1 = y1, z2 = y2, ..., zi-1 = yi-1 și yi < zi ). În acest sens, yi este mai mic decât zi dacă și numai dacă numărul hexazecimal format din caracterele ce îl compun pe yi este mai mic decât numărul hexazecimal format din caracterele ce îl compun pe zi, ceea ce e înseamnă că reprezentarea zecimală în baza 10 a lui yi să fie mai mică decât cea a lui zi.
Șeful tău vrea să vadă cât de bine te pricepi și are câteva provocări pentru tine.
Cerinta
1. Să se determine în câte grupe distincte sunt împărțite serverele din rețea.
2. Să se determine o listă cu toate adresele IPv6 din rețea, ordonate lexicografic, mai întâi după grupă și apoi după numărul de ordine din grupă.
Date de intrare
Fișierul de intrare controlnode.in conține pe primul rând c, reprezentând cerința.
Apoi, pe fiecare rând câte o adresă IPv6, conform descrierii din cerință, urmată de caracterul ascuns ‘\n’, reprezentând sfârșitul de linie. O adresă IPv6 conține 39 de caractere ce pot fi orice cifră (între 0 – 9), orice literă mică dintre a – f și caracterul ‘:’ )(două puncte).
Ultimul rând din fișierul de intrare va conține ‘#########’, adică 8 caractere ‘#’. Acesta este rândul care arată că nu mai sunt adrese IPv6 de citit.
Date de ieșire
Fișierul de ieșire controlnode.out va avea conținut diferit în funcție de cerință:
În cazul cerinței 1, se vor afișa un singur număr, x, reprezentând numărul de grupe distincte din lista de ip-uri oferită în fișierul de intrare.
În cazul cerinței 2, se va afișa atâtea adrese IPv6 câte au fost citite, dar ordonate lexicografic, mai întâi după grupă (primele 4 grupe de 4 caractere) și apoi după numărul de ordine din grupă (ultimele 4 grupe de 4 caractere).
Restricții
- 1 ≤ c ≤ 2
- Numărul de adrese IPv6 dintr-un fișier de intrare poate fi maxim 105
- Fișierul de intrare are caracterul ‘\n’ la fiecare final de rând, iar pe ultimul rând se va găsi ‘########’,
- simbolizând sfârșitul fișierului.
- IP-urile NU sunt neapărat distincte
- Pentru teste în valoare de 50% cerința va fi 1
- Pentru teste în valoare de 50% numărul de IPv6 dintr-un fișier de intrare va fi 104
Exemplu
| controlnode.in | controlnode.out | ||
|---|---|---|---|
| 1 2459:ab46:0023:1111:3467:3563:5555:1111 1111:2222:3333:4444:5555:6666:7777:aaaa 2459:ab46:0023:1111:2433.2354:7686:5670 2459:ab46:0023:1111:2433:2754:7686:5670 ffaa:2334:2343:9913:6845:4302:2aaa:bbbb ffaa:2334:2343:9913:4363:4253:2451:cccc 2459:ab46:0023:1111:3243:2353:8888:0000 ######## |
3 |
2 2459:ab46:0023:1111:3467:3563:5555:1111 1111:2222:3333:4444:5555:6666:7777:aaaa 2459:ab46:0023:1111:2433.2354:7686:5670 2459:ab46:0023:1111:2433:2754:7686:5670 ffaa:2334:2343:9913:6845.4302:2aaa:bbbb ffaa:2334:2343:9913:4363:4253:2451:cccc 2459:ab46:0023:1111:3243:2353:8888:0000 ######## |
1111:2222:3333:4444:5555:6666:7777:aaaa 2459:ab46:0023:1111:2433.2354:7686:5670 2459:ab46:0023:1111:2433:2754:7686:5670 2459:ab46:0023:1111:3243:2353:8888:0000 2459:ab46:0023:1111:3467:3563:5555:1111 ffaa:2334:2343:9913:4363:4253:2451:cccc ffaa:2334:2343:9913:6845:4302:2aaa:bbbb |
Explicație
Exemplul 1:
Pe primul rând avem cerința 1, apoi 6 rânduric cu câte o adrese IPv6 și ultimul rând, marcator al finalului de linie.
Grupele diferite din adresele date sunt:
1111:2222:3333:4444
2459:ab46:0023:1111
ffaa:2334:2343:9913
Exemplul 2:
Pe primul rând avem cerința 2, apoi 6 rânduri, fiecare cu câte o adresă IPv6 și ultimul rând, marcator al finalului de linie.
Mai întâi vom ordona lexicografic după grupă, adică după primele grupe de 4 caractere, apoi după numărul de ordine din grupă, adică următoarele 4 grupe de caractere.
Poți vedea testele pentru această problemă accesând