HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

És mégis elindult a tavaszi hadjárat!

2011.03.11. 12:22 nb

A két kecskeméti vereség után már az is megfordult a fejemben, hogy nem a Loki lesz a bajnok... de itt az aktuális alternatív tabella, aminek félreérthetetlen az üzenete: a DVSC a Monicomp Liga jelen pillanatban is egyik legerősebb csapata, legalábbis az alternatív tabella szerint. De egy szám többet mond ezer szónál, így lássuk hát!

Hagyományos pont Alternatív rang
Videoton 40 Videoton 0,0841
Ferencváros 34 Debreceni VSC 0,0828
Paks 31 Paksi FC 0,0725
Debreceni VSCC 31 BFC Siófok 0,0698
Zalaegerszegi TE 30 Budapest Honvéd 0,0698
Kaposvári Rákóczi 29 Ferencváros 0,0689
Lombard Pápa 27 Győri ETO 0,0650
Kecskeméti TE 24 Újpest 0,0636
Újpest 23 Zalaegerszegi TE 0,0636
Győri ETO 23 MTK Budapest 0,0596
Budapest Honvéd 22 Kaposvári Rákóczi 0,0570
MTK Budapest 22 Lombard Pápa 0,0561
Vasas 21 Szombathelyi Haladás 0,0559
Szombathelyi Haladás 20 Vasas 0,0543
BFC Siófok 18 Kecskeméti TE 0,0439
Szolnoki MÁV 9 Szolnoki MÁV FC 0,0330

 

Íme egy feladat csak a labdarúgás és a programozás szerelmeseinek: tartsd karban a Wikipédia alternatív tabella szócikkét! A magyar NB1 őszi idényének végéig ezt magam tettem, sőt sok más bajnokságra is kiszámoltam erre a blogra. Most elvégzem a számítást, a bemutatott eredményeket úgy használd, hogy saját C kódodat addig gyúrd, amíg ezt nem kapod, amit én a Java progimmal (egyébként ezen a szinten pár szintaktikai különbség lesz csak, illetve nem a printf ír ki, hanem a System osztály out tagjának println függvénye, mindegy... illetve esetleg még az, hogy a Java tömb már öntudatéra ébredt: tudja a saját méretét). Hasznodra lesz közben azért, amit tanultál a PR-es bevezető labor kapcsán. Ha kérek valamit adok is alapon:

  • 6 trófea annak, aki először megírja/átírja C-be (és az itteni adatokat produkálja)
  • további 1 trófea hetenként (ugyanannak persze), ha frissíti is az említett szócikket közben (ez max. 8 trófea május 1-ig, ugye, de mindenesetre maximáljuk 6-ban)

Magam kicsit máshogy jártam el - AspectJ-vel dolgozva - de valamit hagyjunk a Prog2-re is, ezért az alábbi metódust javaslom: nézd meg a jelenlegi állást, majd hetente frissítsd az ez alapján karbantartott  mátrixot, ami így a számításod "bemenetét" képezze. Lássuk!

A feladatot két lépésben oldjuk meg. Először elkészítjük a 2. előadásban és a PR-es posztban is bemutatott "L" mátrixot. Ezt a Wiki2Matrix osztállyal oldjuk meg, s ezt a kiprintelt mátrixot betesszük forrásban az AlternativTabella osztályba, aki majd nyomja a PR-t, de nézd csak meg a forrásokat és világos lesz, hogy két egyszerűre bontott lépésről van szó, ami nem mutat túl a 2. labor mélységén (egyben is mutathatnám, de most nem téma sem az OO, sem a tervezési minta).

A Monicomp Liga

Ha nem követted magad a bajnokságot, akkor nézd meg a kereszttáblázatot! Ezt gépeld be  Wiki2Matrix kereszt nevű 2D tömbjébe az alábbiak szerint:

  • üres=0
  • zöld=1
  • sárga=2
  • piros=3

 Most ezt kaptam:

     int[][] kereszt = {
      {0, 0, 0, 1, 0, 3, 2, 3, 3, 2, 0, 0, 0, 2, 2, 3},
      {3, 0, 2, 1, 3, 2, 0, 3, 3, 3, 0, 0, 0, 0, 0, 1},    
      ...
      .
      .
      {0, 0, 1, 0, 1, 0, 3, 1, 1, 0, 0, 1, 2, 1, 3, 0}
    };

(Az első oszlop 2 sorának 3-as jegye azt mondja, hogy a megfelelő meccsen: a Honvéd otthonában a Siófok győzött.)

Ezzel a Wiki2Matrix osztályt lefordítva/lefuttatva:

javac Wiki2Matrix.java
java Wiki2Matrix

kinyomja a linkmátrixot, amit mutatok, ha kattintasz a tovább linkre, mert csúnya lesz...

{0.0, 0.08333333333333333, 0.0, 0.1111111111111111, 0.14285714285714285, ... 0.0625, ... 0.0, 0.0, }amit be kell tenned a AlternativTabella osztályba, az  double[][] L = {}; kapcsos karmai közé.

Wiki2Matrix.java

// Programozó Páternoszter
// Bátfai Norbert, nbatfai@gmail.com
//
// http://progpater.blog.hu/2011/03/11/alternativ_tabella
// lásd még az alábbiakat
// elmélet: http://nehogy.fw.hu/wp-content/uploads/Prog1_2.pdf
// labor: http://progpater.blog.hu/2011/02/13/bearazzuk_a_masodik_labort

public class Wiki2Matrix {

  public static void main(String[] args) {

    int[][] kereszt = {
      {0, 0, 0, 1, 0, 3, 2, 3, 3, 2, 0, 0, 0, 2, 2, 3},
      {3, 0, 2, 1, 3, 2, 0, 3, 3, 3, 0, 0, 0, 0, 0, 1},
      {1, 1, 0, 0, 3, 1, 3, 0, 0, 0, 3, 1, 1, 0, 2, 0},
      {0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 2, 1, 1},
      {3, 3, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0},
      {1, 0, 3, 1, 0, 0, 0, 1, 3, 2, 0, 0, 0, 1, 2, 3},
      {0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 3, 0, 1, 3, 3, 1},
      {0, 0, 1, 1, 3, 0, 0, 0, 0, 1, 3, 1, 1, 1, 3, 0},
      {0, 0, 1, 2, 3, 0, 0, 1, 0, 0, 0, 2, 1, 1, 3, 1},
      {0, 1, 1, 2, 0, 0, 3, 1, 1, 0, 0, 0, 0, 1, 3, 3},
      {2, 3, 0, 2, 1, 1, 0, 0, 1, 2, 0, 1, 0, 0, 0, 2},
      {3, 3, 0, 0, 0, 3, 3, 0, 2, 1, 1, 0, 2, 0, 0, 0},
      {1, 2, 0, 1, 0, 2, 1, 0, 0, 1, 3, 1, 0, 0, 0, 2},
      {2, 1, 2, 0, 1, 2, 1, 0, 0, 0, 3, 1, 1, 0, 0, 0},
      {1, 3, 1, 0, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0},
      {0, 0, 1, 0, 1, 0, 3, 1, 1, 0, 0, 1, 2, 1, 3, 0}
    };

    int[][] pontotSzerez = new int[kereszt.length][kereszt.length];

    for (int i = 0; i < pontotSzerez.length; ++i) {
      for (int j = 0; j < pontotSzerez[i].length; ++j) {
        pontotSzerez[i][j] = 0;
      }
    }

    for (int i = 0; i < pontotSzerez.length; ++i) {
      for (int j = 0; j < pontotSzerez[i].length; ++j) {

        if (kereszt[i][j] == 1) { // zφld

          ++pontotSzerez[i][j];

        } else if (kereszt[i][j] == 2) { // sαrga

          ++pontotSzerez[i][j];
          ++pontotSzerez[j][i];

        } else if (kereszt[i][j] == 3) { // piros

          ++pontotSzerez[j][i];

        } else if (kereszt[i][j] == 0) { // όres

          ;

        } else {
          System.out.println("Luke, zavart ιrzek az erυben...");
        }

      }
    }
 
    System.out.println("A x ontot-szerez y-tσl mαtrix");

    nyom(pontotSzerez);

    System.out.println("\nSor ιs oszlop φsszegekkel");

    nyom2(pontotSzerez);

    int oszlopOsszeg[] = new int[pontotSzerez.length];

    for (int i = 0; i < pontotSzerez.length; ++i) {

      int o = 0;
      for (int j = 0; j < pontotSzerez[i].length; ++j) {
        o += pontotSzerez[j][i];
      }
      oszlopOsszeg[i] = o;
    }

    System.out.println("\nA \"link\" mαtrix");

    nyom3(pontotSzerez, oszlopOsszeg);

  }

  public static void nyom(int[][] k) {
    for (int i = 0; i < k.length; ++i) {
      System.out.println();
      for (int j = 0; j < k[i].length; ++j) {
        System.out.print(k[i][j] + ", ");
      }
    }
  }

  public static void nyom2(int[][] k) {

    for (int i = 0; i < k.length; ++i) {
      System.out.println();
      int o = 0;
      for (int j = 0; j < k[i].length; ++j) {
        System.out.print(k[i][j] + ", ");
        o += k[i][j];
      }
      System.out.print("  " + o);
    }

    System.out.println();
    System.out.println();

    for (int i = 0; i < k.length; ++i) {

      int o = 0;
      for (int j = 0; j < k[i].length; ++j) {
        o += k[j][i];
      }
      System.out.print(o + " ");
    }

  }

  public static void nyom3(int[][] k, int[] oszlopOsszeg) {
    for (int i = 0; i < k.length; ++i) {
      System.out.println();
      System.out.print("{");
      for (int j = 0; j < k[i].length; ++j) {

        if (oszlopOsszeg[j] != 0.0) {
          System.out.print(k[i][j] * (1.0 / oszlopOsszeg[j]) + ", ");
        } else {
          System.out.print(k[i][j] + ", ");
        }

      }
      System.out.print("},");

    }
  }
}

AlternativTabella.java 

 

// Programozó Páternoszter
// Bátfai Norbert, nbatfai@gmail.com
//
// http://progpater.blog.hu/2011/03/11/alternativ_tabella
// lásd még az alábbiakat
// elmélet: http://nehogy.fw.hu/wp-content/uploads/Prog1_2.pdf
// labor: http://progpater.blog.hu/2011/02/13/bearazzuk_a_masodik_labort

public class AlternativTabella {

  public static void main(String[] args) {

    double[][] L = {
      {0.0, 0.08333333333333333, 0.0, 0.1111111111111111, 0.14285714285714285, 0.0, 0.1111111111111111, 0.0, 0.0, 0.08333333333333333, 0.1111111111111111, 0.0625, 0.0, 0.16666666666666666, 0.16666666666666666, 0.0,},
      {0.0, 0.0, 0.08333333333333333, 0.1111111111111111, 0.14285714285714285, 0.08333333333333333, 0.1111111111111111, 0.0, 0.0, 0.0, 0.1111111111111111, 0.0625, 0.07692307692307693, 0.0, 0.16666666666666666, 0.1111111111111111,},
      ...
      .
      .
      {0.07142857142857142, 0.0, 0.08333333333333333, 0.0, 0.14285714285714285, 0.08333333333333333, 0.0, 0.1, 0.1, 0.08333333333333333, 0.1111111111111111, 0.0625, 0.15384615384615385, 0.08333333333333333, 0.0, 0.0}
    };

    // az eredeti tabella sorrendje, 2011.03.11
    String[] csapatNevE = {
      "Videoton",
      "Ferencvαros",
      "Paks",
      "Debreceni VSC",
      "Zalaegerszegi TE",
      "Kaposvαri Rαkσczi",
      "Lombard Pαpa",
      "Kecskemιti TE",
      "Ϊjpest",
      "Gyυri ETO",
      "Budapest Honvιd",
      "MTK Budapest",
      "Vasas",
      "Szombathelyi Haladαs",
      "BFC Siσfok",
      "Szolnoki MΑV"
    };
    // az eredeti tabella pontjai, 2011.03.11
    int[] ep = {
      40,
      34,
      31,
      31,
      30,
      29,
      27,
      24,
      23,
      23,
      22,
      22,
      21,
      20,
      18,
      9
    };

    // az L mαtrix kιszνtιsekori sorrend (a blogra kettιbontottban ez a Wikis keresttαbla), 2011.03.11
    String[] csapatNevL = {
      "BFC Siσfok",
      "Budapest Honvιd",
      "Vasas",
      "Debreceni VSC",
      "Ferencvαros",
      "Gyυri ETO",
      "Kaposvαri Rαkσczi",
      "Kecskemιti TE",
      "Lombard Pαpa",
      "MTK Budapest",
      "Paksi FC",
      "Szolnoki MΑV FC",
      "Szombathelyi Haladαs",
      "Ϊjpest",
      "Videoton",
      "Zalaegerszegi TE"
    };

    double[] hv = new double[L.length];
    double[] h = new double[L.length];

    for (int i = 0; i < hv.length; ++i) {
      hv[i] = 1.0 / L.length;
      h[i] = 0.0;
    }

    double reginorma = 0.0, regiosszeg = 0.0;

    boolean amig = true;
    while (amig) {

      for (int i = 0; i < L.length; ++i) {
        for (int j = 0; j < L[i].length; ++j) {
          h[i] += L[i][j] * hv[j];
        }
      }

      // kicsit elegánsabban volt a laboron:
      // http://progpater.blog.hu/2011/02/13/bearazzuk_a_masodik_labort
      double osszeg = 0.0;
      for (int i = 0; i < h.length; ++i) {
        osszeg += (hv[i] - h[i]) * (hv[i] - h[i]);
      }

      System.out.println("iterαciσ...");

      double norma = Math.sqrt(osszeg);
      System.out.println("norma = " + norma);

      if (norma < .000000000001) {
        amig = false;

        System.out.println("+++");
        double osszegEll = 0.0;
        for (int i = 0; i < h.length; ++i) {

          osszegEll += h[i];
          System.out.println(h[i]);

        }
        System.out.println("φsszeg ell. = " + osszegEll);
        System.out.println("+++");

      }

      //double d = 0.98;
      double d = 0.87;
      //double d = 0.7;

      osszeg = 0.0;
      for (int i = 0; i < h.length; ++i) {

        //hv[i] = h[i];
        hv[i] = d * h[i] + (1.0 - d) / L.length;

        osszeg += hv[i];
        h[i] = 0.0;
      }

      System.out.println("φsszeg = " + osszeg);

      if (osszeg == regiosszeg && norma == reginorma) {
        amig = false;

        System.out.println("***");
        for (int i = 0; i < h.length; ++i) {
          System.out.println(hv[i]);
        }

        System.out.println("****");

        rendezCsapatok(csapatNevL, hv, csapatNevE, ep);

      }
      reginorma = norma;
      regiosszeg = osszeg;

    } // while
  }

  public static void rendezCsapatok(String[] s, double h[], String[] e, int ep[]) {

    System.out.println("\nCsapatok rendezve:\n");

    int csapatNevekMeret = h.length;

    Csapat csapatok[] = new Csapat[csapatNevekMeret];

    for (int i = 0; i < csapatNevekMeret; i++) {
      csapatok[i] = new Csapat(s[i], h[i]);
    }

    java.util.List<Csapat> rendezettCsapatok = java.util.Arrays.asList(csapatok);
    java.util.Collections.sort(rendezettCsapatok);
    java.util.Collections.reverse(rendezettCsapatok);
    java.util.Iterator iterv = rendezettCsapatok.iterator();
    int ii = 0;
    while (iterv.hasNext()) {
      Csapat csapat = (Csapat) iterv.next();

      String ds = Double.toString(csapat.ertek);
      int idx = ds.indexOf(".");
      StringBuffer sb = new StringBuffer();
      sb = sb.delete(0, sb.length());
      sb.append(ds.substring(0, idx + 5));
      String e4 = sb.toString();
System.out.println("|-");
      System.out.println("| " + e[ii]);
      System.out.println("| " + ep[ii]);
      System.out.println("| " + csapat.nev);
      System.out.println("| " + e4);

      ++ii;
    }
    System.out.println("|-");

  }
}

class Csapat implements Comparable<Csapat> {

  protected String nev;
  protected double ertek;

  public Csapat(String nev, double ertek) {
    this.nev = nev;
    this.ertek = ertek;
  }

  public int compareTo(Csapat csapat) {
    if (this.ertek < csapat.ertek) {
      return -1;
    } else if (this.ertek > csapat.ertek) {
      return 1;
    } else {
      return 0;
    }
  }
}

 

5 komment

Címkék: foci futball tabella dvsc loki nb1 alternatív tabella monicomp liga

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr462730551

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

basecamp 2011.09.12. 15:10:32

|-
| Debreceni VSC
| 22
| BFC Siσfok
| 0.1284
|-
| Gyυri ETO
| 22
| Kaposvαri Rαkσczi
| 0.1145
|-
| Pecsi MFC
| 16
| Paksi FC
| 0.0851
|-
| Budapest Honvιd
| 15
| Debreceni VSC
| 0.0837
|-
| Videoton
| 13
| Gyυri ETO
| 0.0790
|-
| Lombard Pαpa
| 13
| Lombard Pαpa
| 0.0698
|-
| Kecskemιti TE
| 12
| Videoton
| 0.0687
|-
| Diosgyor
| 12
| Kecskemιti TE
| 0.0663
|-
| Paksi FC
| 10
| Diosgyor
| 0.0658
|-
| BFC Siσfok
| 9
| Pecsi MFC
| 0.0483
|-
| Haladas
| 8
| Ϊjpest
| 0.0478
|-
| Kaposvαri Rαkσczi
| 7
| Budapest Honvιd
| 0.0366
|-
| Vasas
| 6
| Ferencvαros
| 0.0351
|-
| Ϊjpest
| 5
| Vasas
| 0.0295
|-
| Ferencvαros
| 5
| Haladas
| 0.0289
|-
| Zalaegerszegi TE
| 1
| Zalaegerszegi TE
| 0.0117
|-

Logos 2011.09.12. 17:13:58

|-
| Debreceni VSC
| 22
| BFC Siófok
| 0.1367
|-
| Győri ETO
| 22
| Kaposvári Rákóczi
| 0.1097
|-
| Pécsi MFC
| 16
| Lombard Pápa
| 0.0886
|-
| Budapest Honvéd
| 15
| Debreceni VSC
| 0.0871
|-
| Videoton
| 13
| Győri ETO
| 0.0811
|-
| Lombard Pápa
| 13
| Paksi FC
| 0.0695
|-
| Kecskeméti TE
| 12
| Videoton
| 0.0689
|-
| Diósgyőr
| 12
| Kecskeméti TE
| 0.0683
|-
| Paksi FC
| 10
| Diósgyőr
| 0.0659
|-
| BFC Siófok
| 9
| Pécsi MFC
| 0.0464
|-
| Haladás
| 8
| Budapest Honvéd
| 0.0411
|-
| Kaposvári Rákóczi
| 7
| Ferencváros
| 0.0366
|-
| Vasas
| 6
| Újpest
| 0.0330
|-
| Újpest
| 5
| Vasas
| 0.0276
|-
| Ferencváros
| 5
| Haladás
| 0.0271
|-
| Zalaegerszegi TE
| 1
| Zalaegerszegi TE
| 0.0115
|-

Logos 2011.09.12. 17:14:34

@Logos: saki04-el együtt csináltam gyakorlaton

nb · http://fersml.blog.hu 2011.09.14. 18:26:25

@Logos: de ez sajnos nem a jó eredmény...
süti beállítások módosítása