From 72c9a4a474afe5d7789466ce61bb50ca6220ec67 Mon Sep 17 00:00:00 2001 From: sijanec Date: Sat, 27 Mar 2021 15:56:37 +0100 Subject: naloge rtk --- "inf/rtk/2021-dr\305\276avno/1/a.out" | Bin 0 -> 19952 bytes "inf/rtk/2021-dr\305\276avno/1/prog.c" | 30 ++++++++++++++ "inf/rtk/2021-dr\305\276avno/2/a.out" | Bin 0 -> 19912 bytes "inf/rtk/2021-dr\305\276avno/2/marsovci.txt" | 5 +++ "inf/rtk/2021-dr\305\276avno/2/marsovci2.txt" | 5 +++ "inf/rtk/2021-dr\305\276avno/2/prog.c" | 35 +++++++++++++++++ "inf/rtk/2021-dr\305\276avno/3/a.out" | Bin 0 -> 19880 bytes "inf/rtk/2021-dr\305\276avno/3/prog.c" | 38 ++++++++++++++++++ "inf/rtk/2021-dr\305\276avno/3/vhod.txt" | 10 +++++ "inf/rtk/2021-dr\305\276avno/4/a.out" | Bin 0 -> 19784 bytes "inf/rtk/2021-dr\305\276avno/4/prog.c" | 29 ++++++++++++++ "inf/rtk/2021-dr\305\276avno/5/1" | 54 ++++++++++++++++++++++++++ "inf/rtk/2021-dr\305\276avno/5/a.out" | Bin 0 -> 20224 bytes "inf/rtk/2021-dr\305\276avno/5/prog.c" | 45 +++++++++++++++++++++ 14 files changed, 251 insertions(+) create mode 100755 "inf/rtk/2021-dr\305\276avno/1/a.out" create mode 100644 "inf/rtk/2021-dr\305\276avno/1/prog.c" create mode 100755 "inf/rtk/2021-dr\305\276avno/2/a.out" create mode 100644 "inf/rtk/2021-dr\305\276avno/2/marsovci.txt" create mode 100644 "inf/rtk/2021-dr\305\276avno/2/marsovci2.txt" create mode 100644 "inf/rtk/2021-dr\305\276avno/2/prog.c" create mode 100755 "inf/rtk/2021-dr\305\276avno/3/a.out" create mode 100644 "inf/rtk/2021-dr\305\276avno/3/prog.c" create mode 100644 "inf/rtk/2021-dr\305\276avno/3/vhod.txt" create mode 100755 "inf/rtk/2021-dr\305\276avno/4/a.out" create mode 100644 "inf/rtk/2021-dr\305\276avno/4/prog.c" create mode 100644 "inf/rtk/2021-dr\305\276avno/5/1" create mode 100755 "inf/rtk/2021-dr\305\276avno/5/a.out" create mode 100644 "inf/rtk/2021-dr\305\276avno/5/prog.c" diff --git "a/inf/rtk/2021-dr\305\276avno/1/a.out" "b/inf/rtk/2021-dr\305\276avno/1/a.out" new file mode 100755 index 0000000..b4b33a9 Binary files /dev/null and "b/inf/rtk/2021-dr\305\276avno/1/a.out" differ diff --git "a/inf/rtk/2021-dr\305\276avno/1/prog.c" "b/inf/rtk/2021-dr\305\276avno/1/prog.c" new file mode 100644 index 0000000..30b2924 --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/1/prog.c" @@ -0,0 +1,30 @@ +#include +#include +#include /* tolower */ +#include /* 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 \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\305\276avno/2/a.out" "b/inf/rtk/2021-dr\305\276avno/2/a.out" new file mode 100755 index 0000000..8599af2 Binary files /dev/null and "b/inf/rtk/2021-dr\305\276avno/2/a.out" differ diff --git "a/inf/rtk/2021-dr\305\276avno/2/marsovci.txt" "b/inf/rtk/2021-dr\305\276avno/2/marsovci.txt" new file mode 100644 index 0000000..d271b05 --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/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\305\276avno/2/marsovci2.txt" "b/inf/rtk/2021-dr\305\276avno/2/marsovci2.txt" new file mode 100644 index 0000000..8bd6ec0 --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/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\305\276avno/2/prog.c" "b/inf/rtk/2021-dr\305\276avno/2/prog.c" new file mode 100644 index 0000000..e8bc8a9 --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/2/prog.c" @@ -0,0 +1,35 @@ +#include +#include +#include /* 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\305\276avno/3/a.out" "b/inf/rtk/2021-dr\305\276avno/3/a.out" new file mode 100755 index 0000000..00d7929 Binary files /dev/null and "b/inf/rtk/2021-dr\305\276avno/3/a.out" differ diff --git "a/inf/rtk/2021-dr\305\276avno/3/prog.c" "b/inf/rtk/2021-dr\305\276avno/3/prog.c" new file mode 100644 index 0000000..6b9a1ff --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/3/prog.c" @@ -0,0 +1,38 @@ +#include +#include +#include /* da bo vse skupaj bolj fancy, lahko uporabimo PATH_MAX definicijo namesto dinamičnega heap alloc */ +#include +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\305\276avno/3/vhod.txt" "b/inf/rtk/2021-dr\305\276avno/3/vhod.txt" new file mode 100644 index 0000000..075806c --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/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\305\276avno/4/a.out" "b/inf/rtk/2021-dr\305\276avno/4/a.out" new file mode 100755 index 0000000..39923a0 Binary files /dev/null and "b/inf/rtk/2021-dr\305\276avno/4/a.out" differ diff --git "a/inf/rtk/2021-dr\305\276avno/4/prog.c" "b/inf/rtk/2021-dr\305\276avno/4/prog.c" new file mode 100644 index 0000000..cbe4ba4 --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/4/prog.c" @@ -0,0 +1,29 @@ +#include +#include +#include +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 \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\305\276avno/5/1" "b/inf/rtk/2021-dr\305\276avno/5/1" new file mode 100644 index 0000000..4497817 --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/5/1" @@ -0,0 +1,54 @@ +#include +#include +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 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\305\276avno/5/a.out" "b/inf/rtk/2021-dr\305\276avno/5/a.out" new file mode 100755 index 0000000..b1bb494 Binary files /dev/null and "b/inf/rtk/2021-dr\305\276avno/5/a.out" differ diff --git "a/inf/rtk/2021-dr\305\276avno/5/prog.c" "b/inf/rtk/2021-dr\305\276avno/5/prog.c" new file mode 100644 index 0000000..8dc677f --- /dev/null +++ "b/inf/rtk/2021-dr\305\276avno/5/prog.c" @@ -0,0 +1,45 @@ +#include +#include +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 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; +} -- cgit v1.2.3