From 37252e5ed4d8e4d748ae0dbc11893238125cd127 Mon Sep 17 00:00:00 2001 From: Florin Postolache <florin.postolache.of@gmail.com> Date: Sun, 12 May 2024 23:03:49 +0300 Subject: [PATCH] Add bonus task Signed-off-by: Florin Postolache <florin.postolache.of@gmail.com> --- checker/checker.py | 28 +++++++++++++++++ src/bonus/Makefile | 12 ++++++++ src/bonus/README.md | 51 +++++++++++++++++++++++++++++++ src/bonus/checker | 22 ++++++++++++++ src/bonus/functional.asm | 29 ++++++++++++++++++ src/bonus/in/1.in | 1 + src/bonus/in/10.in | 1 + src/bonus/in/11.in | 1 + src/bonus/in/12.in | 1 + src/bonus/in/13.in | 1 + src/bonus/in/14.in | 1 + src/bonus/in/15.in | 1 + src/bonus/in/16.in | 1 + src/bonus/in/17.in | 1 + src/bonus/in/18.in | 1 + src/bonus/in/19.in | 1 + src/bonus/in/2.in | 1 + src/bonus/in/20.in | 1 + src/bonus/in/3.in | 1 + src/bonus/in/4.in | 1 + src/bonus/in/5.in | 1 + src/bonus/in/6.in | 1 + src/bonus/in/7.in | 1 + src/bonus/in/8.in | 1 + src/bonus/in/9.in | 1 + src/bonus/main.c | 65 ++++++++++++++++++++++++++++++++++++++++ src/bonus/ref/1.ref | 1 + src/bonus/ref/10.ref | 1 + src/bonus/ref/11.ref | 1 + src/bonus/ref/12.ref | 1 + src/bonus/ref/13.ref | 1 + src/bonus/ref/14.ref | 1 + src/bonus/ref/15.ref | 1 + src/bonus/ref/16.ref | 1 + src/bonus/ref/17.ref | 1 + src/bonus/ref/18.ref | 1 + src/bonus/ref/19.ref | 1 + src/bonus/ref/2.ref | 1 + src/bonus/ref/20.ref | 1 + src/bonus/ref/3.ref | 1 + src/bonus/ref/4.ref | 1 + src/bonus/ref/5.ref | 1 + src/bonus/ref/6.ref | 1 + src/bonus/ref/7.ref | 1 + src/bonus/ref/8.ref | 1 + src/bonus/ref/9.ref | 1 + 46 files changed, 247 insertions(+) create mode 100644 src/bonus/Makefile create mode 100644 src/bonus/README.md create mode 100755 src/bonus/checker create mode 100644 src/bonus/functional.asm create mode 100644 src/bonus/in/1.in create mode 100644 src/bonus/in/10.in create mode 100644 src/bonus/in/11.in create mode 100644 src/bonus/in/12.in create mode 100644 src/bonus/in/13.in create mode 100644 src/bonus/in/14.in create mode 100644 src/bonus/in/15.in create mode 100644 src/bonus/in/16.in create mode 100644 src/bonus/in/17.in create mode 100644 src/bonus/in/18.in create mode 100644 src/bonus/in/19.in create mode 100644 src/bonus/in/2.in create mode 100644 src/bonus/in/20.in create mode 100644 src/bonus/in/3.in create mode 100644 src/bonus/in/4.in create mode 100644 src/bonus/in/5.in create mode 100644 src/bonus/in/6.in create mode 100644 src/bonus/in/7.in create mode 100644 src/bonus/in/8.in create mode 100644 src/bonus/in/9.in create mode 100644 src/bonus/main.c create mode 100644 src/bonus/ref/1.ref create mode 100644 src/bonus/ref/10.ref create mode 100644 src/bonus/ref/11.ref create mode 100644 src/bonus/ref/12.ref create mode 100644 src/bonus/ref/13.ref create mode 100644 src/bonus/ref/14.ref create mode 100644 src/bonus/ref/15.ref create mode 100644 src/bonus/ref/16.ref create mode 100644 src/bonus/ref/17.ref create mode 100644 src/bonus/ref/18.ref create mode 100644 src/bonus/ref/19.ref create mode 100644 src/bonus/ref/2.ref create mode 100644 src/bonus/ref/20.ref create mode 100644 src/bonus/ref/3.ref create mode 100644 src/bonus/ref/4.ref create mode 100644 src/bonus/ref/5.ref create mode 100644 src/bonus/ref/6.ref create mode 100644 src/bonus/ref/7.ref create mode 100644 src/bonus/ref/8.ref create mode 100644 src/bonus/ref/9.ref diff --git a/checker/checker.py b/checker/checker.py index 39a7559..39b9ffc 100644 --- a/checker/checker.py +++ b/checker/checker.py @@ -26,6 +26,7 @@ tasksNo = 3 runExec = "./" checker = "checker" taskDir = "../src/task-" +bonusDir = "../src/bonus" zipName = "VMChecker_Homework_2" @@ -58,6 +59,30 @@ def test_task(taskNo): rc = subprocess.call(f"make -C {taskString} clean > /dev/null 2> /dev/null", shell=useShell) +def test_bonus(): + global points + + taskString = f"{bonusDir}/" + procString = runExec + taskString + checker + rc = subprocess.call(f"make -C {taskString} > /dev/null 2> /dev/null", shell=useShell) + + if rc != 0: + sys.stderr.write("make failed with status %d\n" % rc) + return + + if not os.path.exists(procString): + sys.stderr.write("The file %s is missing and could not be created with \'make\'" % (taskString + checker)) + return + + checkerOutput = str(subprocess.check_output(f"cd {taskString} && ./checker", shell=useShell), encoding='utf-8') + + print(checkerOutput) + taskScore = re.findall(r'\d+\.\d+', re.findall(fr'TASK BONUS SCORE: \d+\.\d+', checkerOutput)[0])[0] + + points += float(taskScore) + + rc = subprocess.call(f"make -C {taskString} clean > /dev/null 2> /dev/null", shell=useShell) + #=======================================================================# if args.zip: @@ -73,6 +98,9 @@ points = 0 if args.task == None and args.all: for task in range(1, tasksNo + 1): test_task(task) + test_bonus() +elif args.task == 'b': + test_bonus() elif args.task != None: test_task(re.findall(r'\d', args.task)[0]) diff --git a/src/bonus/Makefile b/src/bonus/Makefile new file mode 100644 index 0000000..8de2f5b --- /dev/null +++ b/src/bonus/Makefile @@ -0,0 +1,12 @@ +build: main.o functional.o + gcc -g -m64 -no-pie -fno-PIC -o functional main.o functional.o + +main.o: main.c + gcc -g -no-pie -fno-PIC -c -m64 -o $@ $< + +functional.o: functional.asm + nasm -g -f elf64 -o $@ $< + + +clean: + rm -f *.o functional out/*.out diff --git a/src/bonus/README.md b/src/bonus/README.md new file mode 100644 index 0000000..dbd6f67 --- /dev/null +++ b/src/bonus/README.md @@ -0,0 +1,51 @@ +# Bonus - x64 assembly + +Acum ca Zoly si-a scris sistemul de detectie a intruziunilor +si isi poate apara toti prietenii pe care si i-a facut in tema 2, +se poate intoarce la marea ei pasiune: programarea functionala. + +Totodata, spre deosebire de echipa de PCLP2, ea a inteles ca in +prezent se folosesc sisteme pe 64 de biti, iar cele pe 32 de biti +sunt foarte rare. Astfel, ea doreste sa implementeze functiile +`map` si `reduce` in assembly pe 64 de biti si folosin si numere +pe 64 de biti. Stiti de la +(tema 1)[https://gitlab.cs.pub.ro/iocla/tema-1-2024] ce sunt fiecare. + +## Map + +Antet map: +``` +void map(int64_t *destination_array, int64_t *source_array, int64_t array_size, int64_t(*f)(int64_t)); +``` + +Antet functie ce poate fi folosita pentru map: +``` +int64_t map_func1(int64_t curr_elem); +``` + +Pseudocod map: +``` +map(dst, src, n, to_apply): + for i de la 0 la n: + dst[i] = to_apply(src[i]) +``` + +## Reduce + +Antet reduce: +``` +int64_t fold(int64_t *destination_array, int64_t *source_array, int64_t array_size, int64_t accumulator_initial_value, int64_t(*f)(int64_t, int64_t)); +``` + +Antet functie ce poate fi folosita pentru reduce: +``` +int64_t reduce_func1(int64_t accumulator, int64_t current_elem); +``` + +Pseudocod reduce: +``` +reduce(src, n, accumulator_initial, to_apply): + acc = accumulator_initial + for i de la 0 la n: + acc = to_apply(acc, src[i]) +``` diff --git a/src/bonus/checker b/src/bonus/checker new file mode 100755 index 0000000..64372c2 --- /dev/null +++ b/src/bonus/checker @@ -0,0 +1,22 @@ +TOTAL_POINTS=0 +mkdir -p out + +check_one() { + ./functional < in/$1.in > out/$1.out + if cmp --silent -- out/$1.out ref/$1.ref; then + printf "Test %02d ................. PASSED: 1.0p\n" $1 + TOTAL_POINTS=$(($TOTAL_POINTS + 1)) + else + printf "Test %02d ................. FAILED: 0.0p\n" $1 + fi +} + +#if [[ -z "$1" ]]; then + echo "---------------TASK BONUS---------------" + for i in $(seq 1 20); do + check_one $i + done + printf "\nTASK BONUS SCORE: %.2f / 20.00\n\n" $TOTAL_POINTS +#else +# check_one $1 +#fi diff --git a/src/bonus/functional.asm b/src/bonus/functional.asm new file mode 100644 index 0000000..6e25a30 --- /dev/null +++ b/src/bonus/functional.asm @@ -0,0 +1,29 @@ +[BITS 64] + +; nu uitati sa scrieti in feedback ca voiati +; assembly pe 64 de biti + +section .text +global map +global reduce +map: + push rbp ; look at these fancy registers + mov rbp, rsp + + ; sa-nceapa turneu' + + leave + ret + + +; int reduce(int *dst, int *src, int n, int acc_init, int(*f)(int, int)); +; int f(int acc, int curr_elem); +reduce: + push rbp ; look at these fancy registers + mov rbp, rsp + + ; sa-nceapa festivalu' + + leave + ret + diff --git a/src/bonus/in/1.in b/src/bonus/in/1.in new file mode 100644 index 0000000..47f80d3 --- /dev/null +++ b/src/bonus/in/1.in @@ -0,0 +1 @@ +map map_func1 5 979 884 971 870 58 diff --git a/src/bonus/in/10.in b/src/bonus/in/10.in new file mode 100644 index 0000000..b4e4b09 --- /dev/null +++ b/src/bonus/in/10.in @@ -0,0 +1 @@ +map map_func2 50 350 744 9 930 835 196 763 109 61 589 669 51 280 606 233 699 897 938 109 773 535 140 875 273 251 845 216 967 902 62 434 920 735 778 33 59 372 369 177 256 689 25 85 118 978 70 26 42 747 941 diff --git a/src/bonus/in/11.in b/src/bonus/in/11.in new file mode 100644 index 0000000..377b4b1 --- /dev/null +++ b/src/bonus/in/11.in @@ -0,0 +1 @@ +reduce reduce_func1 5 22 383 262 131 833 diff --git a/src/bonus/in/12.in b/src/bonus/in/12.in new file mode 100644 index 0000000..d79ee07 --- /dev/null +++ b/src/bonus/in/12.in @@ -0,0 +1 @@ +reduce reduce_func1 10 959 161 753 189 536 709 2 395 604 45 diff --git a/src/bonus/in/13.in b/src/bonus/in/13.in new file mode 100644 index 0000000..62c320b --- /dev/null +++ b/src/bonus/in/13.in @@ -0,0 +1 @@ +reduce reduce_func1 15 814 254 156 995 38 5 353 961 631 643 761 766 116 293 346 diff --git a/src/bonus/in/14.in b/src/bonus/in/14.in new file mode 100644 index 0000000..18dfd8d --- /dev/null +++ b/src/bonus/in/14.in @@ -0,0 +1 @@ +reduce reduce_func1 25 501 32 316 460 565 785 620 758 47 924 271 774 412 884 637 723 158 485 982 231 96 677 704 324 859 diff --git a/src/bonus/in/15.in b/src/bonus/in/15.in new file mode 100644 index 0000000..cefb63c --- /dev/null +++ b/src/bonus/in/15.in @@ -0,0 +1 @@ +reduce reduce_func1 50 105 25 459 808 896 971 131 531 599 800 403 499 528 336 148 896 983 350 266 269 621 994 430 669 19 717 572 983 144 687 59 260 35 135 166 175 99 465 651 238 521 939 726 957 33 253 239 732 456 76 diff --git a/src/bonus/in/16.in b/src/bonus/in/16.in new file mode 100644 index 0000000..eefeb1f --- /dev/null +++ b/src/bonus/in/16.in @@ -0,0 +1 @@ +reduce reduce_func2 5 257 83 606 234 640 diff --git a/src/bonus/in/17.in b/src/bonus/in/17.in new file mode 100644 index 0000000..04c8fb3 --- /dev/null +++ b/src/bonus/in/17.in @@ -0,0 +1 @@ +reduce reduce_func2 10 811 820 639 727 369 263 701 434 286 539 diff --git a/src/bonus/in/18.in b/src/bonus/in/18.in new file mode 100644 index 0000000..93552bf --- /dev/null +++ b/src/bonus/in/18.in @@ -0,0 +1 @@ +reduce reduce_func2 15 769 5 155 37 394 419 165 114 525 742 90 247 105 103 21 diff --git a/src/bonus/in/19.in b/src/bonus/in/19.in new file mode 100644 index 0000000..1205a7e --- /dev/null +++ b/src/bonus/in/19.in @@ -0,0 +1 @@ +reduce reduce_func2 25 187 769 238 108 223 26 534 686 476 465 318 549 658 390 218 702 929 779 987 216 747 826 445 436 524 diff --git a/src/bonus/in/2.in b/src/bonus/in/2.in new file mode 100644 index 0000000..82119bc --- /dev/null +++ b/src/bonus/in/2.in @@ -0,0 +1 @@ +map map_func1 10 94 87 370 856 174 754 829 686 875 316 diff --git a/src/bonus/in/20.in b/src/bonus/in/20.in new file mode 100644 index 0000000..7b3a8e9 --- /dev/null +++ b/src/bonus/in/20.in @@ -0,0 +1 @@ +reduce reduce_func2 50 22 596 606 53 903 429 952 538 596 186 943 97 680 822 492 375 20 532 984 944 122 626 376 297 707 955 382 316 20 896 702 423 104 108 314 204 861 794 689 846 17 832 463 62 421 653 498 475 214 911 diff --git a/src/bonus/in/3.in b/src/bonus/in/3.in new file mode 100644 index 0000000..7919ab3 --- /dev/null +++ b/src/bonus/in/3.in @@ -0,0 +1 @@ +map map_func1 15 258 621 218 622 37 596 698 163 442 654 403 823 741 881 522 diff --git a/src/bonus/in/4.in b/src/bonus/in/4.in new file mode 100644 index 0000000..9dde7be --- /dev/null +++ b/src/bonus/in/4.in @@ -0,0 +1 @@ +map map_func1 25 973 381 558 959 456 515 275 923 37 892 29 373 477 955 327 930 390 434 914 906 539 169 574 182 242 diff --git a/src/bonus/in/5.in b/src/bonus/in/5.in new file mode 100644 index 0000000..a4aea3d --- /dev/null +++ b/src/bonus/in/5.in @@ -0,0 +1 @@ +map map_func1 50 237 25 181 333 178 140 523 523 369 527 691 574 187 916 457 816 425 753 538 929 931 782 373 809 608 363 371 880 985 457 166 978 773 410 733 757 473 671 544 256 502 286 948 511 513 528 852 816 363 678 diff --git a/src/bonus/in/6.in b/src/bonus/in/6.in new file mode 100644 index 0000000..467ef74 --- /dev/null +++ b/src/bonus/in/6.in @@ -0,0 +1 @@ +map map_func2 5 905 466 922 925 473 diff --git a/src/bonus/in/7.in b/src/bonus/in/7.in new file mode 100644 index 0000000..8d8b341 --- /dev/null +++ b/src/bonus/in/7.in @@ -0,0 +1 @@ +map map_func2 10 360 582 744 943 571 742 468 499 675 228 diff --git a/src/bonus/in/8.in b/src/bonus/in/8.in new file mode 100644 index 0000000..b85c30e --- /dev/null +++ b/src/bonus/in/8.in @@ -0,0 +1 @@ +map map_func2 15 964 333 835 717 856 171 898 930 632 275 792 934 492 317 311 diff --git a/src/bonus/in/9.in b/src/bonus/in/9.in new file mode 100644 index 0000000..8c6b000 --- /dev/null +++ b/src/bonus/in/9.in @@ -0,0 +1 @@ +map map_func2 25 981 819 724 852 517 576 531 520 668 631 603 417 320 749 213 501 525 376 957 701 639 904 78 804 841 diff --git a/src/bonus/main.c b/src/bonus/main.c new file mode 100644 index 0000000..50bd900 --- /dev/null +++ b/src/bonus/main.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +extern void map(int64_t *dst, int64_t *src, int64_t n, int64_t(*f)(int64_t)); +extern int64_t reduce(int64_t *dst, int64_t *src, int64_t n, int64_t acc_init, int64_t(*f)(int64_t, int64_t)); + +int64_t map_func1(int64_t n) { + return 2 * n; +} + +int64_t map_func2(int64_t n) { + return 4 * n + 10; +} + +int64_t reduce_func1(int64_t acc, int64_t n) { + return acc + n; +} + +int64_t reduce_func2(int64_t acc, int64_t n) { + if (n % 2 == 0) { + return acc - n; + } + return acc + n; +} + +int64_t main() { + char opType[100]; + char opFunc[100]; + int64_t n; + + scanf("%s %s %ld", opType, opFunc, &n); + + int64_t *src = malloc(n * sizeof(int64_t)); + int64_t *dst = malloc(n * sizeof(int64_t)); + + + for (int64_t i = 0; i < n; i++) { + scanf("%ld", &src[i]); + } + + if (!strcmp(opType, "map")) { + if (!strcmp(opFunc, "map_func1")) { + map(dst, src, n, map_func1); + } else { + map(dst, src, n, map_func2); + } + for (int64_t i = 0; i < n; i++) { + printf("%ld ", dst[i]); + } + printf("\n"); + } else { + int64_t res; + if (!strcmp(opFunc, "reduce_func1")) { + res = reduce(dst, src, n, 5, reduce_func1); + } else { + res = reduce(dst, src, n, 0, reduce_func2); + } + printf("%ld\n", res); + } + + return 0; + +} diff --git a/src/bonus/ref/1.ref b/src/bonus/ref/1.ref new file mode 100644 index 0000000..2db3e6a --- /dev/null +++ b/src/bonus/ref/1.ref @@ -0,0 +1 @@ +1958 1768 1942 1740 116 diff --git a/src/bonus/ref/10.ref b/src/bonus/ref/10.ref new file mode 100644 index 0000000..913e716 --- /dev/null +++ b/src/bonus/ref/10.ref @@ -0,0 +1 @@ +1410 2986 46 3730 3350 794 3062 446 254 2366 2686 214 1130 2434 942 2806 3598 3762 446 3102 2150 570 3510 1102 1014 3390 874 3878 3618 258 1746 3690 2950 3122 142 246 1498 1486 718 1034 2766 110 350 482 3922 290 114 178 2998 3774 diff --git a/src/bonus/ref/11.ref b/src/bonus/ref/11.ref new file mode 100644 index 0000000..d0e5260 --- /dev/null +++ b/src/bonus/ref/11.ref @@ -0,0 +1 @@ +1636 diff --git a/src/bonus/ref/12.ref b/src/bonus/ref/12.ref new file mode 100644 index 0000000..81d452a --- /dev/null +++ b/src/bonus/ref/12.ref @@ -0,0 +1 @@ +4358 diff --git a/src/bonus/ref/13.ref b/src/bonus/ref/13.ref new file mode 100644 index 0000000..c573331 --- /dev/null +++ b/src/bonus/ref/13.ref @@ -0,0 +1 @@ +7137 diff --git a/src/bonus/ref/14.ref b/src/bonus/ref/14.ref new file mode 100644 index 0000000..a0a24b0 --- /dev/null +++ b/src/bonus/ref/14.ref @@ -0,0 +1 @@ +13230 diff --git a/src/bonus/ref/15.ref b/src/bonus/ref/15.ref new file mode 100644 index 0000000..03e9516 --- /dev/null +++ b/src/bonus/ref/15.ref @@ -0,0 +1 @@ +23059 diff --git a/src/bonus/ref/16.ref b/src/bonus/ref/16.ref new file mode 100644 index 0000000..3fdcc1d --- /dev/null +++ b/src/bonus/ref/16.ref @@ -0,0 +1 @@ +-1140 diff --git a/src/bonus/ref/17.ref b/src/bonus/ref/17.ref new file mode 100644 index 0000000..a1de4bf --- /dev/null +++ b/src/bonus/ref/17.ref @@ -0,0 +1 @@ +2509 diff --git a/src/bonus/ref/18.ref b/src/bonus/ref/18.ref new file mode 100644 index 0000000..44ba2fc --- /dev/null +++ b/src/bonus/ref/18.ref @@ -0,0 +1 @@ +1211 diff --git a/src/bonus/ref/19.ref b/src/bonus/ref/19.ref new file mode 100644 index 0000000..bde76dc --- /dev/null +++ b/src/bonus/ref/19.ref @@ -0,0 +1 @@ +-276 diff --git a/src/bonus/ref/2.ref b/src/bonus/ref/2.ref new file mode 100644 index 0000000..84dcd17 --- /dev/null +++ b/src/bonus/ref/2.ref @@ -0,0 +1 @@ +188 174 740 1712 348 1508 1658 1372 1750 632 diff --git a/src/bonus/ref/20.ref b/src/bonus/ref/20.ref new file mode 100644 index 0000000..55a47ba --- /dev/null +++ b/src/bonus/ref/20.ref @@ -0,0 +1 @@ +-5714 diff --git a/src/bonus/ref/3.ref b/src/bonus/ref/3.ref new file mode 100644 index 0000000..324a559 --- /dev/null +++ b/src/bonus/ref/3.ref @@ -0,0 +1 @@ +516 1242 436 1244 74 1192 1396 326 884 1308 806 1646 1482 1762 1044 diff --git a/src/bonus/ref/4.ref b/src/bonus/ref/4.ref new file mode 100644 index 0000000..7b0e659 --- /dev/null +++ b/src/bonus/ref/4.ref @@ -0,0 +1 @@ +1946 762 1116 1918 912 1030 550 1846 74 1784 58 746 954 1910 654 1860 780 868 1828 1812 1078 338 1148 364 484 diff --git a/src/bonus/ref/5.ref b/src/bonus/ref/5.ref new file mode 100644 index 0000000..d338a8d --- /dev/null +++ b/src/bonus/ref/5.ref @@ -0,0 +1 @@ +474 50 362 666 356 280 1046 1046 738 1054 1382 1148 374 1832 914 1632 850 1506 1076 1858 1862 1564 746 1618 1216 726 742 1760 1970 914 332 1956 1546 820 1466 1514 946 1342 1088 512 1004 572 1896 1022 1026 1056 1704 1632 726 1356 diff --git a/src/bonus/ref/6.ref b/src/bonus/ref/6.ref new file mode 100644 index 0000000..6e71974 --- /dev/null +++ b/src/bonus/ref/6.ref @@ -0,0 +1 @@ +3630 1874 3698 3710 1902 diff --git a/src/bonus/ref/7.ref b/src/bonus/ref/7.ref new file mode 100644 index 0000000..e3e7812 --- /dev/null +++ b/src/bonus/ref/7.ref @@ -0,0 +1 @@ +1450 2338 2986 3782 2294 2978 1882 2006 2710 922 diff --git a/src/bonus/ref/8.ref b/src/bonus/ref/8.ref new file mode 100644 index 0000000..11ff073 --- /dev/null +++ b/src/bonus/ref/8.ref @@ -0,0 +1 @@ +3866 1342 3350 2878 3434 694 3602 3730 2538 1110 3178 3746 1978 1278 1254 diff --git a/src/bonus/ref/9.ref b/src/bonus/ref/9.ref new file mode 100644 index 0000000..11ad1c3 --- /dev/null +++ b/src/bonus/ref/9.ref @@ -0,0 +1 @@ +3934 3286 2906 3418 2078 2314 2134 2090 2682 2534 2422 1678 1290 3006 862 2014 2110 1514 3838 2814 2566 3626 322 3226 3374 -- GitLab