Gyakorlati alapok
A magyar autórendszám izgalmas rejtélyei
Rendkívül érdekes témakör következik: kilistázzuk a magyar autórendszámokat! (Majd később látjuk, hogy csak megpróbáljuk…) Engem legalábbis érdekelt a megoldás, hiszen vele szinte klasszikusnak mondható kombinatorikai kérdéskörrel szembesülhetünk.
Amint a magyar járműveken láthatjuk, a magyar autórendszám kis kivételtől
eltekintve 3 db nagybetűs karakterből és 3 db számból áll:
A kivételek az ideiglenes-, és egyéb rendeltetésű rendszámok; ezek E-Z-P
nagybetűk valamelyikével kezdődnek és további 5 számkaraktert tartalmaznak,
velük nem foglalkozunk.
Az alap karakterkészlet angol nyelv gyökerű, mert láthatóan nincsenek
megengedve a nemzeti betűkarakterek, például Ű, ebből következően 26
nagybetűből áll...
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
...így értékkészlete AAA és ZZZ között váltakozik.
A számok értékkészletét sem nehéz kitalálnunk, hiszen 000 és 999 között mozog.
Ha a 2 csoportot egyesítjük, akkor a teljes értékkészlet AAA-000 és ZZZ-999
között lesz. Ez veti fel a legfontosabb kérdést, miszerint mekkora lesz a
teljes variációs lehetőség, azaz AAA-000 és ZZZ-999 közötti tartomány?
A 3 db nagybetű variálgatása tisztán kombinatorikai kérdés, annak ismétléses
variációs változata és a végeredmény nem is olyan lesújtó, hiszen a 263 képlet
alapján az 17576 lesz (kódja a fejezet végén található). Ehhez jön
sorozatonként az 1000-szeres szorzó, hiszen 1 betűsorozathoz 1000 db további
számvariáció illeszthető. Például:
1. - AAA-000
...
1000. - AAA-999
Tehát a fenti részeredményt még meg kell szorozni 1000-rel:
17576 x 1000 = 17 576 000
Az elméleti matematikai kiindulópontok tehát a fentiek voltak. Ha évente 500.000 autórendszámot osztanak ki Magyarországon, akkor a fenti variációs mennyiség elég lesz a kezdéstől számított 35 évre. Ha ezt 1990-ben kezdte a hatóság, akkor a rendszámvariációk ezen fajtája ki fog futni 2025-re.
Új információ 2022-ben: ebben az évben a Belügyminisztérium lezárta ezen
típusú rendszámok kiadását és újra tért. Erről részletesen írok
Az új
magyar autórendszám még izgalmasabb rejtélyei című fejezetben.
Ám a ténylegesen felhasznált rendszámvariációk ennél nyilvánvalóan kevesebben
vannak. Egyrészt garantáltan nem megengedettek a valamilyen módon etikátlan
vagy kellemetlen értelmet adó betűkombinációk, például SEX, FBI, stb.,
másrészről láthatóan a nyilvántartás tiltja az olyan kiemelt rendszámvariációs
fordulópontokat is, mint például AAA-000, BBB-000. Mindezt csupán
tapasztalatból állítom, a tiltási lista teljes spektrumáról nincs tudomásom,
de egyértelműen létezik. A kieső variációk azonban nem alkotnak számottevő
tömeget, ezért és az említett információhiány miatt a teljes listázáskor nem
fogjuk azokat figyelembevenni.
További személyes megjegyzéseim: egyszer láttam egy SEX-… rendszámú Mercedest. A rendszám tehát – bár etikai tartalma igen kétséges-, valószínűleg jó pénzért mégis a hatóság által kiosztásra került. Másrészről szintígy kérdőjelezhető meg a JEW rendszám etikai tartalma, amelyből viszont nagyon sokat osztottak ki és amelyen a világ összes olyan országában röhögnek, ahol beszélnek angolul és ismerik a zsidó népet.
Összességében kijelenthetjük, hogy ha rendszámhoz bármilyen tartalom köthető,
azaz nem véletlenszerű betűkombinációból áll, akkor annak felhasználása
alapértelmezésben kérdéses.
A rendszámtömeg teljes matematikai listázásához kvázinukleáris kombinatorikai
szuperfegyverünket töltjük csőre, ami az
egybeágyazott for ciklusok
használata. Kombinációs mélysége mindig annyi lesz, amennyi a variálandó
karakterek száma, jelen esetünkben 6 (mert 3 karakter + 3 számról van szó). Az
1., 2., 3. ciklus a betűket, a 4., 5., 6. ciklus a számokat variálja. Az angol
nagybetűs karakterkészletet érdemes letennünk egy állandó,
String típusú
tömbbe...
String[] tomb = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}
...mert így elemeire könnyű lesz hivatkozni (tomb[x]). Ha ezután a futtatásra kattintunk, akkor a JVM derekasan elkezdi listázni a variációkat és akár néhány óra alatt végezhet is.
Gyors számítás: ha a kódba 1 másodperces késleltetést iktatnánk, akkor
nyilvánvalóan 17 576 000 másodpercig tartana a listázás. Ez a 17 576 000 / 60
/ 60 /24 képlet alapján több mint 203 napot jelentene.
A listázást a konzol feletti piros gombra való kattintással tudjuk megállítani. Arra se
számítsunk, hogy a gyorsaság miatt a konzol pontosan fogja megjeleníteni,
emiatt a végeredménynél is csak 1 rövid részletet tudtam megmutatni, de
igyekeztem éppen 1 fordulópontot elkapni:
AJN-999 → AJO-000
Nézzük meg a futtatható Java-kódot:
public class Main {
public static void main(String[] args) {
String[] tomb =
{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
for(int i = 0; i < tomb.length; i++){
for(int j = 0; j < tomb.length; j++){
for(int k = 0; k < tomb.length; k++){
for(int l = 0; l <= 9; l++){
for(int m = 0; m <= 9; m++){
for(int n = 0; n <= 9; n++){
System.out.print(tomb[i] + tomb[j] + tomb[k] + "-" + l + m + n);
System.out.println();
}
}
}
}
}
}
}
}
Végeredmény:
...
AJN-990
AJN-991
AJN-992
AJN-993
AJN-994
AJN-995
AJN-996
AJN-997
AJN-998
AJN-999
AJO-000
AJO-001
AJO-002
AJO-003
AJO-004
AJO-005
…
További érdekességként említhető meg, hogy a kódot egy karakter típusú tömbbel
kezdtem (char[] tomb) megoldani, ám felhasználásakor egy meglepő anomáliával
szembesültem. Bár látszólag minden rendben volt, ám a végeredmény a
betűoldalon mégsem betű-, hanem számvariációk lettek:
public class Main {
public static void main(String[] args) {
char[] tomb =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
for(int i = 0; i < tomb.length; i++){
for(int j = 0; j < tomb.length; j++){
for(int k = 0; k < tomb.length; k++){
for(int l = 0; l <= 9; l++){
for(int m = 0; m <= 9; m++){
for(int n = 0; n <= 9; n++){
System.out.print(tomb[i] + tomb[j] + tomb[k] + "-" + l + m + n);
System.out.println();
}
}
}
}
}
}
}
}
Végeredmény:
...
215-599
215-600
215-601
215-602
215-603
215-604
215-605
215-606
215-607
215-608
215-609
215-610
215-611
215-612
215-613
…
A karaktertömb elemeire a
for ciklusokban többféle trükk bevetésével sem
tudtam megfelelően hivatkozni, bár a tömböt közvetlenül kilistázva a kívánt
tartalmat kaptam meg:
public class Main {
public static void main(String[] args) {
char[] tomb =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i] + " ");
}
}
}
Végeredmény:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Az anomália rejtélyes, de szavatoltan összefüggésben áll a
Karakter
című
fejezetben leírtakkal: a karaktertípus és az
integer számtípus között
átjárhatóság, konvertálhatóság van éppúgy a Unicode-tábla, mint a
Java-rendszeren belül, ez pedig bizonyos esetekben a fenti anomáliát fogja
produkálni. Ha volna valakinek erre egy elegáns megoldása, azt szívesen
publikálnám.
További érdeklődők alább tanulmányozhatják a szimpla betűvariációs kódot,
amelybe 1 kis számláló is be lett építve, hogy a listázás, valamint a
kombinatorikai részeredmény le legyen ellenőrizve:
public class Main {
public static void main(String[] args) {
String[] tomb =
{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
int count = 1;
for(int i = 0; i < tomb.length; i++){
for(int j = 0; j < tomb.length; j++){
for(int k =
0; k < tomb.length; k++){
System.out.print(count + ". - " + tomb[i] + tomb[j] + tomb[k]);
System.out.println();
count++;
}
}
}
}
}
Végeredmény:
...
17472. - ZVZ
17473. - ZWA
17474. - ZWB
17475. - ZWC
17476. - ZWD
17477. - ZWE
17478. - ZWF
17479. - ZWG
17480. - ZWH
17481. - ZWI
17482. - ZWJ
17483. - ZWK
17484. - ZWL
17485. - ZWM
17486. - ZWN
17487. - ZWO
17488. - ZWP
17489. - ZWQ
17490. - ZWR
17491. - ZWS
17492. - ZWT
17493. - ZWU
17494. - ZWV
17495. - ZWW
17496. - ZWX
17497. - ZWY
17498. - ZWZ
17499. - ZXA
17500. - ZXB
17501. - ZXC
17502. - ZXD
17503. - ZXE
17504. - ZXF
17505. - ZXG
17506. - ZXH
17507. - ZXI
17508. - ZXJ
17509. - ZXK
17510. - ZXL
17511. - ZXM
17512. - ZXN
17513. - ZXO
17514. - ZXP
17515. - ZXQ
17516. - ZXR
17517. - ZXS
17518. - ZXT
17519. - ZXU
17520. - ZXV
17521. - ZXW
17522. - ZXX
17523. - ZXY
17524. - ZXZ
17525. - ZYA
17526. - ZYB
17527. - ZYC
17528. - ZYD
17529. - ZYE
17530. - ZYF
17531. - ZYG
17532. - ZYH
17533. - ZYI
17534. - ZYJ
17535. - ZYK
17536. - ZYL
17537. - ZYM
17538. - ZYN
17539. - ZYO
17540. - ZYP
17541. - ZYQ
17542. - ZYR
17543. - ZYS
17544. - ZYT
17545. - ZYU
17546. - ZYV
17547. - ZYW
17548. - ZYX
17549. - ZYY
17550. - ZYZ
17551. - ZZA
17552. - ZZB
17553. - ZZC
17554. - ZZD
17555. - ZZE
17556. - ZZF
17557. - ZZG
17558. - ZZH
17559. - ZZI
17560. - ZZJ
17561. - ZZK
17562. - ZZL
17563. - ZZM
17564. - ZZN
17565. - ZZO
17566. - ZZP
17567. - ZZQ
17568. - ZZR
17569. - ZZS
17570. - ZZT
17571. - ZZU
17572. - ZZV
17573. - ZZW
17574. - ZZX
17575. - ZZY
17576. - ZZZ
Ha már itt tartunk, gyorsan illesszük ide Pálinkó Tímea házi feladatát, amely a jelen fejezet témája volt. Egyetlen és fontos különbség azonban, hogy Tímeának külön függvényes megoldásban kellett megoldania a feladatot...
...amely tehát még nem része az aktuális fejezetcsomagnak (az csak a Gyakorlati alapok II. című csomagtól tananyag). Az ok, amiért a kódot mégis ide szerkesztettem, hogy a külön függvényes megoldás viszonylag egyszerű és ezért nem kívántam hozzá új fejezetet nyitni. Nézzük meg a futtatható Java kódot:
public class Rendszam {
public static String rendszam(String betu){
String tombBetu[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
"L", "M", "N", "P", "R", "S", "T", "V", "Z"};
String rendszam = new String();
for(int i = 0; i < tombBetu.length; i++){
for( int j = 0; j < tombBetu.length;
j++){
for(int k =
0; k < tombBetu.length; k++){
for(int l = 0; l <= 9; l++){
for (int m = 0; m <= 9; m++){
for (int n = 0; n <= 9; n++){
rendszam = tombBetu[i] + tombBetu[j] + tombBetu[k] + "-" + l + m + n;
System.out.println(rendszam);
}
}
}
}
}
}
return rendszam;
}
public static void main(String[] args) {
rendszam("");
}
}
Végeredmény:
...
ZZZ-990
ZZZ-991
ZZZ-992
ZZZ-993
ZZZ-994
ZZZ-995
ZZZ-996
ZZZ-997
ZZZ-998
ZZZ-999