Skálavariációk VIIb.
Skálavariáció-katalógus
Futtatható Java-kód
Az előző fejezetben említettük a nagyjából 1 millió skálavariáció megjelenítésének problémáját. A megoldás csakis egy program megírása lehet, amely ízlésesen kilistázza nekünk az eredményeket. Mivel egyik szakmám szerint programozó vagyok külön Java-programozási honlappal (www.informatika-programozas.hu), ez nem lehet gond. Belátom, hogy a téma kifejtése egy kissé távol esik a "klasszikusnak" mondható gitároktatástól, ám üzenem avatott művelőinek, hogy nem én vagyok fantaszta, hanem fantáziátlanságukban ők maradtak le, de nagyon...
Nos, nézzük is meg az alapkódot (amelynek magyarázatába most nem bocsátkozom). A kód megszámolja a rész-, és végeredményeket, mindeközben pedig kilistázza az összes variációt és kiírja a futtató környezet (például Eclipse) konzolára:
public class Main {
static int countFull = 0;
public static void level1() {
for(int i = 0; i < 7; i++) {
countFull++;
System.out.print(countFull + ".: " + i + "\n");
}
}
public static void level2() {
int countPartial = 0;
System.out.println();
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
countFull++;
countPartial++;
System.out.print("Rész: " + countPartial + ". - Teljes: " +
countFull + ". - " + i + j);
System.out.println();
}
}
}
public static void level3() {
int countPartial = 0;
System.out.println();
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
countFull++;
countPartial++;
System.out.print("Rész: " +
countPartial + ". - Teljes: " + countFull + ". - " + i + j + k);
System.out.println();
}
}
}
}
public static void level4() {
int countPartial = 0;
System.out.println();
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
countFull++;
countPartial++;
System.out.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". - "
+ i + j + k + l);
System.out.println();
}
}
}
}
}
public static void level5() {
int countPartial = 0;
System.out.println();
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
for(int m = 0; m < 7; m++) {
countFull++;
countPartial++;
System.out.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". - "
+ i + j + k + l + m);
System.out.println();
}
}
}
}
}
}
public static void level6() {
int countPartial = 0;
System.out.println();
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
for(int m = 0; m < 7; m++) {
for(int n = 0; n < 7; n++) {
countFull++;
countPartial++;
System.out.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". - "
+ i + j + k + l + m + n);
System.out.println();
}
}
}
}
}
}
}
public static void level7() {
int countPartial = 0;
System.out.println();
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
for(int m = 0; m < 7; m++) {
for(int n = 0; n < 7; n++) {
for(int o = 0; o < 7; o++) {
countFull++;
countPartial++;
System.out.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". - "
+ i + j + k + l + m + n + o);
System.out.println();
}
}
}
}
}
}
}
}
public static void main(String[] args) {
level1();
level2();
level3();
level4();
level5();
level6();
level7();
}
}
A kód lehetne elegánsabb is (programozóknak üzenem: tojok az objektumorientáltságra), ám a kód jelenlegi egyetlen célja, hogy korrekt módon mielőbb kiírja az elvárt eredményeket. Ezt alapjában véve megtenné, ha nem futottunk volna bele, az 1. hibába: a konzol nem képes követni a kiírási sebességet, ezért a szöveg csonkolódik. Mindenesetre a kiírás vége így néz ki, amely nagyon nagy valószínűséggel bizonyítja matematikai számításaink helyességét:
...
Rész: 823538. - Teljes: 960794. - 6666661
Rész: 823539. - Teljes: 960795. - 6666662
Rész: 823540. - Teljes: 960796. - 6666663
Rész: 823541. - Teljes: 960797. - 6666664
Rész: 823542. - Teljes: 960798. - 6666665
Rész: 823543. - Teljes: 960799. - 6666666
Sajnos tovább kell motoszkálnunk a kódban, még pedig olyan módon, hogy a végeredményeket egy külön állományba írja:
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("C:\\ListFull.txt");
PrintWriter printWriter = new PrintWriter(fileWriter);
int countFull = 0;
int countPartial = 0;
String s = "";
String str1 = "";
for(int i = 0; i < 7; i++) {
countFull++;
countPartial++;
str1 = Integer.toString(i);
s = str1;
printWriter.print(countFull + ".: " + i + "\n");
}
String str2 = "";
countPartial = 0;
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
countFull++;
countPartial++;
str1 = Integer.toString(i);
str2 = Integer.toString(j);
s = str1 + str2;
printWriter.print("Rész: " + countPartial + ". - Teljes: " +
countFull + ". - " + s + "\n");
}
}
String str3 = "";
countPartial = 0;
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
countFull++;
countPartial++;
str1 = Integer.toString(i);
str2 = Integer.toString(j);
str3 = Integer.toString(k);
s = str1 + str2 + str3;
printWriter.print("Rész: " +
countPartial + ". - Teljes: " + countFull + ". - " + s + "\n");
}
}
}
String str4 = "";
countPartial = 0;
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
countFull++;
countPartial++;
str1 =
Integer.toString(i);
str2 =
Integer.toString(j);
str3 =
Integer.toString(k);
str4 =
Integer.toString(l);
s = str1 +
str2 + str3 + str4;
printWriter.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". -
" + s + "\n");
}
}
}
}
String str5 = "";
countPartial = 0;
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
for(int m = 0; m < 7; m++) {
countFull++;
countPartial++;
str1 = Integer.toString(i);
str2 = Integer.toString(j);
str3 = Integer.toString(k);
str4 = Integer.toString(l);
str5 = Integer.toString(m);
s = str1 + str2 + str3 + str4 + str5;
printWriter.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". -
" + s + "\n");
}
}
}
}
}
String str6 = "";
countPartial = 0;
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
for(int m = 0; m < 7; m++) {
for(int n = 0; n < 7; n++) {
countFull++;
countPartial++;
str1 = Integer.toString(i);
str2 = Integer.toString(j);
str3 = Integer.toString(k);
str4 = Integer.toString(l);
str5 = Integer.toString(m);
str6 = Integer.toString(n);
s = str1 + str2 + str3 + str4 + str5 + str6;
printWriter.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". -
" + s + "\n");
}
}
}
}
}
}
String str7 = "";
countPartial = 0;
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++) {
for(int k = 0; k < 7; k++) {
for(int l =
0; l < 7; l++) {
for(int m = 0; m < 7; m++) {
for(int n = 0; n < 7; n++) {
for(int o = 0; o < 7; o++) {
countFull++;
countPartial++;
str1 = Integer.toString(i);
str2 = Integer.toString(j);
str3 = Integer.toString(k);
str4 = Integer.toString(l);
str5 = Integer.toString(m);
str6 = Integer.toString(n);
str7 = Integer.toString(o);
s = str1 + str2 + str3 + str4 + str5 + str6 + str7;
printWriter.print("Rész: " + countPartial + ". - Teljes: " + countFull + ". -
" + s + "\n");
}
}
}
}
}
}
}
fileWriter.close();
System.out.println("Done!");
}
}
A kód az eredményeket egy külső ListFull.txt nevű állományba vezeti, amelynek mérete nem elhanyagolhatóan 38 MB körüli lesz. No de legalább már megvan!
Innentől a követendő elv a következő: van 7 db skálavariáció-csoportunk...
-
1 hangból álló skálavariáció-csoport - 71 = 7 hangból áll,
-
2 hangból álló skálavariáció-csoport - 72 = 49 hangból áll,
-
3 hangból álló skálavariáció-csoport - 73 = 343 hangból áll,
-
4 hangból álló skálavariáció-csoport - 74 = 2401 hangból áll,
-
5 hangból álló skálavariáció-csoport - 75 = 16807 hangból áll,
-
6 hangból álló skálavariáció-csoport - 76 = 117649 hangból áll,
-
7 hangból álló skálavariáció-csoport - 77 = 823543 hangból áll,
...amelyet a mindenkori böngésző biztonságos futásának veszélyeztetése nélkül elemenként a 4 hangból álló skálavariáció-csoportig tudunk megmutatni, utána pedig a listázást .txt típusú állományba folytatjuk.