Ασκήσεις εξάσκησης


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

Θέλεις να προσθέσεις την πρώτη σου άσκηση εξάσκησης σε ένα track; Δες τα έγγραφα για την προσθήκη άσκησης εξάσκησης ή παρακολούθησε το βίντεο με την περιήγησή μας 👇

Note

Μπορείς να δημιουργήσεις γρήγορα τον σκελετό μιας νέας άσκησης εξάσκησης εκτελώντας τις παρακάτω εντολές από τον ριζικό κατάλογο του track:

bin/fetch-configlet
bin/configlet create --practice-exercise <slug>

Για περισσότερες πληροφορίες, δες τα έγγραφα του configlet create

Μεταδεδομένα

Τα μεταδεδομένα της άσκησης εξάσκησης ορίζονται στο κλειδί exercises.practice στο αρχείο config.json. Τα μεταδεδομένα ορίζουν το UUID, το slug και άλλα στοιχεία της άσκησης.

Παράδειγμα

{
  "exercises": {
    "practice": [
      {
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "slug": "leap",
        "name": "Leap",
        "practices": ["if-statements", "numbers", "operator-precedence"],
        "prerequisites": ["if-statements", "numbers"],
        "difficulty": 1
      }
    ]
  }
}

practices

Το κλειδί practices πρέπει να απαριθμεί τα slug των εννοιών που αυτή η άσκηση εξάσκησης επιτρέπει ενεργά σε έναν μαθητή να εξασκήσει.

  • Αυτά εμφανίζονται στη διεπαφή χρήστη ως "Κάνε εξάσκηση σε αυτή την έννοια με: TwoFer, Leap, κ.λπ."
  • Προσπάθησε να επιλέξεις 3 - 8 ασκήσεις που εξασκούν κάθε έννοια.
  • Προσπάθησε να επιλέξεις τουλάχιστον δύο ασκήσεις που επιτρέπουν σε κάποιον να εξασκήσει τα βασικά μιας έννοιας.
  • Κάποιες έννοιες είναι πολύ συνηθισμένες (για παράδειγμα strings). Σε αυτές τις περιπτώσεις προτείνουμε να επιλέξεις μερικές καλές ασκήσεις που κάνουν τους ανθρώπους να σκέφτονται αυτές τις έννοιες με ενδιαφέροντες τρόπους. Για παράδειγμα, ασκήσεις που απαιτούν UTF-8, συνένωση συμβολοσειρών, απαρίθμηση χαρακτήρων κ.λπ. θα ήταν όλες καλά παραδείγματα.

prerequisites

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

  • Αυτά εμφανίζονται στη διεπαφή χρήστη ως "Μάθε τις συμβολοσειρές για να ξεκλειδώσεις το TwoFer"
  • Πρέπει να περιλαμβάνει όλες τις έννοιες που χρειάζεται να έχει καλύψει ένας μαθητής για να μπορεί να ολοκληρώσει την άσκηση με τουλάχιστον έναν ιδιωματικό τρόπο. Για παράδειγμα, για την άσκηση TwoFer στη Ruby, τα prerequisites μπορεί να περιλαμβάνουν strings, optional-params, implicit-return.
  • Για ασκήσεις που μπορούν να ολοκληρωθούν με εναλλακτικές έννοιες (π.χ. μια άσκηση που λύνεται με loops ή recursion), ο συντηρητής πρέπει να επιλέξει την προσέγγιση με την οποία θα ήθελε να ξεκλειδώσει την άσκηση, λαμβάνοντας υπόψη την πορεία του μαθητή στο track. Για παράδειγμα, στο παράδειγμα loops/recursion, μπορεί να θεωρήσει ότι αυτή η άσκηση είναι καλή για πρώιμη εξάσκηση στους loops ή ότι θα προτιμούσε να την αφήσει για αργότερα ώστε να διδάξει την αναδρομή. Μπορεί επίσης να αξιοποιήσει έναν αναλυτή για να παροτρύνει τον μαθητή να δοκιμάσει μια εναλλακτική προσέγγιση: "Καλή δουλειά που το έλυσες με loops. Μπορεί να θέλεις επίσης να δοκιμάσεις να το λύσεις με αναδρομή."

Αρχεία

Κάθε άσκηση εξάσκησης έχει τον δικό της κατάλογο μέσα στον κατάλογο exercises/practice του track. Το όνομα του καταλόγου της άσκησης εξάσκησης πρέπει να ταιριάζει με την ιδιότητα slug της άσκησης εξάσκησης, όπως ορίζεται στο αρχείο config.json.

Μια άσκηση εξάσκησης έχει τέσσερις τύπους αρχείων:

Αρχεία τεκμηρίωσης

Αυτά τα αρχεία παρουσιάζονται στον μαθητή για να βοηθήσουν στην εξήγηση της άσκησης.

  • .docs/introduction.md: εισάγει το σκηνικό και το υπόβαθρο της άσκησης (προαιρετικό)
  • .docs/introduction.append.md: πρόσθετο κείμενο εισαγωγής που προσαρτάται μετά την υπάρχουσα εισαγωγή (προαιρετικό)
  • .docs/instructions.md: παρέχει οδηγίες για την άσκηση (απαιτείται)
  • .docs/instructions.append.md: πρόσθετο κείμενο οδηγιών που προσαρτάται μετά τις υπάρχουσες οδηγίες (προαιρετικό)
  • .docs/hints.md: παρέχει υποδείξεις στον μαθητή για να τον βοηθήσει να ξεκολλήσει στην άσκηση (προαιρετικό)

Αρχεία μεταδεδομένων

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

  • .meta/config.json: περιέχει μεταπληροφορίες για την άσκηση (απαιτείται)
  • .meta/design.md: περιγράφει τον σχεδιασμό της άσκησης (προαιρετικό)
  • .meta/tests.toml: περιέχει πληροφορίες για το ποιες δοκιμές έχουν υλοποιηθεί (προαιρετικό)

Αρχεία προσεγγίσεων

Αυτά τα αρχεία περιγράφουν προσεγγίσεις για την άσκηση.

  • .approaches/introduction.md: εισαγωγή στις πιο συνηθισμένες προσεγγίσεις για την άσκηση (προαιρετικό)
  • .approaches/config.json: μεταδεδομένα για τις προσεγγίσεις (προαιρετικό)
  • .approaches/<approach-slug>/content.md: περιγραφή της προσέγγισης (προαιρετικό)
  • .approaches/<approach-slug>/snippet.txt: απόσπασμα που παρουσιάζει την προσέγγιση (προαιρετικό)

Αρχεία άρθρων

Αυτά τα αρχεία περιγράφουν άρθρα για την άσκηση.

  • .articles/config.json: μεταδεδομένα για τα άρθρα (προαιρετικό)
  • .articles/<article-slug>/content.md: περιγραφή του άρθρου (προαιρετικό)
  • .articles/<article-slug>/snippet.md: απόσπασμα που παρουσιάζει το άρθρο (προαιρετικό)

Αρχεία άσκησης

Τα αρχεία που αφορούν συγκεκριμένη γλώσσα, όπως τα αρχεία υλοποίησης και δοκιμών. Τα ονόματα αυτών των αρχείων εξαρτώνται από το track.

  • Σουίτα δοκιμών: επαληθεύει την ορθότητα μιας λύσης.
  • Υλοποίηση-σκελετός: παρέχει ένα σημείο εκκίνησης για τους μαθητές.
  • Παράδειγμα υλοποίησης: παρέχει ένα παράδειγμα υλοποίησης που περνά όλες τις δοκιμές.
  • Πρόσθετα αρχεία: διασφαλίζουν ότι οι δοκιμές μπορούν να εκτελεστούν.

Παράδειγμα

exercises
└── practice
    └── isogram
        ├── .approaches
        |   ├── for-loop
        |   |   ├── content.md
        |   |   └── snippet.txt
        |   ├── config.json
        |   └── introduction.md
        ├── .articles
        |   ├── performance
        |   |   ├── content.md
        |   |   └── snippet.md
        |   └── config.json
        ├── .docs
        |   ├── introduction.md
        |   ├── instructions.md
        |   └── hints.md
        ├── .meta
        |   ├── config.json
        |   ├── design.md
        |   ├── tests.toml
        |   └── Example.cs (παράδειγμα υλοποίησης)
        ├── Isogram.cs (υλοποίηση-σκελετός)
        └── IsogramTests.cs (δοκιμές)

Αρχείο: .docs/introduction.md

Σκοπός: Εισάγει το σκηνικό και το υπόβαθρο της άσκησης στον μαθητή.

Παρουσία: Απαιτείται αν η άσκηση υλοποιεί μια Άσκηση Προδιαγραφών Προβλήματος με αρχείο introduction.md

Αν η άσκηση υλοποιεί μια Άσκηση Προδιαγραφών Προβλήματος, το περιεχόμενο αυτού του αρχείου πρέπει να ταιριάζει με το αρχείο introduction.md της Άσκησης Προδιαγραφών Προβλήματος. Το configlet έχει λειτουργικότητα για αυτόματο συγχρονισμό του περιεχομένου αυτού του αρχείου.

Αν η άσκηση δεν βασίζεται σε μια Άσκηση Προδιαγραφών Προβλήματος, λάβε υπόψη τα εξής:

Δίνουμε μεγάλη αξία στο να κάνουμε το περιεχόμενο του Exercism ασφαλές για όλους και γι' αυτό συχνά είμαστε υπερβολικά προσεκτικοί όταν κρίνουμε αν μια ιστορία είναι κατάλληλη ή όχι. Αν και προσέχουμε τι ενσωματώνουμε, αναγνωρίζουμε ότι είναι δύσκολο να αντιληφθεί κανείς τι μπορεί να θεωρηθεί προβληματικό, οπότε θα υποθέτουμε πάντα ότι ενεργείς καλή τη πίστη και θα κάνουμε το καλύτερο δυνατό για να εντοπίζουμε τυχόν ζητήματα κατά την ανασκόπηση με μη αντιπαραθετικό τρόπο. Αν θέλεις να ελέγξεις μια ιστορία μαζί μας, ανέφερε το @exercism/leadership και θα το δούμε μαζί. Ορίστε μερικά σημεία καθοδήγησης:

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

Παράδειγμα

# Introduction

Bob is a lackadaisical teenager. In conversation, his responses are very limited.

Αρχείο: .docs/introduction.append.md

Σκοπός: Πρόσθετο κείμενο εισαγωγής που προσαρτάται μετά την υπάρχουσα εισαγωγή.

Παρουσία: Προαιρετικό

Σε κάποιες (σπάνιες) περιπτώσεις, μπορεί να θέλεις να επεκτείνεις το αρχείο introduction.md της άσκησης, για παράδειγμα όταν η άσκηση έχει υλοποιήσει δοκιμές που δεν καλύπτονται από τις υπάρχουσες οδηγίες.

Ένα track που δεν θέλει ο Bob να υποστηρίζει μηνύματα εκτός ASCII, μπορεί να προσθέσει τα εξής:

# Introduction append

## Note

As part of his teenage rebellion, Bob has decided to only communicate using ASCII.

Τα αρχεία προσάρτησης πρέπει να ξεκινούν με κεφαλίδα H1. Αυτή η κεφαλίδα δεν εμφανίζεται, αλλά πρέπει παρ' όλα αυτά να υπάρχει. Την κεφαλίδα H1 ακολουθεί συχνά μια κεφαλίδα H2, η οποία βοηθά στον διαχωρισμό του γενικού περιεχομένου από το περιεχόμενο που αφορά συγκεκριμένο track.

Αρχείο: .docs/instructions.md

Σκοπός: Παρέχει οδηγίες για την άσκηση.

Παρουσία: Απαιτείται

Αν η άσκηση υλοποιεί μια Άσκηση Προδιαγραφών Προβλήματος, το περιεχόμενο αυτού του αρχείου πρέπει να ταιριάζει με το αρχείο instructions.md της Άσκησης Προδιαγραφών Προβλήματος (ή το αρχείο description.md αν δεν υπάρχει αρχείο instructions.md). Το configlet έχει λειτουργικότητα για αυτόματο συγχρονισμό του περιεχομένου αυτού του αρχείου.

Αν η άσκηση δεν βασίζεται σε μια Άσκηση Προδιαγραφών Προβλήματος, λάβε υπόψη τα εξής:

Δίνουμε μεγάλη αξία στο να κάνουμε το περιεχόμενο του Exercism ασφαλές για όλους και γι' αυτό συχνά είμαστε υπερβολικά προσεκτικοί όταν κρίνουμε αν μια ιστορία είναι κατάλληλη ή όχι. Αν και προσέχουμε τι ενσωματώνουμε, αναγνωρίζουμε ότι είναι δύσκολο να αντιληφθεί κανείς τι μπορεί να θεωρηθεί προβληματικό, οπότε θα υποθέτουμε πάντα ότι ενεργείς καλή τη πίστη και θα κάνουμε το καλύτερο δυνατό για να εντοπίζουμε τυχόν ζητήματα κατά την ανασκόπηση με μη αντιπαραθετικό τρόπο. Αν θέλεις να ελέγξεις μια ιστορία μαζί μας, ανέφερε το @exercism/leadership και θα το δούμε μαζί. Ορίστε μερικά σημεία καθοδήγησης:

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

Παράδειγμα

# Instructions

Bob answers 'Sure.' if you ask him a question, such as "How are you?".

He answers 'Whoa, chill out!' if you YELL AT HIM (in all capitals).

He answers 'Calm down, I know what I'm doing!' if you yell a question at him.

He says 'Fine. Be that way!' if you address him without actually saying anything.

He answers 'Whatever.' to anything else.

Αρχείο: .docs/instructions.append.md

Σκοπός: Πρόσθετο κείμενο οδηγιών που προσαρτάται μετά τις υπάρχουσες οδηγίες.

Παρουσία: Προαιρετικό

Σε κάποιες (σπάνιες) περιπτώσεις, μπορεί να θέλεις να επεκτείνεις το αρχείο instructions.md της άσκησης, για παράδειγμα όταν η άσκηση έχει υλοποιήσει δοκιμές που δεν καλύπτονται από τις υπάρχουσες οδηγίες.

# Instructions append

## Note

Bob's conversational partner is a purist when it comes to written communication and always follows normal rules regarding sentence punctuation in English.

Τα αρχεία προσάρτησης πρέπει να ξεκινούν με κεφαλίδα H1. Αυτή η κεφαλίδα δεν εμφανίζεται, αλλά πρέπει παρ' όλα αυτά να υπάρχει. Την κεφαλίδα H1 ακολουθεί συχνά μια κεφαλίδα H2, η οποία βοηθά στον διαχωρισμό του γενικού περιεχομένου από το περιεχόμενο που αφορά συγκεκριμένο track.

Αρχείο: .docs/hints.md

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

Παρουσία: Προαιρετικό

  • Αν ο μαθητής κολλήσει, του επιτρέπουμε να κάνει κλικ σε ένα κουμπί ζητώντας υπόδειξη, το οποίο θα εμφανίσει το σχετικό μέρος του αρχείου.
  • Οι υποδείξεις πρέπει να είναι σε μορφή κουκκίδων κάτω από κεφαλίδες.
  • Οι υποδείξεις πρέπει να αρκούν για να ξεμπλοκάρουν σχεδόν οποιονδήποτε μαθητή.
  • Οι υποδείξεις δεν πρέπει να δίνουν τη λύση, αλλά να παραπέμπουν σε έναν πόρο που περιγράφει τη λύση (π.χ. σύνδεσμο στην τεκμηρίωση της συνάρτησης που θα χρησιμοποιηθεί).
  • Οι υποδείξεις μπορούν να χρησιμοποιούν δείγματα κώδικα για να εξηγήσουν έννοιες, αλλά όχι για να περιγράψουν τη λύση. π.χ. σε μια άσκηση με λίστες μπορεί να δείχνουν ένα απόσπασμα για το πώς λειτουργεί μια συγκεκριμένη συνάρτηση λίστας, αλλά όχι με τρόπο που να μπορεί να αντιγραφεί και να επικολληθεί απευθείας στη λύση.
  • Οι υποδείξεις πρέπει να εμφανίζονται ως λίστα Markdown κάτω από μια κεφαλίδα ## General.
  • Αν δεν υπάρχουν υποδείξεις, η κεφαλίδα πρέπει να παραλείπεται.

Η προβολή υποδείξεων δεν θα είναι μια "προτεινόμενη" διαδρομή και θα την αποθαρρύνουμε (απαλά), εκτός αν ο μαθητής δεν μπορεί να προχωρήσει χωρίς αυτήν. Ως εκ τούτου, αξίζει να λάβεις υπόψη ότι ο μαθητής που τη διαβάζει θα είναι λίγο μπερδεμένος/συγκλονισμένος και ίσως απογοητευμένος.

Παράδειγμα

## General

- There are many [built-in methods][integers] to simplify working with integers.

[integers]: https://ruby-doc.org/core-2.7.0/Integer.html

Αρχείο: .meta/design.md

Σκοπός: Περιγράφει τον σχεδιασμό της άσκησης.

Παρουσία: Προαιρετικό

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

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

Παράδειγμα

# Design

## Goal

The goal of this exercise is help students practice how to work with strings.

## Notes

This exercise does not contain any error handling tests.

Αρχείο: .meta/config.json

Σκοπός: Περιέχει μεταπληροφορίες για την άσκηση.

Παρουσία: Απαιτείται

Αυτό το αρχείο περιέχει μεταπληροφορίες για την άσκηση:

  • authors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συγγραφέα (ή των συγγραφέων) της άσκησης (προαιρετικό)
    • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους αλλάζουν ουσιαστικά την άσκηση (σε βαθμό που να νιώθεις ότι "φτάσατε εκεί μαζί")
  • contributors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συνεισφέροντα (ή των συνεισφερόντων) της άσκησης (προαιρετικό)
    • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους είναι ουσιαστικές/εφαρμόσιμες/έχουν εφαρμοστεί.
  • files: Οι τοποθεσίες των αρχείων που χρησιμοποιούνται σε αυτή την άσκηση, σχετικά με τον κατάλογο της άσκησης (απαιτείται)
  • language_versions Απαιτήσεις έκδοσης γλώσσας (προαιρετικό)
  • blurb: Μια σύντομη περιγραφή αυτής της άσκησης. Το μήκος της πρέπει να είναι <= 350. Το Markdown δεν υποστηρίζεται (απαιτείται)
  • source: Η πηγή στην οποία βασίζεται αυτή η άσκηση (προαιρετικό)
  • source_url: Το URL της πηγής στην οποία βασίζεται αυτή η άσκηση (προαιρετικό)
  • test_runner: Υποδεικνύει αν οι λύσεις αυτής της άσκησης πρέπει να δοκιμάζονται στον εκτελεστή δοκιμών. Προεπιλέγεται true αν δεν οριστεί. (προαιρετικό)
  • representer: Μεταπληροφορίες που σχετίζονται με το πώς ο representer επεξεργάζεται αυτό το αρχείο (προαιρετικό)
    • version: Ένας ακέραιος για την έκδοση του representer που θα χρησιμοποιηθεί για την άσκηση (απαιτείται αν υπάρχει το γονικό κλειδί)
  • icon: Το slug του εικονιδίου (δες την πλήρη λίστα εικονιδίων). Αν δεν οριστεί, θα χρησιμοποιηθεί το slug της άσκησης (προαιρετικό)
  • custom: Οποιαδήποτε μη τυπικά δεδομένα ειδικά για την άσκηση. Μπορεί να χρησιμοποιηθεί για την προσαρμογή της συμπεριφοράς των εργαλείων του track ανά άσκηση (προαιρετικό)

Αν κάποιος είναι και συγγραφέας και συνεισφέρων, καταχώρισέ τον μόνο ως συγγραφέα.

Παράδειγμα

{
  "authors": ["FSharpForever"],
  "files": {
    "solution": ["Bob.fs"],
    "test": ["BobTests.fs"],
    "example": [".meta/Example.fs"]
  },
  "blurb": "Bob is a lackadaisical teenager. In conversation, his responses are very limited"
}

Σημείωσε ότι:

  • Η σειρά των συγγραφέων και των συνεισφερόντων δεν είναι σημαντική και δεν έχει κάποια έννοια.
  • Το language_versions είναι μια ελεύθερης μορφής συμβολοσειρά που τα track είναι ελεύθερα να χρησιμοποιούν και να ερμηνεύουν όπως θέλουν.

Αρχείο: .meta/tests.toml

Σκοπός: Περιέχει πληροφορίες για το ποιες δοκιμές έχουν υλοποιηθεί.

Παρουσία: Προαιρετικό

Αυτό το αρχείο περιέχει πληροφορίες για το ποιες δοκιμές υλοποιούνται, με την προϋπόθεση ότι η άσκηση έχει δοκιμές ορισμένες στο αρχείο canonical-data.json της μέσα στο αποθετήριο problem-specifications.

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

Το εργαλείο configlet χειρίζεται την ενημέρωση/συγχρονισμό αυτού του αρχείου με τα δεδομένα στο αποθετήριο problem-specifications μέσω της εντολής configlet sync. Κατά τον συγχρονισμό, το configlet θα ρωτά, για κάθε μη υλοποιημένη δοκιμή, αν πρέπει να συμπεριληφθεί ή όχι.

Παράδειγμα

# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[3e5c30a8-87e2-4845-a815-a49671ade970]
description = "empty strand"

[a0ea42a6-06d9-4ac6-828c-7ccaccf98fec]
description = "can count one nucleotide in single-character input"

[eca0d565-ed8c-43e7-9033-6cefbf5115b5]
description = "strand with repeated nucleotide"

[40a45eac-c83f-4740-901a-20b22d15a39f]
description = "strand with multiple nucleotides"

[b4c47851-ee9e-4b0a-be70-a86e343bd851]
description = "strand with invalid nucleotides"
include = false
comment = "error handling omitted on purpose"

Αρχείο: .approaches/introduction.md

Σκοπός: Εισαγωγή στις πιο συνηθισμένες προσεγγίσεις για την άσκηση

Παρουσία: Προαιρετικό

Αυτό το αρχείο περιγράφει τις πιο συνηθισμένες προσεγγίσεις για την άσκηση. Δες την τεκμηρίωση για περισσότερες πληροφορίες σχετικά με το τι πρέπει να περιέχει αυτό το αρχείο.

Παράδειγμα

# Introduction

The key to this exercise is to deal with C# strings being immutable, which means that a `string`'s value cannot be changed.
Therefore, to reverse a string you'll need to create a _new_ `string`.

## Using LINQ

```csharp
public static string Reverse(string input)
{
    return new string(input.Reverse().ToArray());
}
```

For more information, check the [LINQ approach][approach-linq].

## Which approach to use?

If readability is your primary concern (and it usually should be), the LINQ-based approach is hard to beat.

Αρχείο: .approaches/config.json

Σκοπός: Μεταδεδομένα για τις προσεγγίσεις

Παρουσία: Προαιρετικό (απαιτείται όταν υπάρχει εισαγωγή προσέγγισης ή προσέγγιση)

Αυτό το αρχείο περιέχει μεταπληροφορίες για τις προσεγγίσεις της άσκησης:

  • introduction: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συγγραφέα (ή των συγγραφέων) της εισαγωγής προσεγγίσεων της άσκησης (προαιρετικό)

    • authors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συγγραφέα (ή των συγγραφέων) της εισαγωγής προσεγγίσεων της άσκησης (απαιτείται)
      • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους αλλάζουν ουσιαστικά την εισαγωγή προσεγγίσεων της άσκησης (σε βαθμό που να νιώθεις ότι "φτάσατε εκεί μαζί")
    • contributors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συνεισφέροντα (ή των συνεισφερόντων) της εισαγωγής προσεγγίσεων της άσκησης (προαιρετικό)
      • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους είναι ουσιαστικές/εφαρμόσιμες/έχουν εφαρμοστεί.
  • approaches: Ένας πίνακας που απαριθμεί τις λεπτομερείς προσεγγίσεις (προαιρετικό)

    • uuid: ένα V4 UUID που προσδιορίζει μοναδικά την προσέγγιση. Το UUID πρέπει να είναι μοναδικό και εντός του track και σε όλα τα track, και δεν πρέπει ποτέ να αλλάζει
    • slug: το slug της προσέγγισης, που είναι μια συμβολοσειρά με πεζά γράμματα σε μορφή kebab-case. Το slug πρέπει να είναι μοναδικό σε όλα τα slug προσεγγίσεων εντός του track. Το μήκος του πρέπει να είναι <= 255.
    • title: ο τίτλος της προσέγγισης. Το μήκος του πρέπει να είναι <= 255.
    • blurb: Μια σύντομη περιγραφή αυτής της προσέγγισης. Το μήκος της πρέπει να είναι <= 350. Το Markdown δεν υποστηρίζεται (απαιτείται)
    • authors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συγγραφέα (ή των συγγραφέων) της προσέγγισης της άσκησης (απαιτείται)
      • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους αλλάζουν ουσιαστικά την προσέγγιση της άσκησης (σε βαθμό που να νιώθεις ότι "φτάσατε εκεί μαζί")
    • contributors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συνεισφέροντα (ή των συνεισφερόντων) της προσέγγισης της άσκησης (προαιρετικό)
      • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους είναι ουσιαστικές/εφαρμόσιμες/έχουν εφαρμοστεί.
    • tags: Καθόρισε τις συνθήκες υπό τις οποίες μια υποβολή συνδέεται με μια προσέγγιση. (προαιρετικό)
      • all: Ένας πίνακας ετικετών που πρέπει όλες να υπάρχουν σε μια υποβολή (προαιρετικό, εκτός αν το any δεν έχει στοιχεία)
      • any: Ένας πίνακας ετικετών από τις οποίες τουλάχιστον μία πρέπει να υπάρχει σε μια υποβολή (προαιρετικό, εκτός αν το all δεν έχει στοιχεία)
      • not: καμία από τις ετικέτες δεν πρέπει να υπάρχει σε μια υποβολή (προαιρετικό)

Παράδειγμα

{
  "introduction": {
    "authors": ["erikschierboom"]
  },
  "approaches": [
    {
      "uuid": "448fb2b4-18ab-4e55-aa54-ad4ed6d5f7f6",
      "slug": "span",
      "title": "Use Span<T>",
      "blurb": "Use Span<T> to efficiently reverse a string.",
      "authors": ["erikschierboom"]
    }
  ]
}

Αρχείο: .approaches/<approach-slug>/content.md

Σκοπός: Λεπτομερής περιγραφή της προσέγγισης

Παρουσία: Προαιρετικό (απαιτείται για τις προσεγγίσεις)

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

Παράδειγμα

# Span

```csharp
Span<char> chars = stackalloc char[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);
```

This `Span<T>` approach uses a `for` loop.

Αρχείο: .approaches/<approach-slug>/snippet.txt

Σκοπός: Απόσπασμα που παρουσιάζει την προσέγγιση

Παρουσία: Προαιρετικό (απαιτείται για τις προσεγγίσεις)

Αυτό το αρχείο περιέχει ένα μικρό απόσπασμα που παρουσιάζει την προσέγγιση. Το απόσπασμα εμφανίζεται στη σελίδα εμβάθυνσης μιας άσκησης.

Ο αριθμός των γραμμών του πρέπει να είναι <= 8.

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

Παράδειγμα

Span<char> chars = stackalloc char[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);

Αρχείο: .article/config.json

Σκοπός: Μεταδεδομένα για τα άρθρα

Παρουσία: Προαιρετικό (απαιτείται όταν υπάρχει ένα άρθρο)

Αυτό το αρχείο περιέχει μεταπληροφορίες για τα άρθρα της άσκησης:

  • articles: Ένας πίνακας που απαριθμεί τα λεπτομερή άρθρα (προαιρετικό)
    • uuid: ένα V4 UUID που προσδιορίζει μοναδικά το άρθρο. Το UUID πρέπει να είναι μοναδικό και εντός του track και σε όλα τα track, και δεν πρέπει ποτέ να αλλάζει
    • slug: το slug του άρθρου, που είναι μια συμβολοσειρά με πεζά γράμματα σε μορφή kebab-case. Το slug πρέπει να είναι μοναδικό σε όλα τα slug άρθρων εντός του track. Το μήκος του πρέπει να είναι <= 255.
    • title: ο τίτλος του άρθρου. Το μήκος του πρέπει να είναι <= 255.
    • blurb: Μια σύντομη περιγραφή αυτού του άρθρου. Το μήκος της πρέπει να είναι <= 350. Το Markdown δεν υποστηρίζεται (απαιτείται)
    • authors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συγγραφέα (ή των συγγραφέων) του άρθρου της άσκησης (απαιτείται)
      • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους αλλάζουν ουσιαστικά το άρθρο της άσκησης (σε βαθμό που να νιώθεις ότι "φτάσατε εκεί μαζί")
    • contributors: Το όνομα χρήστη (ή τα ονόματα χρήστη) στο GitHub του συνεισφέροντα (ή των συνεισφερόντων) του άρθρου της άσκησης (προαιρετικό)
      • Συμπεριλαμβανομένων των αξιολογητών αν οι αξιολογήσεις τους είναι ουσιαστικές/εφαρμόσιμες/έχουν εφαρμοστεί.

Παράδειγμα

{
  "articles": [
    {
      "uuid": "6db71962-62d5-448b-a980-c20ae41013ed",
      "slug": "performance",
      "title": "Optimizing performance",
      "blurb": "Explore how to most efficiently reverse a string and what the trade-offs are.",
      "authors": ["erikschierboom"]
    }
  ]
}

Αρχείο: .articles/<article-slug>/content.md

Σκοπός: Λεπτομερής περιγραφή της προσέγγισης

Παρουσία: Προαιρετικό (απαιτείται για τις προσεγγίσεις)

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

Παράδειγμα

# Performance

In this document, we'll find out which approach is the most performant one.

## Benchmark results

| Method |      Mean |     Error |    StdDev |    Median | Allocated |
| -----: | --------: | --------: | --------: | --------: | --------: |
|   Linq | 29.133 ns | 0.5865 ns | 0.5486 ns | 28.984 ns |      80 B |
|  Array |  4.806 ns | 0.4999 ns | 1.4739 ns |  3.967 ns |         - |

Αρχείο: .articles/<article-slug>/snippet.txt

Σκοπός: Απόσπασμα που παρουσιάζει την προσέγγιση

Παρουσία: Προαιρετικό (απαιτείται για τα άρθρα)

Αυτό το αρχείο περιέχει ένα μικρό απόσπασμα που παρουσιάζει το άρθρο. Το απόσπασμα εμφανίζεται στη σελίδα εμβάθυνσης μιας άσκησης.

Ο αριθμός των γραμμών του πρέπει να είναι <= 8.

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

Παράδειγμα

| Method |      Mean | Allocated |
| -----: | --------: | --------: |
|   Linq | 29.133 ns |      80 B |
|  Array |  4.806 ns |         - |

Αρχείο: Υλοποίηση-σκελετός

Σκοπός: Παρέχει ένα σημείο εκκίνησης για τους μαθητές.

Παρουσία: Απαιτείται

  • Σχεδίασε τον σκελετό έτσι ώστε ένας μαθητής να ξέρει πού να προσθέσει κώδικα.
  • Για μεταγλωττιζόμενες γλώσσες, σκέψου να έχεις κώδικα που μεταγλωττίζεται, καθώς τα μηνύματα του μεταγλωττιστή μπορεί μερικές φορές να είναι δύσκολο να κατανοηθούν από μαθητές που είναι νέοι στη γλώσσα.
  • Ο κώδικας πρέπει να είναι όσο το δυνατόν πιο απλός.
  • Χρησιμοποίησε μόνο χαρακτηριστικά της γλώσσας που εισάγονται από τα prerequisites (και τα δικά τους prerequisites, κ.ο.κ.).
  • Το αρχείο-σκελετός εμφανίζεται στον μαθητή όταν προγραμματίζει μέσα στον περιηγητή και κατεβαίνει στο σύστημα αρχείων του μαθητή όταν χρησιμοποιεί τη γραμμή εντολών.
  • Οι σχετικές διαδρομές προς το αρχείο (ή τα αρχεία) υλοποίησης-σκελετού πρέπει να καθορίζονται στο "files.solution" κλειδί του αρχείου .meta/config.json.

Παράδειγμα

using System;

public static class Isogram
{
    public static bool IsIsogram(string word)
    {
        throw new NotImplementedException("You need to implement this function.");
    }
}

Αρχείο: Δοκιμές

Σκοπός: Επαληθεύει την ορθότητα μιας λύσης.

Παρουσία: Απαιτείται

  • Ο κώδικας πρέπει να είναι όσο το δυνατόν πιο απλός.
  • Χρησιμοποίησε μόνο χαρακτηριστικά της γλώσσας που εισάγονται από τα prerequisites της άσκησης (και τα δικά τους prerequisites, κ.ο.κ.).
  • Το αρχείο δοκιμών εμφανίζεται στον μαθητή όταν προγραμματίζει μέσα στον περιηγητή και κατεβαίνει στο σύστημα αρχείων του μαθητή όταν χρησιμοποιεί τη γραμμή εντολών.
  • Το Exercism προτιμά οι ασκήσεις εξάσκησης να ολοκληρώνονται μέσω της Ανάπτυξης Καθοδηγούμενης από Δοκιμές. Για να επιτευχθεί αυτό, υπάρχουν δύο επιλογές:
    • Ο εκτελεστής δοκιμών πρέπει να εκτελεί τις δοκιμές με τη σειρά που ορίζεται στο αρχείο ΚΑΙ η σουίτα δοκιμών πρέπει να σταματά στην πρώτη αποτυχία, ή
    • Όλες οι δοκιμές εκτός από την πρώτη πρέπει να παραλείπονται από προεπιλογή.
  • Οι σχετικές διαδρομές προς το αρχείο (ή τα αρχεία) δοκιμών πρέπει να καθορίζονται στο "files.test" κλειδί του αρχείου .meta/config.json.

Παράδειγμα

using Xunit;

public class IsogramTest
{
    [Fact]
    public void Empty_string() =>
        Assert.True(Isogram.IsIsogram(""));

    [Fact(Skip = "Remove this Skip property to run this test")]
    public void Isogram_with_only_lower_case_characters() =>
        Assert.True(Isogram.IsIsogram("isogram"));

    [Fact(Skip = "Remove this Skip property to run this test")]
    public void Word_with_one_duplicated_character() =>
        Assert.False(Isogram.IsIsogram("eleven"));
}

Αρχείο: Παράδειγμα υλοποίησης

Σκοπός: Παρέχει ένα παράδειγμα υλοποίησης που περνά όλες τις δοκιμές.

Παρουσία: Απαιτείται

  • Αυτή η υλοποίηση χρησιμοποιείται για να επαληθευτεί ότι υπάρχει μια υλοποίηση που περνά τις δοκιμές. Σκόπιμα δεν είναι ο κώδικας-στόχος στον οποίο θέλουμε να στοχεύσει ένας μαθητής.
  • Κάθε track πρέπει να επαληθεύει ότι το παράδειγμα υλοποίησης περνά τις δοκιμές στη ρύθμιση συνεχούς ενσωμάτωσης του.
  • Οι μέντορες δεν θα βλέπουν αυτόν τον κώδικα.
  • Το αρχείο παραδείγματος δεν εμφανίζεται στον μαθητή όταν προγραμματίζει μέσα στον περιηγητή και δεν κατεβαίνει στο σύστημα αρχείων του μαθητή όταν χρησιμοποιεί τη γραμμή εντολών.
  • Οι σχετικές διαδρομές προς το αρχείο (ή τα αρχεία) παραδείγματος υλοποίησης πρέπει να καθορίζονται στο "files.example" κλειδί του αρχείου .meta/config.json.

Παράδειγμα

using System.Linq;

public static class Isogram
{
    public static bool IsIsogram(string word)
    {
        var lowerCaseLetters = word.ToLower().Where(char.IsLetter).ToList();
        return lowerCaseLetters.Distinct().Count() == lowerCaseLetters.Count;
    }
}

Αρχείο: Πρόσθετα αρχεία

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

Παρουσία: Απαιτείται αν τα προεπιλεγμένα αρχεία δεν αρκούν για την εκτέλεση των δοκιμών

Κάποιες γλώσσες απαιτούν πρόσθετα αρχεία για να εκτελεστούν οι δοκιμές. Παραδείγματα αυτών είναι τα αρχεία έργου της C# και τα αρχεία package.json της Node, χωρίς τα οποία δεν θα είναι δυνατή η εκτέλεση των δοκιμών.

Κοινόχρηστα αρχεία

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

Παρουσίαση

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

Εικονίδιο

Κάθε άσκηση έχει ένα συνοδευτικό εικονίδιο. Από προεπιλογή, το εικονίδιο που εμφανίζεται είναι αυτό του οποίου το όνομα ταιριάζει με το slug της άσκησης. Μπορείς να το παρακάμψεις αυτό καθορίζοντας την ιδιότητα icon στο αρχείο .meta/config.json της άσκησης.

Αν υλοποιείς μια άσκηση από τα μεταδεδομένα problem-specifications, πιθανότατα υπάρχει ήδη ένα εικονίδιο για αυτή την άσκηση. Αν όχι, άνοιξε ένα issue στο αποθετήριο website-icons.