|
1 |
| -# Τελική Εξέταση #11 - Logic Design Themed |
| 1 | +# Τελική Εξέταση #11 - Pacman Themed |
2 | 2 |
|
3 | 3 | Σημαντικό: φροντίζουμε τα προγράμματά μας να είναι ευανάγνωστα, αποδοτικά (σε χώρο και χρόνο) και να έχουν έξοδο όμοια με τα παραδείγματα εκτέλεσης καθώς αυτό είναι μέρος της βαθμολόγησης. Για οποιαδήποτε είσοδο εκτός προδιαγραφών το πρόγραμμα πρέπει να τερματίζει με exit code 1 και αντίστοιχο μήνυμα σφάλματος.
|
4 | 4 |
|
5 |
| -## 1. Αφαίρεση Μη Λατινικών Χαρακτήρων (25 Μονάδες) |
| 5 | +## 1. Αναζητώντας τον Blinky (25 Μονάδες) |
6 | 6 |
|
7 |
| -### Πρόγραμμα: bold.c |
| 7 | +### Πρόγραμμα: blinky.c |
8 | 8 |
|
9 | 9 | Γράψτε ένα πρόγραμμα το οποίο διαβάζει κείμενο από την πρότυπη είσοδο (stdin) και το τυπώνει στην πρότυπη έξοδο (stdout) με τους εξής περιορισμούς:
|
10 |
| -1. Οι αλλαγές γραμμής πρέπει να διατηρούνται. |
11 |
| -1. Πρέπει να μετατρέψει κάθε μη λατινικό χαρακτήρα (A-Za-z) σε κενό (space) χαρακτήρα ' '. |
12 |
| -1. Η πρώτη λέξη σε κάθε γραμμή θέλουμε να φαίνεται **bold**. |
| 10 | +1. Κάθε φορά που βρίσκει την λέξη Blinky - να την τοποθετεί ανάμεσα σε αστεράκια '*' και να την κάνει να αναβοσβήνει (blink). |
| 11 | +1. Αν το string Blinky είναι μέρος άλλης λέξης δεν χρειάζεται κάποια αλλαγή. |
| 12 | +1. Οι λέξεις αποτελούνται μόνο από λατινικούς χαρακτήρες (A-Za-z) οποιοσδήποτε άλλος χαρακτήρας θεωρείται διαχωριστικό λέξεων. |
13 | 13 |
|
14 | 14 | Παράδειγμα εκτέλεσης ακολουθεί:
|
15 | 15 |
|
16 |
| - |
| 16 | +[](https://asciinema.org/a/js20ZyFDDS0t8ocszkBBo6b4J) |
17 | 17 |
|
18 |
| -## 2. Ασημένιο Κλάσμα (25 Μονάδες) |
| 18 | +Αν για κάποιο λόγο δεν παίζει το παραπάνω link: |
19 | 19 |
|
20 |
| -### Πρόγραμμα: silver.c |
| 20 | +``` |
| 21 | +$ gcc -o blinky blinky.c |
| 22 | +$ cat description.txt |
| 23 | +In the Pac-Man universe, Blinky is the red ghost who |
| 24 | +persistently chases the game's hero, earning the |
| 25 | +nickname "Shadow" for his relentless pursuit. |
| 26 | +Blinky's strategy intensifies as Pac-Man consumes |
| 27 | +more dots, making Blinky a formidable challenge and |
| 28 | +a central figure in game strategy. His vivid red hue |
| 29 | +not only marks Blinky as the primary antagonist but |
| 30 | +also signals the immediate threat he poses. |
| 31 | +$ ./blinky < description.txt |
| 32 | +In the Pac-Man universe, *Blinky* is the red ghost who |
| 33 | +persistently chases the game's hero, earning the |
| 34 | +nickname "Shadow" for his relentless pursuit. |
| 35 | +*Blinky*'s strategy intensifies as Pac-Man consumes |
| 36 | +more dots, making *Blinky* a formidable challenge and |
| 37 | +a central figure in game strategy. His vivid red hue |
| 38 | +not only marks *Blinky* as the primary antagonist but |
| 39 | +also signals the immediate threat he poses. |
| 40 | +``` |
21 | 41 |
|
22 |
| -Ένας τρόπος να προσεγγίσουμε την τιμή του $\sqrt{2}$ είναι μέσω της παράστασης: |
| 42 | +## 2. Τοποθέτηση του Pacman (25 Μονάδες) |
23 | 43 |
|
24 |
| -$$ 1 + \sqrt{2} = 2 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2 + \cdots}}} $$ |
| 44 | +### Πρόγραμμα: position.c |
25 | 45 |
|
26 |
| -Όπου η προσθήκη του κάθε όρου $\frac{1}{2 + \cdots}$ βελτιώνει την προσέγγιση. Γράψτε ένα πρόγραμμα το οποίο παίρνει ως όρισμα έναν θετικό ακέραιο που αναπαριστά τον αριθμό των όρων $\frac{1}{2 + \cdots}$ που θέλουμε να χρησιμοποιηθούν και τυπώνει την προσέγγιση του $\sqrt{2}$ με 20 δεκαδικά ψηφία ακριβείας. Παραδείγματα εκτέλεσης ακολουθούν: |
| 46 | +Γράψτε ένα πρόγραμμα που παίρνει ως πρώτο όρισμα την διάσταση ενός τετραγωνικού πλέγματος και ως υπόλοιπα ορίσματα τις θέσεις των φαντασμάτων (ghosts) του pacman και τυπώνει όλες τις θέσεις στο πλέγμα που θα μπορούσε να τοποθετηθεί ο pacman. Ο pacman δεν μπορεί να τοποθετηθεί στην ίδια γραμμή ή στήλη με κάποιο φάντασμα. Όλες οι διαστάσεις δίνονται ως "x,y" ορίσματα (όπου x, y είναι ακέραιοι). Εάν δεν υπάρχει δυνατή τοποθέτηση το πρόγραμμά σας θα πρέπει να τυπώνει ανάλογο μήνυμα. Παραδείγματα εκτέλεσης ακολουθούν: |
27 | 47 |
|
28 | 48 | ```
|
29 |
| -$ ./silver 1 |
30 |
| -sqrt(2) = 1.00000000000000000000 |
31 |
| -$ ./silver 2 |
32 |
| -sqrt(2) = 1.50000000000000000000 |
33 |
| -$ ./silver 3 |
34 |
| -sqrt(2) = 1.39999999999999991118 |
35 |
| -$ ./silver 4 |
36 |
| -sqrt(2) = 1.41666666666666651864 |
37 |
| -$ ./silver 5 |
38 |
| -sqrt(2) = 1.41379310344827580082 |
39 |
| -$ ./silver 1000 |
40 |
| -sqrt(2) = 1.41421356237309492343 |
| 49 | +$ gcc -o position position.c |
| 50 | +$ ./position 4 0,4 3,2 2,1 1,3 |
| 51 | +Pacman cannot be positioned anywhere |
| 52 | +$ ./position 4 0,4 3,2 2,1 0,3 |
| 53 | +Pacman can be positioned at: 1,0 |
| 54 | +$ ./position 4 0,4 3,2 2,1 |
| 55 | +Pacman can be positioned at: 1,0 |
| 56 | +Pacman can be positioned at: 1,3 |
| 57 | +$ ./position 4 1,2 2,1 |
| 58 | +Pacman can be positioned at: 0,0 |
| 59 | +Pacman can be positioned at: 0,3 |
| 60 | +Pacman can be positioned at: 3,0 |
| 61 | +Pacman can be positioned at: 3,3 |
41 | 62 | ```
|
42 | 63 |
|
43 |
| -Για έναν όρο η δεξιά παράσταση είναι (2 + 0) -> sqrt(2) = 1, για 2 όρους η δεξιά παράσταση είναι (2 + 1 / 2) -> sqrt(2) = 1.5, κοκ. |
| 64 | +## 3. Κινήσεις σε Πλέγμα (25 Μονάδες) |
44 | 65 |
|
45 |
| -## 3. Κρυμμένο Μήνυμα (25 Μονάδες) |
| 66 | +### Πρόγραμμα: pacman.c |
46 | 67 |
|
47 |
| -### Πρόγραμμα: hidden.c |
| 68 | +Γράψτε ένα πρόγραμμα που παίρνει δύο ορίσματα: (1) το όνομα ενός αρχείου που περιέχει μια πίστα pacman και (2) τις κινήσεις που πρέπει να κάνει ο pacman πάνω στο πλέγμα και τυπώνει την τελική κατάσταση του παιχνιδιού μετά από αυτές τις κινήσεις. Το αρχείο θα έχει την ακόλουθη μορφή: |
| 69 | +1. Διάσταση του πλέγματος του παιχνιδιού (δεκαδικός ακέραιος). |
| 70 | +2. Τετράγωνο πλέγμα με χαρακτήρες '.' και ένα 'P' για την αρχική θέση του pacman. Όλοι οι άλλοι χαρακτήρες αγνοούνται. |
| 71 | +Οι κινήσεις που πρέπει να κάνει ο pacman θα αποτελούνται από 4 χαρακτήρες 'U' (Up), 'D' (Down), 'L' (Left), 'R' (Right). Όταν ο pacman κινείται σε κάποια θέση, τότε η τελεία ('.') σε εκείνη την θέση εξαφανίζεται. Η πίστα είναι τόρος, δηλαδή αν είσαι στην τελευταία γραμμή της και κινηθείς προς τα κάτω (D) τότε μεταφέρεσαι στην πρώτη γραμμή. Αντίστοιχα για κινήσεις αριστερά-δεξιά. Παραδείγματα εκτέλεσης ακολουθούν: |
48 | 72 |
|
49 |
| -Γράψτε ένα πρόγραμμα που παίρνει ως όρισμα το όνομα ενός αρχείου που περιέχει ένα κείμενο με λέξεις που αποτελούνται από λατινικούς χαρακτήρες (a-zA-Z) και θετικούς ακεραίους που αντιστοιχούν στην θέση της κάθε λέξης μέσα στο κείμενο και τυπώνει αυτές τις λέξεις με την σειρά που δίνονται ως ορίσματα στο πρόγραμμα. Παραδείγματα εκτέλεσης ακολουθούν: |
50 |
| - |
51 |
| -``` |
52 |
| -$ gcc -o hidden hidden.c |
53 |
| -$ cat message.txt |
54 |
| -In the quiet glade, where whispers of the past weave, |
55 |
| -Beneath the vault of heaven, a secret to conceive. |
56 |
| -The oak, ancient and large, guards a mystery so deep, |
57 |
| -Within its shadowed roots, a treasure lies asleep. |
58 |
| -Hidden by time's embrace, under earth's tender keep, |
59 |
| -Near the tree, love's promise, forever to reap |
60 |
| -$ ./hidden message.txt 19 34 35 42 1 23 20 49 |
61 |
| -The treasure lies under the large oak tree |
62 |
| -$ ./hidden message.txt 19 34 35 29 |
63 |
| -The treasure lies Within |
64 | 73 | ```
|
| 74 | +$ gcc -o pacman pacman.c |
| 75 | +$ cat level.txt |
| 76 | +7 |
| 77 | +....... |
| 78 | +....... |
| 79 | +..P.... |
| 80 | +....... |
| 81 | +....... |
| 82 | +....... |
| 83 | +....... |
| 84 | +$ ./pacman level.txt RRD |
| 85 | +....... |
| 86 | +....... |
| 87 | +.. .. |
| 88 | +....P.. |
| 89 | +....... |
| 90 | +....... |
| 91 | +....... |
| 92 | +$ ./pacman level.txt RRDDLL |
| 93 | +....... |
| 94 | +....... |
| 95 | +.. .. |
| 96 | +.... .. |
| 97 | +..P .. |
| 98 | +....... |
| 99 | +....... |
| 100 | +$ ./pacman level.txt RRDDLLUU |
| 101 | +....... |
| 102 | +....... |
| 103 | +..P .. |
| 104 | +.. . .. |
| 105 | +.. .. |
| 106 | +....... |
| 107 | +....... |
| 108 | +$ ./pacman level.txt RRDDLLUULLLL |
| 109 | +....... |
| 110 | +....... |
| 111 | + P |
| 112 | +.. . .. |
| 113 | +.. .. |
| 114 | +....... |
| 115 | +....... |
65 | 116 |
|
66 |
| -Παρατηρούμε ότι η λέξη "The" τυπώνεται πρώτη καθώς είναι η 20η λέξη στο κείμενο, δηλαδή βρίσκεται στην θέση 19 και αυτός είναι ο πρώτος ακέραιος που δόθηκε ως όρισμα στην γραμμή εντολών μετά το αρχείο. Αντίστοιχα τυπώνονται και οι υπόλοιπες λέξεις. |
67 |
| - |
68 |
| -## 4. Πλησιάζοντας στον Στόχο (25 Μονάδες) |
69 |
| - |
70 |
| -### Πρόγραμμα: treasure.c |
| 117 | +``` |
71 | 118 |
|
72 |
| -Γράψτε ένα πρόγραμμα το οποίο παίρνει ως ορίσματα από την γραμμή εντολών μια συντεταγμένη στόχο (goal) και στην συνέχεια ένα σύνολο άλλων συντεταγμένων (starting points) και τυπώνει όλες τις συντεταγμένες ταξινομημένες σε αύξουσα σειρά με βάση την απόστασή τους από τον στόχο. Όλοι οι αριθμοί κινητής υποδιαστολής θέλουμε να τυπώνονται με ακρίβεια με δύο δεκαδικών ψηφίων. Όλες οι συντεταγμένες είναι της μορφής x,y όπου x,y είναι αριθμοί κινητής υποδιαστολής. Η απόσταση δύο σημείων x1,y1 και x2,y2 δίνεται από την έκφραση: |
| 119 | +## 4. Clyde Πρώτοι (25 Μονάδες) |
73 | 120 |
|
74 |
| -$$ \sqrt{(x2 - x1)^2 + (y2 - y1)^2} $$ |
| 121 | +### Πρόγραμμα: clyde.c |
75 | 122 |
|
76 |
| -Παράδειγμα εκτέλεσης ακολουθεί: |
| 123 | +Ένας ακέραιος λέγεται πρώτος όταν διαιρείται μόνο με τον εαυτό του και την μονάδα. Ένας πρώτος λέγεται clyde πρώτος όταν υπάρχει μια περιστροφή των ψηφίων του (με βάση το 10) που είναι επίσης πρώτος. Γράψτε ένα πρόγραμμα που παίρνει έναν ακέραιο από την κονσόλα και αποφαίνεται αν είναι Clyde πρώτος ή όχι. Παραδείγματα εκτέλεσης: |
77 | 124 |
|
78 | 125 | ```
|
79 |
| -$ gcc -o treasure treasure.c -lm |
80 |
| -$ ./treasure 17,42 3.01,50.5 27.27,7 32,65.1 25,4 77,42.42 50,50 30.30,12 |
81 |
| -1. Point 3.01,50.50 is 16.37 steps away from the goal |
82 |
| -2. Point 32.00,65.10 is 27.54 steps away from the goal |
83 |
| -3. Point 30.30,12.00 is 32.82 steps away from the goal |
84 |
| -4. Point 50.00,50.00 is 33.96 steps away from the goal |
85 |
| -5. Point 27.27,7.00 is 36.48 steps away from the goal |
86 |
| -6. Point 25.00,4.00 is 38.83 steps away from the goal |
87 |
| -7. Point 77.00,42.42 is 60.00 steps away from the goal |
| 126 | +$ gcc -o clyde clyde.c -lm |
| 127 | +$ ./clyde 13 |
| 128 | +13 is a clyde prime because 31 is prime too |
| 129 | +$ ./clyde 99923 |
| 130 | +99923 is a clyde prime because 92399 is prime too |
| 131 | +$ ./clyde 41 |
| 132 | +41 is NOT a clyde prime |
| 133 | +$ ./clyde 99924 |
| 134 | +99924 is NOT a clyde prime |
| 135 | +$ ./clyde 90000520793 |
| 136 | +90000520793 is a clyde prime because 93900005207 is prime too |
88 | 137 | ```
|
0 commit comments