Διαδρομές
/
jq
jq
/
Ασκήσεις
/
Καταμέτρηση πουλιών
Καταμέτρηση πουλιών

Καταμέτρηση πουλιών

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

Εισαγωγή

Πίνακες

Το JSON ορίζει έναν πίνακα ως εξής:

Ένας πίνακας είναι μια διατεταγμένη συλλογή τιμών. Ένας πίνακας αρχίζει με [ αριστερή αγκύλη και τελειώνει με ] δεξιά αγκύλη. Οι τιμές χωρίζονται με , κόμμα.

Οι πίνακες μπορούν να περιέχουν μηδέν ή περισσότερες τιμές JSON οποιουδήποτε είδους. Τα στοιχεία ενός πίνακα δεν χρειάζεται να είναι όλα του ίδιου τύπου.

Δημιουργία πινάκων

Χρησιμοποίησε αγκύλες για να συγκεντρώσεις στοιχεία σε έναν πίνακα.

[1, 2, 3]

Τα στοιχεία ενός stream μπορούν να συλλεχθούν σε έναν πίνακα αν το κλείσεις σε αγκύλες.

range(5)     # => a stream of 5 numbers
[range(5)]   # => the array [0, 1, 2, 3, 4]

Μέγεθος

Η συνάρτηση length επιστρέφει τον αριθμό των στοιχείων ενός πίνακα.

Ευρετηρίαση και τεμαχισμός

Η ευρετηρίαση των πινάκων ξεκινά από το μηδέν.

Μπορείς να ανακτήσεις ένα στοιχείο από έναν πίνακα με μια έκφραση αγκύλης: το .[2] παίρνει το τρίτο στοιχείο.

Οι αρνητικές θέσεις μετρούν προς τα πίσω από το τέλος του πίνακα: το .[-1] παίρνει το τελευταίο στοιχείο· το .[-2] είναι το προτελευταίο.

Ένα τμήμα είναι μια υποακολουθία του πίνακα. Το .[10:15] επιστρέφει 5 στοιχεία ξεκινώντας από τη θέση 10· η τελική θέση δεν περιλαμβάνεται.

Υπάρχουν μερικές βολικές συναρτήσεις:

  • Η first παίρνει το πρώτο στοιχείο.
  • Η last παίρνει το τελευταίο στοιχείο.
  • Η nth(n) παίρνει το στοιχείο στη θέση n.

Επανάληψη

Το jq παρέχει πολλές συναρτήσεις που καλύπτουν τη συνηθισμένη λειτουργικότητα επανάληψης:

  • Η map(expr) επιστρέφει έναν νέο πίνακα όπου το expr εφαρμόζεται σε κάθε στοιχείο με τη σειρά.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • Η select(expr) είναι μια συνάρτηση που εφαρμόζει το expr σε μια μεμονωμένη τιμή· αν το αποτέλεσμα της έκφρασης είναι αληθές, τότε η τιμή επιστρέφεται· αν το αποτέλεσμα είναι ψευδές, δεν επιστρέφεται τίποτα: ούτε null, κυριολεκτικά τίποτα.

    Για να το εφαρμόσεις σε έναν πίνακα, συνδύασέ το με τη map.

    [range(10)] | map(select(. % 2 == 0))    # => [0, 2, 4, 6, 8]
    

    Εναλλακτικά, εφάρμοσε τη select σε ένα stream και συγκέντρωσε τα αποτελέσματα.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • Οι any(condition) και all(condition) επιστρέφουν μια τιμή Boolean που δείχνει αν οποιοδήποτε ή όλα τα στοιχεία του πίνακα περνούν τη συνθήκη.

    [1, 2, 3, 4] | any(. > 4)    # false
    [1, 2, 3, 4] | any(. >= 4)   # true
    
    [1, 2, 3, 4] | all(. >= 4)   # false
    [1, 2, 3, 4] | all(. <= 4)   # true
    

Οδηγίες

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

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

1. Έλεγξε ποιες ήταν οι μετρήσεις την προηγούμενη εβδομάδα

Αποθηκεύεις τις μετρήσεις των πουλιών σου σε μορφή JSON. Ένας πίνακας "main" αποθηκεύει πίνακες με τις εβδομαδιαίες μετρήσεις. Κάθε εβδομαδιαία μέτρηση είναι ένας πίνακας με επτά ακέραιους, έναν αριθμό για κάθε ημέρα της εβδομάδας. Προσθέτεις πάντα τις νέες εβδομάδες στο τέλος του κύριου πίνακα. Υλοποίησε το φίλτρο που επιστρέφει τις μετρήσεις της προηγούμενης εβδομάδας.

$ cat bird-counting-data.json
[
  ...,
  [0, 2, 5, 3, 7, 8, 4],
  [4, 5, 9, 10, 9, 4, 3]
]

$ jq -f bird-count.jq < bird-counting-data.json
{
  "last_week": [0, 2, 5, 3, 7, 8, 4],
  ...

2. Έλεγξε πόσα πουλιά επισκέφτηκαν χθες

Υλοποίησε το φίλτρο ώστε να επιστρέφει πόσα πουλιά επισκέφτηκαν τον κήπο σου χθες. Οι μετρήσεις των πουλιών είναι ταξινομημένες κατά ημέρα, με το πρώτο στοιχείο να είναι η μέτρηση της παλαιότερης ημέρας και το τελευταίο στοιχείο να είναι η σημερινή μέτρηση.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "yesterday": 4,
  ...

3. Υπολόγισε τον συνολικό αριθμό των πουλιών που επισκέφτηκαν τον κήπο

Υλοποίησε το φίλτρο ώστε να επιστρέφει τον συνολικό αριθμό των πουλιών που έχουν επισκεφτεί τον κήπο σου αυτή την εβδομάδα.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "total": 44,
  ...

4. Υπολόγισε τον αριθμό των ημερών αιχμής

Κάποιες μέρες έχουν περισσότερη κίνηση από άλλες. Μια ημέρα αιχμής είναι εκείνη κατά την οποία πέντε ή περισσότερα πουλιά έχουν επισκεφτεί τον κήπο σου. Υλοποίησε το φίλτρο ώστε να επιστρέφει τον αριθμό των ημερών αιχμής αυτής της εβδομάδας.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "busy_days": 4,
  ...

5. Έλεγξε αν υπήρξε μέρα χωρίς επισκέψεις πουλιών

Υλοποίησε το φίλτρο που επιστρέφει true αν υπήρξε οποιαδήποτε μέρα αυτή την εβδομάδα κατά την οποία μηδέν πουλιά επισκέφτηκαν τον κήπο· διαφορετικά, επιστρέφει false.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
jq Exercism

Έτοιμος να ξεκινήσεις την άσκηση Καταμέτρηση πουλιών;

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