Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω ένα πρόβλημα με τον παρακάτω κώδικα. Σκοπός είναι να βρεθεί το όνομα μου μέσα στο κείμενο και να βάλει τα γράμματα σε ένα array.
 

/*jshint multistr:true */
var text = "iojaioefhoiajefoijfDaDiRaaosdjoajdoiasjdojoajsdlkjasdlkjadkljasdl;askjDaDiRaoaisdjoaijsopidjaosdjaosdijaodijaoidjasodijoasijda";
var myName = "DaDiRa";
var hits = [];
for (i=0; i < text.length; i++) {
    if (text[i] === myName[0]) {
        for (j = i; j < myName.length; j++) {
            hits.push(j)
        }
    }
}

Ξέρω ότι έχω λάθος μέσα στο 2ο for loop, αλλά δεν μπορώ να καταλάβω πως να το διορθώσω. Θέλω το j να είναι μικρότερο από το μήκος του ονόματός μου, έτσι ώστε να σταματάει να κάνει push τα γράμματα σε array όταν τελειώσει, αλλά οι οδηγίες μου λένε "Your loop should stop when it hits the value of the first iterator (say, i) plus the length of your myNamevariable."

Επίσης, είναι σωστό που έβαλα το να κάνει push to j; Αφού θέλω να βάζει σε array όλα τα γράμματα, και το j είναι το i που εκείνη τη στιγμή έχει τιμή το "D";

Δημοσ.

Hint: Εφόσον θα ελέγχεις αν ταιριάζουν τα γράμματα ένα-ένα (που δεν είναι ούτε ο βολικότερος ούτε ο γρηγορότερος τρόπος, αλλά απ' ότι φαίνεται πρόκειται για άσκηση που συγκεκριμένα το θέλει έτσι), θα πρέπει αναγκαστικά να έχεις κάπου ένα μετρητή από το 0 μέχρι το myName.length - 1 με τον οποίο θα βλέπεις αν έχουν ταιριάξει όλα τα γράμματα (και άρα βρήκες αυτό που ψάχνεις).

 

Δεν καταλαβαίνω με τίποτα αυτό που ζητάει να κάνεις με το hits. Πρώτον είναι προφανές ποιό θα είναι το τελικό περιεχόμενο άρα δεν υπάρχει κανένας λόγος να το κάνεις γράμμα-γράμμα, και δεύτερον δε βλέπω τη διδακτική αξία του να γράψει κανείς hits.push.

Δημοσ.

Αυτή είναι δυστυχώς μία από τις όχι και τόσο πετυχημένες ασκήσεις στο JavaScript course του Codecademy.

 

Για να την «περάσεις», θα πρέπει να αλλάξεις τη συνθήκη τερματισμού του εσωτερικού for loop σε j < i + myName.length;

Δημοσ.

Hint: Εφόσον θα ελέγχεις αν ταιριάζουν τα γράμματα ένα-ένα (που δεν είναι ούτε ο βολικότερος ούτε ο γρηγορότερος τρόπος, αλλά απ' ότι φαίνεται πρόκειται για άσκηση που συγκεκριμένα το θέλει έτσι), θα πρέπει αναγκαστικά να έχεις κάπου ένα μετρητή από το 0 μέχρι το myName.length - 1 με τον οποίο θα βλέπεις αν έχουν ταιριάξει όλα τα γράμματα (και άρα βρήκες αυτό που ψάχνεις).

 

Δεν καταλαβαίνω με τίποτα αυτό που ζητάει να κάνεις με το hits. Πρώτον είναι προφανές ποιό θα είναι το τελικό περιεχόμενο άρα δεν υπάρχει κανένας λόγος να το κάνεις γράμμα-γράμμα, και δεύτερον δε βλέπω τη διδακτική αξία του να γράψει κανείς hits.push.

Τι να σου πω, και εγώ τις οδηγίες ακολουθώ. Πάντως βρήκα τη λύση.

Αυτή είναι δυστυχώς μία από τις όχι και τόσο πετυχημένες ασκήσεις στο JavaScript course του Codecademy.

 

Για να την «περάσεις», θα πρέπει να αλλάξεις τη συνθήκη τερματισμού του εσωτερικού for loop σε j < i + myName.length;

Η αλήθεια είναι ότι με πέταξε κατευθείαν στα βαθειά, χωρίς πολλές διευκρινήσεις, πράγμα που δεν συνηθίζει γενικά. Αυτό το έκανα, αλλά μπορείς να μου εξηγήσεις γιατί γίνεται αυτή η πρόσθεση; Δεν θέλουμε το 2ο loop να σταματάει όταν τελειώσει με το όνομα μου;

 

Διόρθωσα και μερικά λαθάκια που είχα και ο τελικός (και σωστός) κώδικας είναι ο παρακάτω, για όποιον κολλήσει στο μέλλον:

 

/*jshint multistr:true */
var text = "iojaioefhoiajefoijfDaDiRaaosdjoajdoiasjdojoajsdlkjasdlkjadkljasdl;askjDaDiRaoaisdjoaijsopidjaosdjaosdijaodijaoidjasodijoasijda";
var myName = "DaDiRa";
var hits = [];
for (i=0; i < text.length; i++) {
    if (text[i] === "D") {
        for (j = i; j < (myName.length + i); j++) {
            hits.push(text[j]);
        }
    }
}
if (hits.length !== 0) {
    console.log(hits);
} else {
    console.log("Your name wasn't found!");
}
Δημοσ.

Αυτός δεν είναι σωστός κώδικας γιατί δε λαμβάνεις υπόψη την περίπτωση όπου υπάρχει μέσα στο text ένα prefix του ονόματός σου αλλά όχι ολόκληρο το όνομα:

 

var text = "-----DaDi----";
Επίσης δε λαμβάνεις υπόψη την περίπτωση όπου το όνομα ή prefixes αυτού εμφανίζονται παραπάνω από μία φορά:

 

var text = "DDDDDDDDDDDDDDD";
Ούτε και την περίπτωση όπου εμφανίζεται ένα prefix του ονόματός σου στο τέλος της εισόδου:

 

var text = "-----DaDi";
Δημοσ.

Αυτό το έκανα, αλλά μπορείς να μου εξηγήσεις γιατί γίνεται αυτή η πρόσθεση; Δεν θέλουμε το 2ο loop να σταματάει όταν τελειώσει με το όνομα μου;

Όπως έγραψα, η άσκηση είναι κακογραμμένη. Αυτό που σου ζητάει να κάνεις στον τίτλο της δεν έχει καμία σχέση με αυτό που περιμένει να κάνεις για να περάσεις την άσκηση.

 

Αν θες όμως, μπορούμε να συζητήσουμε για το πώς θα έπρεπε να λύνεται στη γενική μορφή του το πρόβλημα της αναζήτησης string μέσα σε string, σε Javascript.

Δημοσ.

Αυτός δεν είναι σωστός κώδικας γιατί δε λαμβάνεις υπόψη την περίπτωση όπου υπάρχει μέσα στο text ένα prefix του ονόματός σου αλλά όχι ολόκληρο το όνομα:

 

var text = "-----DaDi----";
Επίσης δε λαμβάνεις υπόψη την περίπτωση όπου το όνομα ή prefixes αυτού εμφανίζονται παραπάνω από μία φορά:

 

var text = "DDDDDDDDDDDDDDD";
Ούτε και την περίπτωση όπου εμφανίζεται ένα prefix του ονόματός σου στο τέλος της εισόδου:

 

var text = "-----DaDi";

Όταν λέω σωστό, δεν εννοώ έτοιμο να τρέξει σε κάθε περίπτωση. Η προϋπόθεση της άσκησης ήταν πως το κείμενο περιέχει μόνο μικρά και το όνομά μου αρχίζει από κεφαλαίο, έτσι ώστε να παραλειφθεί τέτοιου είδους μπέρδεμα. Δεν ξέρω αν είναι προγραμματιστικά σωστό, πάντως κάνει για να περάσεις το μάθημα...

Όπως έγραψα, η άσκηση είναι κακογραμμένη. Αυτό που σου ζητάει να κάνεις στον τίτλο της δεν έχει καμία σχέση με αυτό που περιμένει να κάνεις για να περάσεις την άσκηση.

 

Αν θες όμως, μπορούμε να συζητήσουμε για το πώς θα έπρεπε να λύνεται στη γενική μορφή του το πρόβλημα της αναζήτησης string μέσα σε string, σε Javascript.

Όχι, προς το παρών για να μην μπερδευτώ και με πράγματα που ίσως ακόμα δεν έχω μάθει. :P

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...