summaryrefslogtreecommitdiffstats
path: root/šola/p1/dn/DN08_63230317.java
blob: 86fca3fbd59903f6e3b1ff7401574e8b1c1d5422 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
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());
	}
}