summaryrefslogblamecommitdiffstats
path: root/šola/p1/dn/DN08_63230317.java
blob: 86fca3fbd59903f6e3b1ff7401574e8b1c1d5422 (plain) (tree)



















































































































































































                                                                                                                                                                                                              
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());
	}
}