Διαδρομές
/
JavaScript
JavaScript
/
Ασκήσεις
/
Τυχεροί Αριθμοί
Τυχεροί Αριθμοί

Τυχεροί Αριθμοί

Άσκηση εκμάθησης

Εισαγωγή

Στη JavaScript, οι τιμές μπορεί να είναι διαφορετικών τύπων. Την αλλαγή του τύπου μιας μεταβλητής μπορείς να την κάνεις με ρητή μετατροπή τύπου. Εκτός από αυτό, η JavaScript εκτελεί και εξαναγκασμό τύπου (έμμεση μετατροπή τύπου) όταν το πλαίσιο το απαιτεί.

Μετατροπή τύπου

Η JavaScript δεν έχει κάποια δομή για να κάνεις cast μια τιμή σε (διαφορετικό) τύπο, όπως πολλές άλλες γλώσσες, αλλά μπορείς να χρησιμοποιήσεις αντ' αυτού κάποιες ενσωματωμένες βοηθητικές συναρτήσεις. Πιο συγκεκριμένα, οι Boolean, Number και String μπορούν να χρησιμοποιηθούν ως συναρτήσεις για τη μετατροπή μιας τιμής στον αντίστοιχο τύπο.

Μετατροπή σε Boolean (τιμές truthy/falsy)

Με το Boolean(value) μπορείς να μετατρέψεις οποιαδήποτε τιμή σε boolean. Υπάρχει ένα συγκεκριμένο σύνολο τιμών, οι λεγόμενες falsy τιμές, που μετατρέπονται σε false. Το πιο σημαντικό είναι ότι οι false, 0, η κενή συμβολοσειρά, το null, το undefined και το NaN είναι falsy.

Για όλες τις άλλες τιμές, το Boolean επιστρέφει true. Αυτές οι τιμές ονομάζονται truthy.

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

Σημείωσε ότι, εξαιτίας των κανόνων που περιγράφηκαν, τα '0', 'false', [] και {} είναι truthy στη JavaScript.

Μετατροπή σε αριθμό

Το Number(value) μπορεί να χρησιμοποιηθεί για τη μετατροπή μιας τιμής σε αριθμό. Τα κενά στην αρχή και στο τέλος μιας συμβολοσειράς αγνοούνται και μια κενή συμβολοσειρά μετατρέπεται σε 0. Αν προσπαθήσεις να μετατρέψεις μια μη πρωτόγονη τιμή ή μια συμβολοσειρά που δεν αντιπροσωπεύει αριθμό, το αποτέλεσμα είναι NaN (Not-A-Number).

Number('  -12.34  ');
// => -12.34

Number('1,2');
// => NaN

Number('');
// => 0

Number({ num: 123 });
// => NaN

Μετατροπή σε συμβολοσειρά

Με το String(value) μπορείς να μετατρέψεις μια τιμή σε συμβολοσειρά. Για τις πρωτόγονες τιμές, το αποτέλεσμα είναι αυτό που θα περίμενες.

String(12.34);
// => '12.34'

String(false);
// => 'false'

String(null);
// => 'null'

String(undefined);
// => 'undefined'

Για τους πίνακες, η συνάρτηση String εφαρμόζει τη μετατροπή σε συμβολοσειρά σε κάθε στοιχείο και ενώνει τα αποτελέσματα με κόμμα. Μπορείς επίσης να εφαρμόσεις ο ίδιος τη μέθοδο join, π.χ. για να προσαρμόσεις το διαχωριστικό. Σημείωσε ότι σε αυτές τις περιπτώσεις τα null και undefined μετατρέπονται σε κενή συμβολοσειρά.

String([42, null, true, 'abc']);
// => '42,,true,abc'

Για τα αντικείμενα, από προεπιλογή το String επιστρέφει ένα κείμενο που δεν σε βοηθάει καθόλου.

String({ key: 'value' });
// => '[object Object]'

Εξαναγκασμός τύπου

Σε ορισμένα πλαίσια, η JavaScript μετατρέπει αυτόματα μια τιμή σε άλλον τύπο δεδομένων προτού αξιολογήσει κάποια εντολή. Αυτή η έμμεση μετατροπή ονομάζεται εξαναγκασμός τύπου.

Πλαίσιο boolean

Όταν μια τιμή που δεν είναι boolean χρησιμοποιείται σε πλαίσιο boolean, η JavaScript εφαρμόζει τους ίδιους κανόνες με τη συνάρτηση Boolean για να μετατρέψει την τιμή έμμεσα.

Ο εξαναγκασμός σε boolean εμφανίζεται συνήθως:

  • στη συνθήκη μιας εντολής if
  • στον πρώτο τελεστέο του τριαδικού τελεστή ?
  • στον τελεστέο του λογικού τελεστή NOT !
  • στους τελεστέους των λογικών τελεστών AND && και OR || (το αποτέλεσμα της έκφρασης είναι ένας από τους τελεστέους, όχι απαραίτητα boolean)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

Πλαίσιο συμβολοσειράς

Αν ο τελεστής πρόσθεσης + χρησιμοποιηθεί με πρωτόγονες τιμές και ο ένας τελεστέος είναι συμβολοσειρά, τότε και ο άλλος θα εξαναγκαστεί σε συμβολοσειρά. Η λογική της μετατροπής είναι ίδια με αυτήν της συνάρτησης String. Στη συνέχεια, οι δύο συμβολοσειρές συνενώνονται.

let name;
'hello ' + name;
// => 'hello undefined'

Αριθμητικό πλαίσιο

Πολλοί τελεστές εξαναγκάζουν τους τελεστέους σε αριθμούς (αν χρειάζεται) σύμφωνα με τη λογική της συνάρτησης Number που εξηγήθηκε παραπάνω.

  • Αριθμητικοί τελεστές: + (αν δεν εμπλέκεται συμβολοσειρά), -, *, /, %, **
  • Μονομερείς τελεστές συν και άρνησης: +, -
  • Σχεσιακοί τελεστές (για τελεστέους που δεν είναι συμβολοσειρές): >, >=, <, <=
  • Τελεστές bitwise: |, &, ^, ~

Ανατρέξε στη λίστα τελεστών του MDN για περισσότερες λεπτομέρειες σχετικά με οποιονδήποτε από αυτούς τους τελεστές.

Για να αποφεύγεις λάθη, είναι καλή πρακτική να καλείς πάντα το Number ρητά πριν εφαρμόσεις αυτούς τους τελεστές.

Οδηγίες

Ο φίλος σου ο Kojo είναι μεγάλος λάτρης των αριθμών. Έχει έναν μικρό ιστότοπο που λέγεται 'fun-with-numbers'. Ο Kojo δεν είναι και τόσο καλός στον προγραμματισμό, γι’ αυτό σου ζήτησε βοήθεια.

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

1. Υπολόγισε το άθροισμα των αριθμών στον κουλοχέρη

Ένα από τα παιχνίδια στον ιστότοπο του Kojo μοιάζει με κουλοχέρη που δείχνει δύο ομάδες τροχών με ψηφία πάνω τους. Κάθε ομάδα ψηφίων αντιπροσωπεύει έναν αριθμό. Για τη μηχανική του παιχνιδιού, ο Kojo πρέπει να ξέρει το άθροισμα αυτών των δύο αριθμών.

Γράψε μια συνάρτηση twoSum που δέχεται δύο πίνακες ως παραμέτρους. Κάθε πίνακας αποτελείται από έναν ή περισσότερους αριθμούς μεταξύ 0 και 9. Η συνάρτηση πρέπει να ερμηνεύει κάθε πίνακα ως αριθμό και να επιστρέφει το άθροισμα αυτών των δύο αριθμών.

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. Προσδιόρισε αν ένας αριθμός είναι παλίνδρομος

Ένα άλλο παιχνίδι στον ιστότοπο είναι ένα μικρό κουίζ που λέγεται "Τυχεροί Αριθμοί". Ο χρήστης μπορεί να εισάγει έναν αριθμό και μετά βλέπει αν ο αριθμός ανήκει σε κάποια μυστική ακολουθία ή μοτίβο. Η ακολουθία ή το μοτίβο των "τυχερών αριθμών" αλλάζει κάθε μήνα και κάθε χρήστης έχει μόνο περιορισμένο αριθμό προσπαθειών για να το μαντέψει.

Οι τυχεροί αριθμοί αυτού του μήνα πρέπει να είναι αριθμοί που είναι παλίνδρομοι. Οι παλινδρομικοί αριθμοί παραμένουν ίδιοι όταν αντιστρέφονται τα ψηφία τους.

Υλοποίησε τη νέα συνάρτηση luckyNumber που δέχεται έναν αριθμό ως παράμετρο. Η συνάρτηση πρέπει να επιστρέφει true αν ο αριθμός είναι παλίνδρομος και false διαφορετικά. Ο αριθμός εισόδου θα είναι πάντα θετικός ακέραιος.

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. Δημιούργησε ένα μήνυμα σφάλματος για μη έγκυρη είσοδο του χρήστη

Σε διάφορα σημεία του ιστότοπου υπάρχουν πεδία εισαγωγής όπου οι χρήστες μπορούν να εισάγουν αριθμούς και να πατήσουν ένα κουμπί για να ενεργοποιήσουν κάποια ενέργεια. Ο Kojo θέλει να βελτιώσει την εμπειρία χρήσης του ιστότοπού του. Θέλει να εμφανίζει ένα μήνυμα σφάλματος σε περίπτωση που ο χρήστης πατήσει το κουμπί αλλά το πεδίο περιέχει μια μη έγκυρη τιμή εισόδου.

Ορίστε μερικές ακόμη πληροφορίες για το πώς παρέχεται η τιμή ενός πεδίου εισαγωγής.

  • Αν ο χρήστης πληκτρολογήσει κάτι σε ένα πεδίο, η σχετική τιμή είναι πάντα συμβολοσειρά, ακόμη κι αν ο χρήστης πληκτρολόγησε μόνο αριθμούς.
  • Αν ο χρήστης πληκτρολογήσει κάτι αλλά μετά το διαγράψει, η μεταβλητή θα είναι κενή συμβολοσειρά.
  • Προτού καν ο χρήστης αρχίσει να πληκτρολογεί, η μεταβλητή μπορεί να είναι undefined ή null.

Γράψε μια συνάρτηση errorMessage που δέχεται την είσοδο του χρήστη ως παράμετρο. Αν ο χρήστης δεν έδωσε καμία είσοδο, η errorMessage πρέπει να επιστρέφει 'Required field'. Αν η είσοδος δεν αντιπροσωπεύει έναν μη μηδενικό αριθμό (σύμφωνα με τους κανόνες μετατροπής της JavaScript), πρέπει να επιστρέφεται 'Must be a number besides 0'. Σε όλες τις άλλες περιπτώσεις, μπορείς να υποθέσεις ότι η είσοδος είναι έγκυρη και η τιμή επιστροφής πρέπει να είναι κενή συμβολοσειρά.

errorMessage('123');
// => ''

errorMessage('');
// => 'Required field'

errorMessage('abc');
// => 'Must be a number besides 0'
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
JavaScript Exercism

Έτοιμος να ξεκινήσεις την άσκηση Τυχεροί Αριθμοί;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.