summaryrefslogtreecommitdiffstats
path: root/šola/p1/dn/DN08_63230317.java
diff options
context:
space:
mode:
Diffstat (limited to 'šola/p1/dn/DN08_63230317.java')
-rw-r--r--šola/p1/dn/DN08_63230317.java180
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());
+ }
+}