Τροποποίηση άσκησης πανελληνίων για πολύ δυνατούς λύτες

Ξεκίνησε από Delta2000, 01 Νοε 2017, 05:06:54 ΜΜ

« προηγούμενο - επόμενο »

Delta2000

Πρόκειται για την απόλυτη γενικοποίηση του Γ θέματος των Επαναληπτικών του 2014. Όποιος θέλει μπορεί να ψάξει να δει το θέμα. Να τονίσω οτι στην άσκηση μου το πλήθος ν κανονικά μπορεί να πάρει οποιαδήποτε θετική τιμή το 10 είναι απλώς μια ενδεικτική τιμή. Λεω την εκφωνησή μου λοιπόν ;)

--------------------------------------------------------------------------------------------------------------------------------------------------------------
Να αναπτύξετε πρόγραμμα σε Γλώσσα το οποίο:

1. Να διαβάζει το πλήθος ν (1<=ν<=10) των αγνώστων της εξίσωσης Α*χ1+Β*χ2+Γ*χ3+Δ*χ4...+Ω*Χν = αρ καθώς και
τους συντελεστές {Α,Β,Γ,Δ...Ω...} των αγνώστων αυτών και την τιμή αρ.
2.Να προσδιορίζει ο χρήστης σε ποια όρια θα κυμαίνεται ο κάθε άγνωστος.
3.Να εμφανίζει όλες τις λύσεις της εξίσωσης, εξετάζοντας όλους τους δυνατούς συνδιασμούς ακεραίων τιμών
των αγνώστων στα όρια που έχει ο χρήστης για κάθε άγνωστο. Αν δεν υπάρχουν τέτοιες λύσεις, να εμφανίζει κατάλληλο μήνυμα.
4.Να εμφανίζει το πρώτο ζεύγος λύσεων της εξίσωσης για τις οποίες το άθροισμα των αγνώστων έχει την
μεγαλύτερη τιμή
5.Να εμφανίζει το πλήθος των λύσεων της εξίσωσης για τις οποίες οι άγνωστοι είναι θετικοί άρτιοι αριθμοί
6.Να εμφανίζει το ποσοστό των λύσεων της εξίσωσης για τις οποίες μία μόνο απο τους άγνωστους είναι ίσο με το μηδεν. 
------------------------------------------------------------------------------------------------------------------------------------------------------------
Δινω και την λύση παρακάτω αλλα καλό θα ήταν πρώτα κάποιος να προσπαθήσει να βρει κάποια λύση. Να σημειώσω ότι αυτή η άσκηση ξεφεύγει εντελώς από
τους διδακτικούς σκοπούς του μαθήματος και προσφέρεται μονο και μόνο ως πρόκληση σε όποιον καθηγητή (η και ικανό μαθητή γιατί οχι) που θέλει να δει το
όριο των δυνατοτήτων της ΓΛΩΣΣΑΣ. Να σημειώσω ότι η λύση μου δουλεύει μόνο στον διερμηνευτή της ΓΛΩΣΣΑΣ εξαιτίας του μεγάλου αριθμού εντολών που
εκτελούνται απλώς σε κάποιες περιπτώσεις θα εμφανίσει ένα προειδοποιητικό μήνυμα ότι η εκτέλεση υπέρβηκε τις 100.000 εντολες. Απλώς του λέτε να συνεχίσει ;)

Αν έχετε οποιαδήποτε απορία για τον τρόπο λύσης μου ή εντοπίσετε κάποιο λάθος μην διστάσετε να μου πειτε.Προσώπικα όλο το ΣΚ την πάλευα :D

bugman

#1
Έδωσα μια λύση με 99 γραμμές (μέσα έχω και τρεις σημείωση, που τις αφαιρούμε και είναι εντολές για εμφάνιση πληροφοριών).
Δεν χρησιμοποιώ υπολογισμό όλων των συνδυασμών προκαταβολικά, αυτό προκύπτει από το τον τρόπο που χρησιμοποιώ το "cascade" των μετρητών (θεωρώ τους άγνωστους  ως μετρητές από ένα κάτω όριο μέχρι και ένα πάνω όριο, και κάθε φορά που ο μετρητής περνάει το πάνω όριο, παίρνει τιμή το κάτω όριο, και η μεταβλητή Κ ή "cascade" αυξάνεται κατά ένα για να γυρίσει τον επόμενο μετρητή, αν και αυτός έχει "cascade" τότε πάει στον επόμενο, και αν το Κ γίνει μεγαλύτερο από το Ν, τότε τερματίζει η κεντρική επανάληψη. Οι μετρητές δουλεύουν με δυο "σημαίες" ή "συνθήκες", το αν το Κ>Ν (το εξήγησα) και το ΩΣ_ΕΧΕΙ, το δεύτερο αν δεν έχουμε cascade κατάσταση τότε βγαίνουμε από τους μετρητές και παραμένουμε στη κεντρική επανάληψη (συνήθηκη μέχρις_ότου Κ > Ν Η ΩΣ_ΕΧΕΙ). Η κεντρική επανάληψη βγαίνει όταν Κ>Ν

λογικά το πρόγραμμα παίρνει βελτιστοποίηση αν καταγράφουμε πόσοι μετρητές "γύρισαν" και υπολογίζουμε μόνο αυτά τα γινόμενα, άρα θα πρέπει να έχουμε και ένα πίνακα γινομένων! Ο υπολογισμός είναι εύκολος, αρκεί το Κ.


Delta2000

Παράθεση από: bugman στις 01 Νοε 2017, 08:55:15 ΜΜ
Έδωσα μια λύση με 99 γραμμές (μέσα έχω και τρεις σημείωση, που τις αφαιρούμε και είναι εντολές για εμφάνιση πληροφοριών).
Δεν χρησιμοποιώ υπολογισμό όλων των συνδυασμών προκαταβολικά, αυτό προκύπτει από το τον τρόπο που χρησιμοποιώ το "cascade" των μετρητών (θεωρώ τους άγνωστους  ως μετρητές από ένα κάτω όριο μέχρι και ένα πάνω όριο, και κάθε φορά που ο μετρητής περνάει το πάνω όριο, παίρνει τιμή το κάτω όριο, και η μεταβλητή Κ ή "cascade" αυξάνεται κατά ένα για να γυρίσει τον επόμενο μετρητή, αν και αυτός έχει "cascade" τότε πάει στον επόμενο, και αν το Κ γίνει μεγαλύτερο από το Ν, τότε τερματίζει η κεντρική επανάληψη. Οι μετρητές δουλεύουν με δυο "σημαίες" ή "συνθήκες", το αν το Κ>Ν (το εξήγησα) και το ΩΣ_ΕΧΕΙ, το δεύτερο αν δεν έχουμε cascade κατάσταση τότε βγαίνουμε από τους μετρητές και παραμένουμε στη κεντρική επανάληψη (συνήθηκη μέχρις_ότου Κ > Ν Η ΩΣ_ΕΧΕΙ). Η κεντρική επανάληψη βγαίνει όταν Κ>Ν

λογικά το πρόγραμμα παίρνει βελτιστοποίηση αν καταγράφουμε πόσοι μετρητές "γύρισαν" και υπολογίζουμε μόνο αυτά τα γινόμενα, άρα θα πρέπει να έχουμε και ένα πίνακα γινομένων! Ο υπολογισμός είναι εύκολος, αρκεί το Κ.

Φίλε μου έλεγξα την λύση σου και ενω πίστευα αρχικά ότι δεν θα είχε το ίδιο αποτέλεσμα,τελικά κάνει το ίδιο πράγμα και πολύ πιο αποδοτικά. Ετσι κι αλλιως ξερουμε οτι στον προγραμματισμο η λύση η οποια ειναι πιο σύντομη κατά την εκτελεσή της και παράγει το ίδιο αποτέλεσμα με οποιαδήποτε άλλη είναι και η πιο αποδεκτή ;). Για να βλέπουμε και άλλες λύσεις ;D

bugman

#3
Ευχαριστώ για τα καλά λόγια! Το έφτιαξα γιατί είδα ότι στο πρόγραμμά σου είχε χρησιμοποιηθεί πολύ πράγμα, που φώναζε από μακριά ότι "είμαι πληθωρικό".
Είχα δε πολύ καιρό να γράψω πρόγραμμα στη ΓΛΩΣΣΑ (και να χρησιμοποιήσω τον διερμηνευτή), και το όνομα Bugman δεν είναι τυχαίο, δηλαδή με το που το χρησιμοποίησα βρήκα και δυο "bug", ένα ενοχλητικό και ένα όχι ουσιαστικό: Πρώτο δεν υπάρχει το ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ στη λίστα εντολών (Διερμηνευτής 1.5.1.3). Το δεύτερο είναι το TAB  το οποίο παραμένει ως TAB αν δεν επιλέξουμε το κείμενο για να κάνει την εσοχή που θέλουμε. Για να κάνουμε γρήγορη επιλογή πρέπει πριν το TAB να πατήσουμε κάτω βελάκι με shift, και μετά το TAB. (μπέρδεμα δηλαδή).
Αν γράφει κανείς το ΑΡΧΗ_Ε τότε εμφανίζεται η συμπλήρωση εντολής.


Δες επίσης στο κώδικά μου το -1 στην αρχική τιμή του ΜΕΓΙΣΤΟΣ. Θέλω ο μέγιστος να είναι -1 από τη πρώτη σειρά του αθροίσματος των μετρητών ώστε στη πρώτη λύση αν είναι από την πρώτη σειρά των μετρητών, τότε θα είναι -1 διαφορά, και έτσι θα πάρει τιμές ο πίνακας μεγ[].

Delta2000

Παράθεση από: bugman στις 02 Νοε 2017, 12:00:54 ΠΜ
Ευχαριστώ για τα καλά λόγια! Το έφτιαξα γιατί είδα ότι στο πρόγραμμά σου είχε χρησιμοποιηθεί πολύ πράγμα, που φώναζε από μακριά ότι "είμαι πληθωρικό".
Είχα δε πολύ καιρό να γράψω πρόγραμμα στη ΓΛΩΣΣΑ (και να χρησιμοποιήσω τον διερμηνευτή), και το όνομα Bugman δεν είναι τυχαίο, δηλαδή με το που το χρησιμοποίησα βρήκα και δυο "bug", ένα ενοχλητικό και ένα όχι ουσιαστικό: Πρώτο δεν υπάρχει το ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ στη λίστα εντολών (Διερμηνευτής 1.5.1.3). Το δεύτερο είναι το TAB  το οποίο παραμένει ως TAB αν δεν επιλέξουμε το κείμενο για να κάνει την εσοχή που θέλουμε. Για να κάνουμε γρήγορη επιλογή πρέπει πριν το TAB να πατήσουμε κάτω βελάκι με shift, και μετά το TAB. (μπέρδεμα δηλαδή).
Αν γράφει κανείς το ΑΡΧΗ_Ε τότε εμφανίζεται η συμπλήρωση εντολής.


Δες επίσης στο κώδικά μου το -1 στην αρχική τιμή του ΜΕΓΙΣΤΟΣ. Θέλω ο μέγιστος να είναι -1 από τη πρώτη σειρά του αθροίσματος των μετρητών ώστε στη πρώτη λύση αν είναι από την πρώτη σειρά των μετρητών, τότε θα είναι -1 διαφορά, και έτσι θα πάρει τιμές ο πίνακας μεγ[].

Αυτο που ζηταει αυτη η ασκηση σε αλλες γλωσσες γινεται και με 20 εντολες πολυ πιο απλα αλλα να γινει σε ΓΛΩΣΣΑ το κανει προκληση  ;) Δεν είχα σκεφτεί τον τρόπο σου και το έμπλεξα όσο πιο πολυ γινόταν πραγματικα για να βγαλω λυση απ'οτι φαινεται :'( Επίσης σίγουρα δεν έχω την εμπειρία σου στην ΓΛΩΣΣΑ λογικά είσαι καθηγητής ενώ εγώ μαθητής δίνω σε 6 μήνες χαχαχαχαχα. Προσωπικα βρισκω τις ασκησεις που κανω στο φροντηστηριο γελοιες και στον ελευθερο μου χρονο γενικοποιω διαφορα θεματα οπου γινεται μεσα στις δυνατοτητες της ΓΛΩΣΣΑΣ και όποτε φτιάχνω κάτι καλό λέω να το δημοσιεύω εδώ να βλέπω και άλλες γνώμες. Ως γνώστης vb.net και λίγο python όμως, όταν κάτι δεν το έχει αυτοματοποιημένο η ΓΛΩΣΣΑ έχω την τάση να σκέφτομαι όσο πιο περίπλοκα γίνεται για να βγαλω αυτο που θελω ;D

Υ.Γ Και ο Διερμηνευτής της Γλώσσας και η Γλωσσομάθεια ακόμα και για τον αρχάριο χομπίστα προγραμματιστή φαίνονται επιεικώς απαράδεκτα αλλα ας μην ξεχνάμε ότι πρόκειται για διδακτικό λογισμικό και όχι κάποιο IDE όπως το Visual Studio. Και εγώ υπομονή κάνω με τα bug μην νομίζεις ;D

bugman

Δεν δουλεύω σαν καθηγητής. Αλλά λύνω πολύ γρήγορα προβλήματα σχετικά με ασκήσεις και αυτό που έβαλες μου πήρε πολύ λίγο χρόνο (δεν το γράφω...). Στον ελεύθερο χρόνο μου τελειοποιώ μια γλώσσα που έχω γράψει!

Delta2000

Παράθεση από: bugman στις 02 Νοε 2017, 01:41:31 ΠΜ
Δεν δουλεύω σαν καθηγητής. Αλλά λύνω πολύ γρήγορα προβλήματα σχετικά με ασκήσεις και αυτό που έβαλες μου πήρε πολύ λίγο χρόνο (δεν το γράφω...). Στον ελεύθερο χρόνο μου τελειοποιώ μια γλώσσα που έχω γράψει!

Είδα σήμερα λίγο καλύτερα τη λύση σου να καταλάβω πως ακριβώς λειτουργεί και ομολογώ να πω ότι ήταν πολύ καλή σκέψη για να γλυτώσεις επαναλήψεις. Η λύση μου βγήκε από την συγχώνεψη 2 ασκήσεων που έχω σκεφτεί. Πριν αρχίσω να δουλεύω με αυτην σκεφτόμουν πως να κάνω τη ΓΛΩΣΣΑ να μπορεί να δίνει τις τιμές ζεύγων μεταβλητών για ν εμφωλευμένους βρόχους δυναμικά ανάλογα με το τι αριθμό ν βάλει ο χρήστης. Η λύση σου δεν δουλεύει σαν οι άγνωστοι να ήταν σε εμφωλευμένους βρόχους αλλά εφόσον καλύπτει όλους τους συνδιασμούς στην άσκηση σημασία δεν έχει. Ίσως να έχει λίγο σημασία στο μέγιστο του αθροίσματος των αγνώστων γιατί οι πιθανοί συνδιασμοί δεν έχουν τη σείρα που θα είχαν σαν να ήταν σε βρόχους και η άσκηση ζητάει το πρώτο ζεύγος. Αλλά στην τελική ποιο είναι το πρώτο να μου πεις.

bugman

Για το Μέγιστο:
Το πρώτο θα δώσει! Γιατί το δεύτερο ή θα είναι ίσο ή μικρότερο, οπότε δεν θα το δώσει, ή θα είναι μεγαλύτερο άρα θα το αλλάξει με το νέο μεγαλύτερο.
Οι πιθανοί συνδυασμοί σχετίζονται με τη λύση, και ο τρόπος που δουλεύει το πρόγραμμα "εκθέτει" όλες τις λύσεις στη σειρά των ΑΝ για τα επιμέρους ερωτήματα. Εφόσον δηλαδή δίνει τον αριθμό των σωστών λύσεων, σημαίνει ότι έχει γίνει έλεγχος σε όλες τις λύσεις βάσει του Μέγιστου. Η "πατέντα" είναι ότι δεν ξέρουμε ποιο είναι αρχικό μέγιστο, μπορεί να είναι το πρώτο! Οπότε παίρνουμε το πρώτο, όλα τα κάτω όρια, τα προσθέτουμε και προσθέτουμε ένα ακόμα -1, άρα η πρώτη τιμή ΜΕΓΙΣΤΟ είναι ψεύτικη, αλλά αδύνατον να μην φέρει αληθές στην πρώτη σύγκριση, έτσι η πρώτη σύγκριση (που γίνεται μόνο σε λύσεις) θα γεμίσει τον πίνακα μεγ[].
Για να τσεκάρει κανείς ένα πρόγραμμα πρέπει να το υποβάλει σε κάποια τεστ ώστε όλα τα μέρη του να "παίξουν" και να φανεί ότι δουλεύει.

Αρχικά ορίζω μεταβλητές με αρχικές τιμές, αλλά μου βγάζει λάθος ο διερμηνευτής, επειδή δεν δέχεται αρχικές τιμές (το είχα ξεχάσει)
Στην αρχική έκδοση του προγράμματος δεν έβαλα να ζητάει νούμερα, τα έγραψα απευθείας στο κώδικα! Και τα άλλαζα για να δω ότι όντως δουλεύει. Δυο φορές χτύπησε λάθος γιατί δεν είχα βάλει αρχικές τιμές σε μερικές μεταβλητές. Ξεχάστηκα ότι είχα βγάλει τις αρχικές τιμές από τις δηλώσεις! Εδώ θα έπαιζε η γλώσσα να μπορεί στη δήλωση να δίνει και αρχική τιμή!

Στο τελικό άφησα τα μηνύματα...ελέγχου!
Αν βγάλεις το ! εκεί που δείχνει τα βήματα δες τι θα πάρεις:
ΠΟΣΟΙ ΑΓΝΩΣΤΟΙ;
3
ΣΥΝΤΕΛΕΣΤΗ ΚΑΙ ΚΑΤΩ ΚΑΙ ΑΝΩ ΟΡΙΟ ΓΙΑ ΤΟΝ ΑΓΝΩΣΤΟ 1
2
-2
0
ΣΥΝΤΕΛΕΣΤΗ ΚΑΙ ΚΑΤΩ ΚΑΙ ΑΝΩ ΟΡΙΟ ΓΙΑ ΤΟΝ ΑΓΝΩΣΤΟ 2
-2
0
2
ΣΥΝΤΕΛΕΣΤΗ ΚΑΙ ΚΑΤΩ ΚΑΙ ΑΝΩ ΟΡΙΟ ΓΙΑ ΤΟΝ ΑΓΝΩΣΤΟ 3
1
-1
1
ΔΩΣΕ ΤΙΜΗ ΕΛΕΓΧΟΥ ΑΘΡΟΙΣΜΑΤΟΣ
0
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (0 ΕΠΙ -2)
-4 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (0 ΕΠΙ -2)
-2 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (0 ΕΠΙ -2)
0 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (1 ΕΠΙ -2)
-6 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (1 ΕΠΙ -2)
-4 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (1 ΕΠΙ -2)
-2 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (2 ΕΠΙ -2)
-8 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (2 ΕΠΙ -2)
-6 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (2 ΕΠΙ -2)
-4 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (0 ΕΠΙ -2)
-4 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (0 ΕΠΙ -2)
-2 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (0 ΕΠΙ -2)
0 ΣΥΝ (0 ΕΠΙ 1)
Ζεύγος Λύσεων
1 0
2 0
3 0
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (1 ΕΠΙ -2)
-6 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (1 ΕΠΙ -2)
-4 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (1 ΕΠΙ -2)
-2 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (2 ΕΠΙ -2)
-8 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (2 ΕΠΙ -2)
-6 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (2 ΕΠΙ -2)
-4 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (0 ΕΠΙ -2)
-4 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (0 ΕΠΙ -2)
-2 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (0 ΕΠΙ -2)
0 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (1 ΕΠΙ -2)
-6 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (1 ΕΠΙ -2)
-4 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (1 ΕΠΙ -2)
-2 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (2 ΕΠΙ -2)
-8 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (2 ΕΠΙ -2)
-6 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (2 ΕΠΙ -2)
-4 ΣΥΝ (1 ΕΠΙ 1)
ΥΠΑΡΧΟΥΝ 1 ΛΥΣΕΙΣ
ΖΕΥΓΟΣ ΜΕ ΜΕΓΑΛΥΤΕΡΟ ΑΘΡΟΙΣΜΑ ΑΓΝΩΣΤΩΝ
1 0
2 0
3 0
ΠΟΣΟΣΤΟ ΛΥΣΕΩΝ ΜΕ ΕΝΑ ΑΓΝΩΣΤΟ ΙΣΟ ΜΕ ΜΗΔΕΝ:0.00
ΠΛΗΘΟΣ ΛΥΣΕΩΝ ΜΕ ΚΑΘΕ ΑΓΝΩΣΤΟ ΘΕΤΙΚΟ ΚΑΙ ΑΡΤΙΟ:0

Delta2000

Παράθεση από: bugman στις 02 Νοε 2017, 02:28:34 ΜΜ
Για το Μέγιστο:
Το πρώτο θα δώσει! Γιατί το δεύτερο ή θα είναι ίσο ή μικρότερο, οπότε δεν θα το δώσει, ή θα είναι μεγαλύτερο άρα θα το αλλάξει με το νέο μεγαλύτερο.
Οι πιθανοί συνδυασμοί σχετίζονται με τη λύση, και ο τρόπος που δουλεύει το πρόγραμμα "εκθέτει" όλες τις λύσεις στη σειρά των ΑΝ για τα επιμέρους ερωτήματα. Εφόσον δηλαδή δίνει τον αριθμό των σωστών λύσεων, σημαίνει ότι έχει γίνει έλεγχος σε όλες τις λύσεις βάσει του Μέγιστου. Η "πατέντα" είναι ότι δεν ξέρουμε ποιο είναι αρχικό μέγιστο, μπορεί να είναι το πρώτο! Οπότε παίρνουμε το πρώτο, όλα τα κάτω όρια, τα προσθέτουμε και προσθέτουμε ένα ακόμα -1, άρα η πρώτη τιμή ΜΕΓΙΣΤΟ είναι ψεύτικη, αλλά αδύνατον να μην φέρει αληθές στην πρώτη σύγκριση, έτσι η πρώτη σύγκριση (που γίνεται μόνο σε λύσεις) θα γεμίσει τον πίνακα μεγ[].
Για να τσεκάρει κανείς ένα πρόγραμμα πρέπει να το υποβάλει σε κάποια τεστ ώστε όλα τα μέρη του να "παίξουν" και να φανεί ότι δουλεύει.

Αρχικά ορίζω μεταβλητές με αρχικές τιμές, αλλά μου βγάζει λάθος ο διερμηνευτής, επειδή δεν δέχεται αρχικές τιμές (το είχα ξεχάσει)
Στην αρχική έκδοση του προγράμματος δεν έβαλα να ζητάει νούμερα, τα έγραψα απευθείας στο κώδικα! Και τα άλλαζα για να δω ότι όντως δουλεύει. Δυο φορές χτύπησε λάθος γιατί δεν είχα βάλει αρχικές τιμές σε μερικές μεταβλητές. Ξεχάστηκα ότι είχα βγάλει τις αρχικές τιμές από τις δηλώσεις! Εδώ θα έπαιζε η γλώσσα να μπορεί στη δήλωση να δίνει και αρχική τιμή!

Στο τελικό άφησα τα μηνύματα...ελέγχου!
Αν βγάλεις το ! εκεί που δείχνει τα βήματα δες τι θα πάρεις:
ΠΟΣΟΙ ΑΓΝΩΣΤΟΙ;
3
ΣΥΝΤΕΛΕΣΤΗ ΚΑΙ ΚΑΤΩ ΚΑΙ ΑΝΩ ΟΡΙΟ ΓΙΑ ΤΟΝ ΑΓΝΩΣΤΟ 1
2
-2
0
ΣΥΝΤΕΛΕΣΤΗ ΚΑΙ ΚΑΤΩ ΚΑΙ ΑΝΩ ΟΡΙΟ ΓΙΑ ΤΟΝ ΑΓΝΩΣΤΟ 2
-2
0
2
ΣΥΝΤΕΛΕΣΤΗ ΚΑΙ ΚΑΤΩ ΚΑΙ ΑΝΩ ΟΡΙΟ ΓΙΑ ΤΟΝ ΑΓΝΩΣΤΟ 3
1
-1
1
ΔΩΣΕ ΤΙΜΗ ΕΛΕΓΧΟΥ ΑΘΡΟΙΣΜΑΤΟΣ
0
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (0 ΕΠΙ -2)
-4 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (0 ΕΠΙ -2)
-2 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (0 ΕΠΙ -2)
0 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (1 ΕΠΙ -2)
-6 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (1 ΕΠΙ -2)
-4 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (1 ΕΠΙ -2)
-2 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (2 ΕΠΙ -2)
-8 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (2 ΕΠΙ -2)
-6 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (2 ΕΠΙ -2)
-4 ΣΥΝ (-1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (0 ΕΠΙ -2)
-4 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (0 ΕΠΙ -2)
-2 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (0 ΕΠΙ -2)
0 ΣΥΝ (0 ΕΠΙ 1)
Ζεύγος Λύσεων
1 0
2 0
3 0
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (1 ΕΠΙ -2)
-6 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (1 ΕΠΙ -2)
-4 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (1 ΕΠΙ -2)
-2 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (2 ΕΠΙ -2)
-8 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (2 ΕΠΙ -2)
-6 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (2 ΕΠΙ -2)
-4 ΣΥΝ (0 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (0 ΕΠΙ -2)
-4 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (0 ΕΠΙ -2)
-2 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (0 ΕΠΙ -2)
0 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (1 ΕΠΙ -2)
-6 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (1 ΕΠΙ -2)
-4 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (1 ΕΠΙ -2)
-2 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-2 ΕΠΙ 2)
-4 ΣΥΝ (2 ΕΠΙ -2)
-8 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (-1 ΕΠΙ 2)
-2 ΣΥΝ (2 ΕΠΙ -2)
-6 ΣΥΝ (1 ΕΠΙ 1)
0 ΣΥΝ (0 ΕΠΙ 2)
0 ΣΥΝ (2 ΕΠΙ -2)
-4 ΣΥΝ (1 ΕΠΙ 1)
ΥΠΑΡΧΟΥΝ 1 ΛΥΣΕΙΣ
ΖΕΥΓΟΣ ΜΕ ΜΕΓΑΛΥΤΕΡΟ ΑΘΡΟΙΣΜΑ ΑΓΝΩΣΤΩΝ
1 0
2 0
3 0
ΠΟΣΟΣΤΟ ΛΥΣΕΩΝ ΜΕ ΕΝΑ ΑΓΝΩΣΤΟ ΙΣΟ ΜΕ ΜΗΔΕΝ:0.00
ΠΛΗΘΟΣ ΛΥΣΕΩΝ ΜΕ ΚΑΘΕ ΑΓΝΩΣΤΟ ΘΕΤΙΚΟ ΚΑΙ ΑΡΤΙΟ:0

Άνοιξε την λύση μου και την λύση σου. Η σειρά ελέγχου των συνδιασμών μου είναι σαν οι μεταβλητές να ήταν σε εμφωλευμένους βρόχους ενώ η δικιά σου σειρά έχει διαφορετική συμπεριφορά. Αν το πάμε με την λογική των πανελληνίων το πρόγραμμα θα αποθήκευε την 1η max τιμή που θα έδιναν οι εμφωλευμένοι βρόχοι ενώ σε σένα δεν κάνει κάτι τέτοιο βέβαια αυτό είναι μία ασήμαντη λεπτομέρεια. Πχ τρέξε τις λύσεις μας για την εξίσωση 2x+2y=10 για χ απο 0 εως 10 και y απο 0 ως 10. Στην δικια μου θα ειναι το ζευγος 0 5 ενω στη δικιά σου το ζεύγος 5 0 που θα ήταν η τελευταία σε εμφωλευμένους βρόχους ;) Απλως το θεωρώ λίγο λάθος γιατί στην αρχή του προγράμματος ο χρήστης δηλώνει απο πού θέλει να ξεκινάει ο έλεγχος για κάθε μεταβλητή. Με μικρή παρέμβαση στον αλγόριθμο σου όμως λύνεται και αυτό χωρίς να αλλάξει η λογική σου.

bugman

Αντιλαμβάνομαι πώς το βλέπεις το πράγμα. Όταν λέει το μέγιστο στο άθροισμα δεν αναφέρεται στο συγκεκριμένο ζεύγος που θα το βγάλει (το λέμε ζεύγος, γιατί δέχτηκα την ορολογία της άσκησης, αλλά θα το λέγαμε "σύνολο τιμών αγνώστων", αλλά βαρύ φαίνεται), αλλά βάσει του συγκεκριμένου τρόπου που μετράμε τις αλλαγές. Θα μπορούσα πχ στο δικό μου πρόγραμμα να μετράω από το τελευταίο στο πρώτο, οπότε το Κ να ξεκινάει από το Ν και εκεί που έκανα έλεγχο για το Κ>Ν τώρα θα κάνω τον έλεγχο Κ<1.
Πράγματι υπάρχουν δυο λύσεις, και αφού έφτιαξες την άσκηση πρέπει να ξεκαθαρίσεις για ποιο γινόμενο θα είναι ο "άγνωστος" ο περισσότερος φωλιασμένος.
Στη δική μου λύση είναι ο πρώτος από δεξιά (άρα πάει από Κ=1 προς Κ=Ν+1), αλλά όπως έγραψα πριν μπορεί να πάει και από αριστερά (από Κ=Ν προς Κ=1-1=0), ή θα μπορούσε να παίξει ένας πίνακας Μ[] όπου το Μ[Κ] θα έδειχνε το "τελικό_κ", και εδώ απλά το Κ ξεκινάει με 1 και τερματίζει στο Ν+1 (η έξοδος), άρα μπορούμε να έχουμε με αλλαγή σειράς με το Μ[] και όσους συνδυασμούς δίνουν Ν στοιχεία, δηλαδή Ν! (πχ το Ν=3 δίνει 6 συνδυασμούς).  Μπορούμε να υποθέσουμε ότι με το "πρώτο" εννοεί για τον συνδυασμό που επιλέγουμε! :)

Delta2000

Παράθεση από: bugman στις 02 Νοε 2017, 07:11:15 ΜΜ
Αντιλαμβάνομαι πώς το βλέπεις το πράγμα. Όταν λέει το μέγιστο στο άθροισμα δεν αναφέρεται στο συγκεκριμένο ζεύγος που θα το βγάλει (το λέμε ζεύγος, γιατί δέχτηκα την ορολογία της άσκησης, αλλά θα το λέγαμε "σύνολο τιμών αγνώστων", αλλά βαρύ φαίνεται), αλλά βάσει του συγκεκριμένου τρόπου που μετράμε τις αλλαγές. Θα μπορούσα πχ στο δικό μου πρόγραμμα να μετράω από το τελευταίο στο πρώτο, οπότε το Κ να ξεκινάει από το Ν και εκεί που έκανα έλεγχο για το Κ>Ν τώρα θα κάνω τον έλεγχο Κ<1.
Πράγματι υπάρχουν δυο λύσεις, και αφού έφτιαξες την άσκηση πρέπει να ξεκαθαρίσεις για ποιο γινόμενο θα είναι ο "άγνωστος" ο περισσότερος φωλιασμένος.
Στη δική μου λύση είναι ο πρώτος από δεξιά (άρα πάει από Κ=1 προς Κ=Ν+1), αλλά όπως έγραψα πριν μπορεί να πάει και από αριστερά (από Κ=Ν προς Κ=1-1=0), ή θα μπορούσε να παίξει ένας πίνακας Μ[] όπου το Μ[Κ] θα έδειχνε το "τελικό_κ", και εδώ απλά το Κ ξεκινάει με 1 και τερματίζει στο Ν+1 (η έξοδος), άρα μπορούμε να έχουμε με αλλαγή σειράς με το Μ[] και όσους συνδυασμούς δίνουν Ν στοιχεία, δηλαδή Ν! (πχ το Ν=3 δίνει 6 συνδυασμούς).  Μπορούμε να υποθέσουμε ότι με το "πρώτο" εννοεί για τον συνδυασμό που επιλέγουμε! :)

Όταν τροποποιούσα την εκφώνηση της άσκησης δεν σκέφτηκα ότι θα μπορούσαν να ελεγχθούν όλοι οι συνδιασμοί με διαφορετική σειρά απ'ότι θα ήταν σαν να ήταν σε φωλιές βρόχων. Και φυσικά ούτε αυτοί στις πανελλήνιες περίμεναν κάποια λύση σαν τις δικές μας αφού τα δεδομένα εκεί είναι πολύ συγκεκριμένα. Και στην τελική λίγη σημασία έχει εγώ θα αλλάξω και την εκφώνηση στο αρχείο μου και θα βάλω ένα ζεύγος.

gbougioukas

#11
Ενδιαφέρων ο προβληματισμός με τις διοφαντικές εξισώσεις. Να προτείνω μία παραλλαγή:

Κατασκευάστε έναν αλγόριθμο ο οποίος να βρίσκει μια λύση σε μια δεδομένη διοφαντική εξίσωση, θεωρώντας ότι δεν υπάρχουν φράγματα στις τιμές που παίρνουν οι μεταβλητές (δηλαδή οι δυνατές τιμές κάθε μεταβλητής είναι όλοι οι ακέραιοι (ℤ)), με την υπόθεση όμως ότι υπάρχει λύση.
Γιώργος Μπουγιούκας
Computer Science (BSc), Bioinformatics & Neuroinformatics (MSc)
https://gbougioukas.wordpress.com/
https://apothesis.eap.gr/handle/repo/54953

bugman

Έστω η 10*[4]+(-5)*[4]+(-100)*[2]=-180, όπου οι λύσεις για τους άγνωστους είναι τα 4,4,2 στο 10*Α1-5*Α2-100*Α3=-180
Επιπλέον όμως λύση είναι και τα 22, 20,3  επειδή 10*22-5*20-100*3=-180
Πώς θα γίνει να βγάλουμε μια λύση κοινή για κάθε αλγόριθμο που ξεκινάει μόνο με την γνώση του 10*Α1-5*Α2-100*Α3 χωρίς να οριστεί από που θα ξεκινήσουν οι άγνωστοι και προς τα που θα πάνε (θα αυξάνονται ή θα μειώνονται), μάλλον αδύνατον!

gbougioukas

@bugman

Έχω γράψει έναν ακέραιο αριθμό σ' ένα χαρτί. Αν με ρωτήσεις "είναι ο α;" (όσες φορές θέλεις), όπου α οποιαδήποτε ακέραια σταθερά, θα σου απαντήσω αλήθεια χωρίς να σε κοροϊδέψω NAI ή ΟΧΙ. Μπορείς να κατασκευάσεις έναν αλγόριθμο ο οποίος θα βρίσκει τον αριθμό που έχω γράψει;
Γιώργος Μπουγιούκας
Computer Science (BSc), Bioinformatics & Neuroinformatics (MSc)
https://gbougioukas.wordpress.com/
https://apothesis.eap.gr/handle/repo/54953

bugman

Δεν μπορώ. Γιατί μπορώ να κάνω άπειρες ερωτήσεις!  Πρέπει να ξέρω αν είναι μικρότερο ή μεγαλύτερο...από το στόχο. Δηλαδή πρέπει να έχω κάτι να συγκλίνω. Μια Newton–Raphson μέθοδος, στην αριθμητική ανάλυση αν πρόκειται για συνάρτηση.