Οι ασκήσεις εξάσκησης είναι ασκήσεις σχεδιασμένες να επιτρέπουν στους μαθητές να λύνουν ένα οποιοδήποτε πρόβλημα, με στόχο να αξιοποιήσουν τις έννοιες που έχουν μάθει μέχρι τώρα.
Θέλεις να προσθέσεις την πρώτη σου άσκηση εξάσκησης σε ένα track; Δες τα έγγραφα για την προσθήκη άσκησης εξάσκησης ή παρακολούθησε το βίντεο με την περιήγησή μας 👇
Μπορείς να δημιουργήσεις γρήγορα τον σκελετό μιας νέας άσκησης εξάσκησης εκτελώντας τις παρακάτω εντολές από τον ριζικό κατάλογο του 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 των εννοιών που αυτή η άσκηση εξάσκησης επιτρέπει ενεργά σε έναν μαθητή να εξασκήσει.
strings). Σε αυτές τις περιπτώσεις προτείνουμε να επιλέξεις μερικές καλές ασκήσεις που κάνουν τους ανθρώπους να σκέφτονται αυτές τις έννοιες με ενδιαφέροντες τρόπους. Για παράδειγμα, ασκήσεις που απαιτούν UTF-8, συνένωση συμβολοσειρών, απαρίθμηση χαρακτήρων κ.λπ. θα ήταν όλες καλά παραδείγματα.prerequisitesΤο κλειδί 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
Σκοπός: Παρέχει υποδείξεις σε έναν μαθητή για να τον βοηθήσει να ξεκολλήσει σε μια άσκηση.
Παρουσία: Προαιρετικό
## 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
Σκοπός: Περιγράφει τον σχεδιασμό της άσκησης.
Παρουσία: Προαιρετικό
Αυτό το αρχείο περιέχει πληροφορίες για τον σχεδιασμό της άσκησης, που περιλαμβάνουν στοιχεία όπως ο στόχος της, οι διδακτικοί της στόχοι, τι δεν πρέπει να διδάσκεται και άλλα.
Υπάρχει για να ενημερώνει τους μελλοντικούς συντηρητές ή συνεισφέροντες σχετικά με το εύρος και τους περιορισμούς μιας άσκησης, ώστε να αποφεύγεται η φυσική τάση να γίνονται οι ασκήσεις πιο πολύπλοκες με τον χρόνο.
# 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: Οι τοποθεσίες των αρχείων που χρησιμοποιούνται σε αυτή την άσκηση, σχετικά με τον κατάλογο της άσκησης (απαιτείται)
solution: το αρχείο (ή τα αρχεία) υλοποίησης-σκελετού (απαιτείται)test: το αρχείο (ή τα αρχεία) δοκιμών (απαιτείται)example: το αρχείο (ή τα αρχεία) παραδείγματος υλοποίησης (απαιτείται)editor: πρόσθετα αρχεία που εμφανίζονται ως μόνο για ανάγνωση στον επεξεργαστή (προαιρετικό)invalidator: αρχεία που όταν αλλάξουν, προκαλούν το να καταστεί μια λύση παρωχημένη (προαιρετικό)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 είναι ελεύθερα να χρησιμοποιούν και να ερμηνεύουν όπως θέλουν.Σκοπός: Περιέχει πληροφορίες για το ποιες δοκιμές έχουν υλοποιηθεί.
Παρουσία: Προαιρετικό
Αυτό το αρχείο περιέχει πληροφορίες για το ποιες δοκιμές υλοποιούνται, με την προϋπόθεση ότι η άσκηση έχει δοκιμές ορισμένες στο αρχείο 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 | - |
Σκοπός: Παρέχει ένα σημείο εκκίνησης για τους μαθητές.
Παρουσία: Απαιτείται
"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.");
}
}
Σκοπός: Επαληθεύει την ορθότητα μιας λύσης.
Παρουσία: Απαιτείται
"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"));
}
Σκοπός: Παρέχει ένα παράδειγμα υλοποίησης που περνά όλες τις δοκιμές.
Παρουσία: Απαιτείται
"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.