summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsijanec <anton@sijanec.eu>2021-03-27 15:56:37 +0100
committersijanec <anton@sijanec.eu>2021-03-27 15:56:37 +0100
commit72c9a4a474afe5d7789466ce61bb50ca6220ec67 (patch)
tree8d6004ace45f9928773811881585b6a3a4a1e473
parentnarejena slovenščain pretzenacija do kponca (diff)
downloadsola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar
sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.gz
sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.bz2
sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.lz
sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.xz
sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.tar.zst
sola-gimb-2-72c9a4a474afe5d7789466ce61bb50ca6220ec67.zip
-rwxr-xr-xinf/rtk/2021-državno/1/a.outbin0 -> 19952 bytes
-rw-r--r--inf/rtk/2021-državno/1/prog.c30
-rwxr-xr-xinf/rtk/2021-državno/2/a.outbin0 -> 19912 bytes
-rw-r--r--inf/rtk/2021-državno/2/marsovci.txt5
-rw-r--r--inf/rtk/2021-državno/2/marsovci2.txt5
-rw-r--r--inf/rtk/2021-državno/2/prog.c35
-rwxr-xr-xinf/rtk/2021-državno/3/a.outbin0 -> 19880 bytes
-rw-r--r--inf/rtk/2021-državno/3/prog.c38
-rw-r--r--inf/rtk/2021-državno/3/vhod.txt10
-rwxr-xr-xinf/rtk/2021-državno/4/a.outbin0 -> 19784 bytes
-rw-r--r--inf/rtk/2021-državno/4/prog.c29
-rw-r--r--inf/rtk/2021-državno/5/154
-rwxr-xr-xinf/rtk/2021-državno/5/a.outbin0 -> 20224 bytes
-rw-r--r--inf/rtk/2021-državno/5/prog.c45
14 files changed, 251 insertions, 0 deletions
diff --git a/inf/rtk/2021-državno/1/a.out b/inf/rtk/2021-državno/1/a.out
new file mode 100755
index 0000000..b4b33a9
--- /dev/null
+++ b/inf/rtk/2021-državno/1/a.out
Binary files differ
diff --git a/inf/rtk/2021-državno/1/prog.c b/inf/rtk/2021-državno/1/prog.c
new file mode 100644
index 0000000..30b2924
--- /dev/null
+++ b/inf/rtk/2021-državno/1/prog.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h> /* tolower */
+#include <string.h> /* memmove */
+int MoznaGesla(char * g) {
+ int l = strlen(g); /* za boljšo efektivnost najprej dobimo dolžino niza in jo shranimo, saj je konstantna */
+ for (int i = 0; i <= l; i++) { /* pred katerim znakom naj bo pika */
+ for (int j = 0; j < l; j++) { /* katera črka prvotnega gesla naj bo velika */
+ if (g[j] >= '0' && g[j] <= '9') /* številka ne more biti velika ali majhna, zato ta primer */
+ continue; /* izpustimo */
+ char * buf = malloc(l+1); /* naredimo buffer za niz, ki ga bomo natisnili */
+ strcpy(buf, g); /* skopiramo notri začetno geslo */
+ buf[j] = toupper(buf[j]); /* tole je bolj samoumevno, kakor če bi prišteli obskurno ascii vrednost */
+ char * pika = buf+i; /* kje naj bo pika */
+ memmove(pika+1, pika, (l+1)-i); /* umaknemo znake od in vključno z znakom, kjer bo pika, en znak v desno */
+ pika[0] = '.'; /* napišemo piko */
+ fprintf(stdout, "%s\n", buf); /* natisnemo niz */
+ free(buf); /* sprostimo buffer */
+ }
+ }
+ return 1; /* vrnemo se iz podprograma, po želji zamenjaj z while(1); če se bojiš vračanja iz podprogramov */
+}
+int main (int argc, char ** argv) {
+ if (argc < 1+1) {
+ fprintf(stderr, "uporaba: %s <začetno geslo za epl ajdi>\n", argv[0]);
+ return 1;
+ }
+ MoznaGesla(argv[1]); /* glavna funkcija samo pokliče podprogram in kot parameter da prvi argument, začetno geslo za epl ajdi */
+ return 0;
+}
diff --git a/inf/rtk/2021-državno/2/a.out b/inf/rtk/2021-državno/2/a.out
new file mode 100755
index 0000000..8599af2
--- /dev/null
+++ b/inf/rtk/2021-državno/2/a.out
Binary files differ
diff --git a/inf/rtk/2021-državno/2/marsovci.txt b/inf/rtk/2021-državno/2/marsovci.txt
new file mode 100644
index 0000000..d271b05
--- /dev/null
+++ b/inf/rtk/2021-državno/2/marsovci.txt
@@ -0,0 +1,5 @@
+4
+75 12 96 57 28
+96 28 12 75 9
+96 9 57 28 75
+12 57 9 28 75
diff --git a/inf/rtk/2021-državno/2/marsovci2.txt b/inf/rtk/2021-državno/2/marsovci2.txt
new file mode 100644
index 0000000..8bd6ec0
--- /dev/null
+++ b/inf/rtk/2021-državno/2/marsovci2.txt
@@ -0,0 +1,5 @@
+4
+75 12 96 57 28
+96 28 12 75 9
+96 9 57 28 75
+12 57 96 28 75
diff --git a/inf/rtk/2021-državno/2/prog.c b/inf/rtk/2021-državno/2/prog.c
new file mode 100644
index 0000000..e8bc8a9
--- /dev/null
+++ b/inf/rtk/2021-državno/2/prog.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h> /* INT_MAX */
+int main (int argc, char ** argv) {
+ char buf[100]; /* vhodni niz ne more biti večji od 100, razen, če je marsovcev več kot 1e100, v tem primeru mamo večje problme */
+ int * opr = calloc(101, sizeof(int)); /* alociramo in na 0 nastavimo seznam celih, to so vsa obstoječa opravila */
+ fgets(buf, 99, stdin); /* preberemo število marsovcev kot niz */
+ int mar = atoi(buf); /* ga pretvorimo v celo */
+ for (int i = 0; i < mar; i++) { /* za vsakega marsovca. tukaj dokaj verjamemo, da mar ne laže, ker bi to bil velik fuckery */
+ fgets(buf, 99, stdin); /* preberemo marsovca */
+ char * cp = buf; /* nastavimo kazalec na začetek buf, brali bomo števila */
+ do {
+ int stevopr = strtol(cp, &cp, 10); /* povečamo št. opravila */
+ if (stevopr != 0) /* če številka opravila ni nič (strtol v primeru napake vrne nič, če so recimo presledki na koncu vrs) */
+ opr[stevopr]++; /* povečamo število marsovcev s kompetenco za to opravilo */
+ cp++; /* preskočimo presledek */
+ } while (cp[-1] != '\0' && cp[-1] != '\n' && cp[-1] != '\r'); /* nehamo, če zadenemo ob konec niza ali LF (CR na shitty OS) */
+ }
+ int min = INT_MAX; /* semle shranimo število marsovcev s kompetencami opravljanja opravila z najmanjšo zastopanostjo */
+ int max = -1; /* semle shranimo število marsovcev s kompetencami opravila z največjo zastopanostjo */
+ for(int e = 1; e <= 100; e++) { /* za vsako možno opravilo */
+ if (opr[e] != 0) { /* če kdo sploh ima kompetence */
+ if (opr[e] < min) /* če je trenutno opravilo manj zastopano */
+ min = opr[e]; /* to zapišemo */
+ if (opr[e] > max) /* če je trenutno opravilo bolj zastopano */
+ max = opr[e]; /* to zapišemo */
+ }
+ }
+ if (max-min > 1) /* če je diskrepanca med najbolj zastopanim in najmanj zastopanim opravilom večja od ena */
+ fprintf(stdout, "ne\n"); /* rečemo ne */
+ else /* drugače */
+ fprintf(stdout, "da\n"); /* rečemo ja */
+ free(opr); /* sprostimo seznam kompetenc */
+ return 0; /* odidemo iz programa */
+}
diff --git a/inf/rtk/2021-državno/3/a.out b/inf/rtk/2021-državno/3/a.out
new file mode 100755
index 0000000..00d7929
--- /dev/null
+++ b/inf/rtk/2021-državno/3/a.out
Binary files differ
diff --git a/inf/rtk/2021-državno/3/prog.c b/inf/rtk/2021-državno/3/prog.c
new file mode 100644
index 0000000..6b9a1ff
--- /dev/null
+++ b/inf/rtk/2021-državno/3/prog.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <linux/limits.h> /* da bo vse skupaj bolj fancy, lahko uporabimo PATH_MAX definicijo namesto dinamičnega heap alloc */
+#include <string.h>
+int main (int argc, char ** argv) {
+ char buf[PATH_MAX+1]; /* statično alociramo buffer, to je dokaj slabo za varnost pred buffer overruns, ampak baje nam je vseen */
+ char path[PATH_MAX+1]; /* -||- za buffer za tiskanje */
+ path[0] = '\0'; /* path naj bo prazen niz */
+ int prejglob = 1; /* prejšna globina - 1 je koren shrambe */
+ while (!feof(stdin)) { /* beremo do konca */
+ fgets(buf, PATH_MAX, stdin); /* pridobimo vrstico iz standardnega vhoda */
+ char * cp = strrchr(buf, ' '); /* najdemo zadnji presledek v njej. PAZI: moodle ima v primeru naloge presledke na koncu vrstic, to moraš zbrisati prej!!! */
+ if (!cp) /* če strrchr ni našel presledka */
+ return 0; /* končali smo */
+ int glob = strtol(cp+1, NULL, 10); /* pretvorimo globino v celo */
+ cp[0] = '\0'; /* buf je sedaj ime direktorija, odstranili smo presledek */
+ if (glob - prejglob > 1) { /* če smo preskočili direktorij */
+ fprintf(stdout, "Napaka!\n"); /* napišemo napaka */
+ return 2; /* gremo iz programa */
+ }
+ if (prejglob - glob >= 0) { /* če spremenimo trenutni direktorij ali če gremo proti korenu */
+ for (int i = 0; i <= prejglob - glob; i++) { /* zbrišemo toliko iz trenutne poti, da bomo lahko pripopali direktorij */
+ char * ck = strrchr(path, '/'); /* dobimo torej poševnico */
+ if (!ck) /* če je ni, smo morebiti na začetku programa */
+ ck = path; /* kazalec nastavimo na prvi znak poti */
+ ck[0] = '\0'; /* odgriznemo stran toliko direktorijev, da bomo kasneje pripopali buf in pristali na pravilnem direktoriju */
+ }
+ strcat(path, "/"); /* dodamo poševnico */
+ strcat(path, buf); /* dodamo direktorij */
+ } else { /* gremo stran od korena, vstopamo v direktorij */
+ strcat(path, "/"); /* dodamo poševnico */
+ strcat(path, buf); /* dodamo ime direktorija */
+ }
+ fprintf(stdout, "%s\n", path); /* never ever zaupaj uporabniškemu vnosu kot print format */
+ prejglob = glob; /* prejšnjo globino nastavimo na trenutno in gremo na začetek loopa */
+ }
+ return 0; /* vrnemo se iz programa */
+}
diff --git a/inf/rtk/2021-državno/3/vhod.txt b/inf/rtk/2021-državno/3/vhod.txt
new file mode 100644
index 0000000..075806c
--- /dev/null
+++ b/inf/rtk/2021-državno/3/vhod.txt
@@ -0,0 +1,10 @@
+bin 1
+inc 1
+boost 2
+logic 3
+math 3
+net 2
+lib 1
+gcc 2
+nginx 2
+modules 3
diff --git a/inf/rtk/2021-državno/4/a.out b/inf/rtk/2021-državno/4/a.out
new file mode 100755
index 0000000..39923a0
--- /dev/null
+++ b/inf/rtk/2021-državno/4/a.out
Binary files differ
diff --git a/inf/rtk/2021-državno/4/prog.c b/inf/rtk/2021-državno/4/prog.c
new file mode 100644
index 0000000..cbe4ba4
--- /dev/null
+++ b/inf/rtk/2021-državno/4/prog.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+int Primerjava (char * s, char * t, int n) { /* O(2n) */
+ int d = strlen(s); /* predpomnimo dolžino testov */
+ int sest = 0; /* sestevek naj bo 0 */
+ for (int i = 0; i < n; i++) /* najprej je iskalniško okno prvih n, zato naredimo seštevek */
+ if (s[i] != t[i]) /* če je diskrepanca */
+ sest++; /* povečamo seštevek */
+ int topsest = sest; /* največji seštevek je torej seštevek */
+ int topoffs = 0; /* zapomnimo si offset tega največjega seštevka */
+ for (int i = n; i < d; i++) { /* hodimo po nizu in premikamo okno */
+ if (s[i-n] != t[i-n]) /* če se na začetku pregledovalnega okna testa nista ujemala */
+ sest--; /* zmanjšamo seštevek, ker tega ni več v oknu */
+ if (s[i] != t[i]) /* če se nova v okno ne skladata */
+ sest++; /* povečamo seštevek neujemanih */
+ if (sest > topsest) /* če je v oknu nov rekordni seštevek */
+ topoffs = (i-n)+1; /* offset spremenimo na trenutni offset začetka okna - pazi, to ni i-n, kajti tega smo iz okna pravkar izpustili */
+ }
+ return topoffs; /* vrnemo offset največjega seštevka */
+}
+int main (int argc, char ** argv) {
+ if (argc < 1+3) {
+ fprintf(stderr, "uporaba: %s <niz s> <niz t> <celo n>\n", argv[0]);
+ return 1;
+ }
+ fprintf(stdout, "rekordni offset je %d\n", Primerjava(argv[1], argv[2], atoi(argv[3]))); /* iz glavne funkcije poženemo podpr. */
+ return 0;
+}
diff --git a/inf/rtk/2021-državno/5/1 b/inf/rtk/2021-državno/5/1
new file mode 100644
index 0000000..4497817
--- /dev/null
+++ b/inf/rtk/2021-državno/5/1
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+int primerjaj_cela (const void * a, const void * b) {
+ const int * c = (const int *) a;
+ const int * d = (const int *) b;
+ return *c - *d;
+}
+int postopek (int * l, int n, int * nmvp) { /* funkcija dobi lonce in kazalec na najmanjšo možno vsoto premerov */
+ qsort(l, n, sizeof(int), primerjaj_cela); /* zanašamo se na procesor in uporabimo zanj najbolj učinkovit sortirni algoritem */
+ nmvp = 0;
+ int * s = calloc(n, sizeof(int)); /* seznam skladov, sklad v danem trenutku predstavlja najmanjši lonec v njem */
+ int sn = 0; /* stevilo skladov, da ni treba venomer vrteti po seznamu in iskati NULL */
+ for (int i = n-1; i >= 0; i--) { /* od največjega lonca proti najmanjšemu najdemo primeren sklad, kamor lahko damo lonec */
+ for (int j = 0; j < sn; j++) { /* iščemo primeren obstoječ sklad */
+ if (s[j] > l[i]) { /* če smo našli primeren dom za lonec (: */
+ s[j] = l[i];
+ break;
+ }
+ }
+ /* ker ni bilo breaka, smo tukaj, še vedno pa imamo ta velik lonec, ki ne paše v noben obstoječ s, zategadelj naredimo nov s */
+ s[sn] = l[i];
+ *nmvp += l[i]; /* povečamo najmanjšo možno vsoto premerov */
+ }
+ free(s);
+ return sn; /* vrnemo število skladov, najmanjšo možno vsoto premerov - nmvp pa smo itak sproti večali */
+}
+int main (int argc, char ** argv) {
+ if (argc < 1+1) {
+ fprintf(stderr, "uporaba: %s <diameter lonca 1>[, diameter lonca 2[, diameter lonca 3[,...]]]\n", argv[0]);
+ return 1;
+ }
+ int * l = calloc(argc, sizeof(int));
+ for (int i = 0; i < argc-1; i++)
+ l[i] = atoi(argv[i+1]);
+ int nmvp = 0;
+ int ss = postopek(l, argc-1, &nmvp);
+ char * slovenscina_je_lep_jezik;
+ switch (ss % 100) {
+ case 1:
+ slovenscina_je_lep_jezik = "";
+ case 2:
+ slovenscina_je_lep_jezik = "a";
+ case 3:
+ case 4:
+ slovenscina_je_lep_jezik = "e";
+ case 0:
+ default:
+ slovenscina_je_lep_jezik = "ov";
+ }
+ fprintf(stdout, "potrebujemo najmanj %d sklad%s, najmanjša možna vsota premerov pa je %d.\n",
+ ss, slovenscina_je_lep_jezik, nmvp);
+ free(l);
+ return 0;
+}
diff --git a/inf/rtk/2021-državno/5/a.out b/inf/rtk/2021-državno/5/a.out
new file mode 100755
index 0000000..b1bb494
--- /dev/null
+++ b/inf/rtk/2021-državno/5/a.out
Binary files differ
diff --git a/inf/rtk/2021-državno/5/prog.c b/inf/rtk/2021-državno/5/prog.c
new file mode 100644
index 0000000..8dc677f
--- /dev/null
+++ b/inf/rtk/2021-državno/5/prog.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <stdlib.h>
+int primerjaj_cela (const void * a, const void * b) {
+ const int * c = (const int *) a;
+ const int * d = (const int *) b;
+ return *c - *d;
+}
+int postopek (int * l, int n, int * nmvp) { /* funkcija dobi lonce in kazalec na najmanjšo možno vsoto premerov */
+ qsort(l, n, sizeof(int), primerjaj_cela); /* zanašamo se na procesor in uporabimo zanj najbolj učinkovit sortirni algoritem */
+ *nmvp = 0; /* če je klicatelj to slučajno pozabil, nastavimo nmvp na nič */
+ int * s = calloc(n, sizeof(int)); /* seznam skladov, sklad v danem trenutku predstavlja najmanjši lonec v njem */
+ int sn = 0; /* stevilo skladov, da ni treba venomer vrteti po seznamu in iskati NULL */
+ for (int i = n-1; i >= 0; i--) { /* od največjega lonca proti najmanjšemu najdemo primeren sklad, kamor lahko damo lonec */
+ int uspelo = 0; /* če smo našli nov dom za lonec, bomo to napisali sem */
+ for (int j = 0; j < sn; j++) { /* iščemo primeren obstoječ sklad */
+ if (s[j] > l[i]) { /* če smo našli primeren dom za lonec (: */
+ s[j] = l[i]; /* lonec shranimo kot najmanjši */
+ uspelo = 1; /* označimo */
+ break; /* zapremo loop iskanja skupka */
+ }
+ }
+ if (uspelo) /* če nam je uspelo najti nov dom za lonec */
+ continue /* na nov lonec */;
+ /* smo tukaj, še vedno pa imamo ta velik lonec, ki ne paše v noben obstoječ s, zategadelj naredimo nov s */
+ s[sn++] = l[i];
+ *nmvp += l[i]; /* povečamo najmanjšo možno vsoto premerov */
+ }
+ free(s); /* sprostimo seznam skupkov */
+ return sn; /* vrnemo število skladov, najmanjšo možno vsoto premerov - nmvp pa smo itak sproti večali */
+}
+int main (int argc, char ** argv) {
+ if (argc < 1+1) {
+ fprintf(stderr, "uporaba: %s <diameter lonca 1>[, diameter lonca 2[, diameter lonca 3[,...]]]\n", argv[0]);
+ return 1;
+ }
+ int * l = calloc(argc, sizeof(int)); /* naredimo seznam loncev */
+ for (int i = 0; i < argc-1; i++) /* za vsak argument poleg argv[0] */
+ l[i] = atoi(argv[i+1]); /* populiramo seznam loncev */
+ int nmvp = 0; /* nastavimo statično spremenljivko nmvp */
+ int ss = postopek(l, argc-1, &nmvp); /* poženemo podprogram */
+ fprintf(stdout, "potrebujemo najmanj %d sklad*, najmanjša možna vsota premerov pa je %d.\n",
+ ss, nmvp); /* povemo rezultate */
+ free(l); /* sprostimo seznam loncev */
+ return 0;
+}