diff options
Diffstat (limited to 'šola/p1/dn/DN08_63230317.java')
-rw-r--r-- | šola/p1/dn/DN08_63230317.java | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/šola/p1/dn/DN08_63230317.java b/šola/p1/dn/DN08_63230317.java new file mode 100644 index 0000000..86fca3f --- /dev/null +++ b/šola/p1/dn/DN08_63230317.java @@ -0,0 +1,180 @@ +import java.util.*; +public class DN08_63230317 { + static class Ulomek implements Comparable<Ulomek> { + private int števec; + private int imenovalec; + public Ulomek (int števec, int imenovalec) { + this.števec = števec; + this.imenovalec = imenovalec; + int gcd = this.gcd(); + this.števec /= gcd; + this.imenovalec /= gcd; + } + private int celiDel () { + return this.števec/this.imenovalec; + } + private int gcd () { + return this.gcd(this.števec, this.imenovalec); + } + private static int gcd (int a, int b) { + if (b == 0) + return a; + return gcd(b, a%b); + } + public String toString () { + if (this.števec/this.gcd()-this.celiDel()*(this.imenovalec/this.gcd()) == 0) + return String.format("%d", this.celiDel()); + return String.format("%d+%d/%d", this.celiDel(), this.števec/this.gcd()-this.celiDel()*(this.imenovalec/this.gcd()), this.imenovalec/this.gcd()); + } + public Ulomek vsota (Ulomek a) { + return new Ulomek(this.števec*a.imenovalec+this.imenovalec*a.števec, this.imenovalec*a.imenovalec); + } + public Ulomek negacija () { + return new Ulomek(-this.števec, this.imenovalec); + } + public Ulomek produkt (Ulomek a) { + return new Ulomek(this.števec*a.števec, this.imenovalec*a.imenovalec); + } + public Ulomek obrat () { + return new Ulomek(this.imenovalec, this.števec); + } + @Override + public int compareTo (Ulomek b) { + return Integer.compare(this.števec*b.imenovalec, b.števec*this.imenovalec); + } + } + interface TočkeDela { + public Ulomek točk(); + } + static class PrimerjalnikDel implements Comparator<Delo> { + @Override + public int compare (Delo prvi, Delo drugi) { + if (prvi.točk().compareTo(drugi.točk()) == 0) + return Integer.compare(drugi.vrstni_red, prvi.vrstni_red); + return prvi.točk().compareTo(drugi.točk()); + } + } + abstract static class Delo implements TočkeDela { + String[] avtorji; + String naslov; + int vrstni_red; + Delo (Scanner sc, String jaz, int vrstni_red) { + this.vrstni_red = vrstni_red; + int avtorjev = sc.nextInt(); + this.avtorji = new String[avtorjev]; + for (int i = 0; i < avtorjev; i++) { + this.avtorji[i] = sc.next(); + if (this.avtorji[i].equals("#")) + this.avtorji[i] = jaz; + } + this.naslov = sc.next(); + } + } + private static class Monografija extends Delo { + String založba; + int leto; + String isbn; + public Monografija (Scanner sc, String jaz, int i) { + super(sc, jaz, i); + this.založba = sc.next(); + this.leto = sc.nextInt(); + this.isbn = sc.next(); + } + public String toString () { + return String.format("%s: %s. %s %d, ISBN %s | %s", String.join(", ", Arrays.asList(avtorji)), naslov, založba, leto, isbn, točk().toString()); + } + @Override + public Ulomek točk () { + return new Ulomek(10, 1).produkt(new Ulomek(avtorji.length, 1).obrat()); + } + } + private static class Referat extends Delo { + boolean mednarodni; + String konferenca; + int začetna; + int končna; + public Referat (Scanner sc, String jaz, int i) { + super(sc, jaz, i); + this.konferenca = sc.next(); + this.mednarodni = sc.nextBoolean(); + this.začetna = sc.nextInt(); + this.končna = sc.nextInt(); + } + public String toString() { + return String.format("%s: %s. %s: %d-%d | %s", String.join(", ", Arrays.asList(avtorji)), naslov, konferenca, začetna, končna, točk().toString()); + } + @Override + public Ulomek točk () { + Ulomek r = new Ulomek(1, 1); + if (this.mednarodni) + r = new Ulomek(3, 1); + return r.produkt(new Ulomek(avtorji.length, 1).obrat()); + } + } + private static class Članek extends Delo { + int mestoRevije; + int številoRevij; + String revija; + int letnik; + int številka; + int leto; + int začetna; + int končna; + public Članek (Scanner sc, String jaz, int i) { + super(sc, jaz, i); + this.revija = sc.next(); + this.letnik = sc.nextInt(); + this.številka = sc.nextInt(); + this.leto = sc.nextInt(); + this.mestoRevije = sc.nextInt(); + this.številoRevij = sc.nextInt(); + this.začetna = sc.nextInt(); + this.končna = sc.nextInt(); + } + Ulomek impact () { + return new Ulomek(this.mestoRevije, this.številoRevij); + } + int kvartil () { + if (this.impact().compareTo(new Ulomek(1, 4)) != 1) + return 1; + if (this.impact().compareTo(new Ulomek(1, 2)) != 1) + return 2; + if (this.impact().compareTo(new Ulomek(3, 4)) != 1) + return 3; + if (this.impact().compareTo(new Ulomek(1, 1)) != 1) + return 4; + return 5; + } + public String toString () { + return String.format("%s: %s. %s %d(%d): %d-%d (%d) | %s", String.join(", ", Arrays.asList(avtorji)), naslov, revija, letnik, številka, začetna, končna, leto, točk().toString()); + } + @Override + public Ulomek točk () { + Ulomek[] osnove = {null, new Ulomek(10, 1), new Ulomek(8, 1), new Ulomek(6, 1), new Ulomek(4, 1), new Ulomek(2, 1)}; + return osnove[kvartil()].produkt(new Ulomek(avtorji.length, 1).obrat()); + } + } + public static void main (String[] args) { + Scanner sc = new Scanner(System.in); + String jaz = sc.next(); + int vnosov = sc.nextInt(); + Delo[] dela = new Delo[vnosov]; + for (int i = 0; i < vnosov; i++) { + String vrsta = sc.next(); + switch (vrsta) { + case "monografija": + dela[i] = new Monografija(sc, jaz, i); + break; + case "referat": + dela[i] = new Referat(sc, jaz, i); + break; + case "clanek": + dela[i] = new Članek(sc, jaz, i); + break; + } + } + Arrays.sort(dela, new PrimerjalnikDel()); + for (int i = dela.length-1; i >= 0; i--) + System.out.println(dela[i].toString()); + } +} |