Αποστολέας Θέμα: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές  (Αναγνώστηκε 2446 φορές)

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 539
  • There can be only one...may it be AEPP.
Μπορεί να δημιουργηθεί τμήμα κώδικα που να δέχεται έναν πίνακα Ν θέσεων, με εισαγόμενες τιμές 0 και 1 σε ανακατωμένες θέσεις και με ένα πέρασμα των στοιχείων του πίνακα να τοποθετούνται τα 0 στις περιττές θέσεις και οι άσσοι στις άρτιες θέσεις του πίνακα;
Αν τελειώσουν οι άσσοι ή τα μηδενικά, από εκεί και έπειτα να εισάγονται μόνο οι τιμές που περισσεύουν;
Υπάρχει αυτή η δυνατότητα;
Για παράδειγμα έστω τα στοιχεία
01100001000100101010
σε πίνακα 15 θέσεων.
Με μια προσπέλαση η τελική κατάσταση των στοιχείων να είναι
01010101010101000000
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

petrosp13

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 2199
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #1 στις: 22 Φεβ 2014, 12:15:08 μμ »
Με μια πρόχειρη ματιά

Για i από 1 μέχρι Ν-1
    Αν (Α[ι]=imod2) τότε
         βρέθηκε <-- ψευδής
         κ <-- i + 1
         Όσο (κ <= Ν) και (βρέθηκε=ψευδής) επανάλαβε
               Αν (Α[k] <> A(i)) και (Α[k] = kmod2) τότε
                     temp <-- A[k]
                     A[k] <-- A(i)
                     A(i) <-- temp
                     βρέθηκε <-- αληθής
                Αλλιώς
                     κ <-- κ+1
                Τέλος_Αν
        Τέλος_Επανάληψης
Τέλος_Επανάληψης

Δεν το έλεγξα, στα γρήγορα γιατί είμαι από κινητό
               
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

apoldem

  • Βετεράνος
  • ****
  • Μηνύματα: 86
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #2 στις: 22 Φεβ 2014, 12:34:38 μμ »
1) Μετράς πόσα είναι τα 0 (έστω κ) και πόσα τα 1 (έστω λ)
2) Αν κ<λ τότε γεμίζεις τις πρώτες κ περιττές θέσεις με 0, αλλιώς τις πρώτες λ άρτιες θέσεις με 1 (εδώ πιθανόν να μπορεί να γραφεί ένας όμορφος κώδικας που να μην επαναλαμβάνει τα ίδια πράγματα για 0 και 1, ίσως με χρήση διαδικασίας)
3) Ότι απέμεινε το γεμίζεις με το άλλο ψηφίο που δεν χρησιμοποιήθηκε στο προηγούμενο βήμα.

Γενικά, κάπως δύσκολο το βρίσκω για θέμα.

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3103
  • to Iterate is human to Recurse divine
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #3 στις: 22 Φεβ 2014, 03:41:56 μμ »
Προφανώς όταν λέει με ένα πέρασμα εννοεί αλγόριθμο να έχει τουλάχιστον πολυπλοκότητα Ο(Ν), άρα αλγόριθμοι με Ο(Ν^2) δεν μπορούν να γίνουν αποδεκτοί.
Το θέμα είναι αν εννοεί και μόνο ένα πέρασμα από κάθε στοιχείο, δηλαδή δεν του αρκεί το Ο(Ν) αλλά θέλει και ένα μόνο πέρασμα από κάθε στοιχείο.
(Προσοχή!!! Μπορεί να γίνει με μια επανάληψη αλλά να μην είναι ουσιαστικά ένα πέρασμα)

Παρακάτω δίνω έναν αλγόριθμο ο οποίος  είναι ότι πιο γρήγορο έχω σκεφτεί μέχρι στιγμής, μετράει πόσα είναι τα 0,1 και τα βάζει στον πίνακα,
αλλά δεν χρησιμοποιώ καμία σύγκριση εντός επανάληψης και από εκεί και πέρα έχει μόνο προσθέσεις.
Το μόνο πρόβλημα είναι ότι δεν τα κάνω όλα σε ένα πέρασμα αλλά σε 2 (δεν λέω σε τρία γιατί τα 2 παρακάτω περάσματα γίνονται σε ξεχωριστά στοιχεία του πίνακα άρα δεν μπορούν να θεωρούν ως 2 περάσματα)

Κώδικας: Pascal
  1. μ[0] <-- μ[1] <-- 0
  2. Για ι από 1 μέχρι Ν
  3.        μ[Α[ι]] <-- μ[Α[ι]] + 1
  4. Τέλος_Επανάληψης
  5.  
  6. Αν μ[0][1] Τότε
  7.    τιμή <-- 0
  8. αλλιώς
  9.    τιμή <-- 1
  10.  
  11. κ <-- 1 + τιμή
  12. Για ι από 1 μέχρι μ[τιμή]
  13.      Α[κ] <-- τιμή
  14.      κ <-- κ + 2    
  15. Τέλος_Επανάληψης
  16.  
  17. θέση <-- κ
  18. τιμή <-- 1 - τιμή
  19. Για κ από θέση μέχρι Ν με βήμα 2
  20.      Α[κ] <-- τιμή
  21. Τέλος_Επανάληψης
  22.  
  23. κ <-- 1+τιμή
  24. Για ι από 1 μέχρι Ν με βήμα 2
  25.      Α[κ] <-- τιμή
  26.      κ <-- κ + 2    
  27. Τέλος_Επανάληψης
  28.  
         

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

Κώδικας: Pascal
  1. odd <-- 1
  2. even <-- 2
  3. Οσο  odd<N και even<N Επανάλαβε
  4.    Αν ( Α[odd]==1 και Α[even]==0 ) Τότε
  5.         A[odd] <-- 0
  6.         A[even] <-- 1
  7.         odd <-- odd + 2
  8.         even <-- even + 2
  9.    Αλλιώς
  10.          Αν A[odd]==0 Τότε odd <-- odd + 2
  11.          Αν A[even]==1 Τότε even <-- even + 2
  12.    Τέλος_αν
  13. Τέλος_Επανάληψης
  14.  

Το θέμα τώρα είναι πως θα μαζέψεις τα σωστά 0,1 στην αρχή του πίνακα.
Αυτό είναι πολύ καλή άσκηση που αξίζει να ασχοληθεί κανείς. Η ιδέα εδώ είναι η ίδια που ισχύει και για την παρακάτω άσκηση:
   Δεδομένου ενός πίνακα Α[Ν] που περιέχει μόνο 0 και 1 να διαχωρίσετε τα 0 από τα 1 έτσι ώστε όλα τα 0 να είναι πριν από όλα τα 1, με ένα μόνο πέρασμα
Την άσκηση αυτή μπορεί να την δείτε και με θετικούς και αρνητικούς αριθμούς. Το σκεπτικό είναι το ίδιο.
Μόνο που στην δική μας περίπτωση είναι πιο πολύπλοκο.
Το αφήνω μήπως θέλει να ασχοληθεί κανείς, γιατι έχει πολύ ενδιαφέρον
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

sstergou

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 983
  • Program or be Programmed
    • pseudoglossa.gr
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #4 στις: 23 Φεβ 2014, 05:43:16 μμ »
Δεδομένου ενός πίνακα Α[Ν] που περιέχει μόνο 0 και 1 να διαχωρίσετε τα 0 από τα 1 έτσι ώστε όλα τα 0 να είναι πριν από όλα τα 1, με ένα μόνο πέρασμα
Κώδικας: Text
  1. i ← 1
  2. j ← N
  3. Όσο i < j επανάλαβε
  4.         Όσο Α[i] = 0 και i < j επανάλαβε
  5.                 i ← i + 1
  6.         Τέλος_επανάληψης
  7.         Όσο Α[j] = 1 και i < j επανάλαβε
  8.                 j ← j - 1
  9.         Τέλος_επανάληψης
  10.         Αντιμετάθεσε α[i], α[j]
  11. τέλος_επανάληψης
  12.  
  13.  
« Τελευταία τροποποίηση: 24 Φεβ 2014, 09:45:17 πμ από sstergou »
Στάθης Στέργου - sstergouATgmailDOTcom - http://www.pseudoglossa.gr

ssimaiof

  • Πληροφορικοί Δυτικής Μακεδονίας
  • *
  • Μηνύματα: 23
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #5 στις: 23 Φεβ 2014, 10:44:53 μμ »
Δείτε μια ακόμη ιδέα. Δεν το έλεγξα διεξοδικά, αλλά πρέπει να δουλεύει !

Κώδικας: [Επιλογή]
Αλγόριθμος ΜηδένΈνα
Δεδομένα // Ν, Α //
δ0 ← 0
δ1 ← 0
Για i από 1 μέχρι Ν
  Αν Α[i] = 0 τότε
    δ0 ← δ0 + 1
    Αν 2*δ0 - 1 < i τότε
      Αντιμετάθεσε Α[i], Α[2*δ0 - 1]
    Τέλος_αν
  αλλιώς
    δ1 ← δ1 + 1
    Αν 2*δ1 < i τότε
      Αντιμετάθεσε Α[i], Α[2*δ1]
    Τέλος_αν
  Τέλος_αν
Τέλος_επανάληψης
Για i από 1 μέχρι Ν
  Εμφάνισε Α[i], "  "
Τέλος_επανάληψης
Τέλος ΜηδένΈνα

sstergou

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 983
  • Program or be Programmed
    • pseudoglossa.gr
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #6 στις: 24 Φεβ 2014, 09:18:55 πμ »
Φοβερή λύση, συγχαρητήρια!
Στάθης Στέργου - sstergouATgmailDOTcom - http://www.pseudoglossa.gr

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3103
  • to Iterate is human to Recurse divine
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #7 στις: 24 Φεβ 2014, 11:47:53 πμ »
Πράγματι φοβερή λύση.
Η χρήση του Αντιμετάθεσε σου εξασφαλίζει ότι δεν χάνεται πληροφορία.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

apoldem

  • Βετεράνος
  • ****
  • Μηνύματα: 86
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #8 στις: 25 Φεβ 2014, 08:06:58 πμ »
@ssimaiof, respect! ο κώδικας σου είναι απ' αυτούς που λες, μα πως το σκέφτηκε;

@nikolasmer, μόνος σου τις σκέφτεσαι αυτές τις ασκήσεις ή τις ξεσηκώνεις από  κάποιο βιβλίο;

nikolasmer

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 539
  • There can be only one...may it be AEPP.
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #9 στις: 25 Φεβ 2014, 10:18:58 πμ »
Έχουμε κουβεντιάσει την άσκηση που μπήκε περισυνό θέμα Β με τις τιμές Αληθής και Ψευδής που έπρεπε να τις αναδιατάξεις χωρίς ταξινόμηση. Οπότε βλέπωντας και τις απαντήσεις των μαθητών σε ενα καλοκαιρινό thread, που έδωσαν στις πανελλήνιες, ήθελα να βάλω στα παιδιά κάτι πιο δύσκολο, για να ασχοληθούν, όχι με λογικές τιμές αλλά με 0 και 1. Δεν ήθελα να τους πάει κατευθείαν το μυαλό εκεί. Έτσι σκέφτηκα αν μπορεί να γίνει αυτή η ασκησούλα. Επίσης παρατήρησα, μετά απο πολύ ώρα σκέψης, ότι το μυαλουδάκι μου δεν μπορούσε να κατεβάσει τίποτα απολύτως οπότε την ανέβασα για να δώ αν μπορεί να λυθεί, με ενα προφανώς πέρασμα των στοιχείων.
Ήθελα να μπορεί να επεκταθεί και για λογικές τιμές η λύση της άσκησης φυσικά, πράγμα που νομίζω οτι η λύση του evry δεν το πετυχαίνει γιατί χρησιμοποιεί τα στοιχεία του πίνακα ως δείκτες.

Πραγματικά όλες οι παραπάνω λύσεις είναι φοβερές.

Παράθεση
Επιτέλους ανακάλυψα οτι όλα τα πράγματα είχαν ονόματα. Μετά άρχισα να διερωτώμαι γιατί είχαν τα ονόματα που είχαν. Όταν τελικά εγκατέλειψα την προσπάθεια αυτή, τότε άρχισα να αναγνωρίζω τον κόσμο και να προσπαθώ να επικοινωνήσω με τους άλλους με τις λέξεις που άκουγα και είχα μάθει απλώς να ξεχωρίζω
Ιωάννης Κάβουρας

(Να είναι καλά εκεί που βρίσκεται. Τον ευχαριστώ)

Αφού με παίρνει μια ώρα να καταλάβω τον κάθε έναν από τους παραπάνω κώδικες, μάλλον  ακόμα βρίσκομαι στο στάδιο που ανακαλύπτω πως όλα τα πράγματα έχουν ονόματα. :-[
Απ' τα τσακάλια δεν γλυτώνεις μ'ευχές ή παρακάλια
(Κ. Βάρναλης)

Μερεντίτης Νικόλαος
Καθηγητής Πληροφορικής - Φροντιστής

apoldem

  • Βετεράνος
  • ****
  • Μηνύματα: 86
Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
« Απάντηση #10 στις: 25 Φεβ 2014, 02:01:16 μμ »
Ακριβώς αυτό είναι το ωραίο με την λύση του evry. Ότι χρησιμοποιεί την τιμή του πίνακα ως δείκτη και έτσι κάνει οικονομία σε δύο θέσεις μνήμης!(και από την μύγα ξύγκι). Τροποποιείται όμως πολύ εύκολα, και για την περίπτωση που δεν έχεις 0 και 1.