A gyakorlófeladatok olyan feladatok, amelyek segítségével a tanulók tetszőleges problémát oldhatnak meg, azzal a céllal, hogy felhasználják az addig megtanult fogalmakat.
Szeretnéd hozzáadni az első gyakorlófeladatodat egy kurzushoz? Nézd meg a gyakorlófeladat hozzáadásáról szóló dokumentációt, vagy nézd meg a bemutatóvideónkat 👇
Gyorsan felállíthatsz egy új gyakorlófeladat vázát, ha a kurzus gyökérkönyvtárából futtatod a következő parancsokat:
bin/fetch-configlet
bin/configlet create --practice-exercise <slug>
További információért nézd meg a configlet create dokumentációt
A gyakorlófeladat metaadatait a config.json fájl exercises.practice kulcsa határozza meg. A metaadatok megadják a feladat UUID-jét, a slugját és egyebeket.
{
"exercises": {
"practice": [
{
"uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
"slug": "leap",
"name": "Leap",
"practices": ["if-statements", "numbers", "operator-precedence"],
"prerequisites": ["if-statements", "numbers"],
"difficulty": 1
}
]
}
}
practicesA practices kulcs azoknak a fogalmaknak a slugjait sorolja fel, amelyeket ez a gyakorlófeladat aktívan gyakoroltat a tanulóval.
strings). Ezekben az esetekben néhány jó feladat kiválasztását javasoljuk, amelyek érdekes módon gondolkodtatják el az embereket ezekről a fogalmakról. Jó példák lennének például az olyan feladatok, amelyekhez UTF-8, string-összefűzés, karakterek bejárása stb. kell.prerequisitesA prerequisites kulcs azokat a fogalmakat sorolja fel, amelyeket a tanulónak teljesítenie kell ahhoz, hogy hozzáférjen ehhez a gyakorlófeladathoz.
strings, az optional-params és az implicit-return.loops vagy recursion segítségével), a karbantartó válassza ki azt a megközelítést, amellyel fel szeretné oldani a feladatot, figyelembe véve, hogyan halad a tanuló a kurzuson. A ciklusok/rekurzió példánál például gondolhatják úgy, hogy ez a feladat jó korai gyakorlás a loops-hoz, de úgy is, hogy inkább későbbre hagyják a rekurzió tanításához. Elemzőt is használhatnak, hogy a tanulót alternatív megközelítés kipróbálására ösztönözzék: „Szép munka, hogy ciklusokkal oldottad meg. Kipróbálhatnád rekurzióval is.”Minden gyakorlófeladatnak saját könyvtára van a kurzus exercises/practice könyvtárán belül. A gyakorlófeladat könyvtárának nevének meg kell egyeznie a gyakorlófeladat slug tulajdonságával, a config.json fájlban meghatározottak szerint.
A gyakorlófeladatoknak négyféle fájljuk van:
Ezeket a fájlokat a tanuló számára jelenítjük meg, hogy segítsenek elmagyarázni a feladatot.
.docs/introduction.md: bemutatja a feladat hátterét és környezetét (opcionális).docs/introduction.append.md: további bevezető szöveg, amely a meglévő bevezető után fűződik hozzá (opcionális).docs/instructions.md: a feladat utasításait tartalmazza (kötelező).docs/instructions.append.md: további bevezető szöveg, amely a meglévő utasítások után fűződik hozzá (opcionális).docs/hints.md: tippeket ad a tanulónak, hogy segítsen kijutni a holtpontról a feladatban (opcionális)Ezeket a fájlokat nem jelenítjük meg a tanulónak, hanem a feladat metaadatainak meghatározására szolgálnak.
.meta/config.json: a feladatra vonatkozó metaadatokat tartalmazza (kötelező).meta/design.md: a feladat tervét írja le (opcionális).meta/tests.toml: arról tartalmaz információt, hogy mely tesztek vannak megvalósítva (opcionális)Ezek a fájlok a feladat megközelítéseit írják le.
.approaches/introduction.md: bevezető a feladat leggyakoribb megközelítéseibe (opcionális).approaches/config.json: a megközelítések metaadatai (opcionális).approaches/<approach-slug>/content.md: a megközelítés leírása (opcionális).approaches/<approach-slug>/snippet.txt: a megközelítést bemutató kódrészlet (opcionális)Ezek a fájlok a feladathoz tartozó cikkeket írják le.
.articles/config.json: a cikkek metaadatai (opcionális).articles/<article-slug>/content.md: a cikk leírása (opcionális).articles/<article-slug>/snippet.md: a cikket bemutató kódrészlet (opcionális)A nyelvspecifikus fájlok, például a megvalósítási és tesztfájlok. Ezeknek a fájloknak a nevei kurzusspecifikusak.
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 (example implementation)
├── Isogram.cs (stub implementation)
└── IsogramTests.cs (tests)
.docs/introduction.md
Cél: Bemutatja a feladat hátterét és környezetét a tanulónak.
Jelenlét: Kötelező, ha a feladat egy Problem Specifications feladatot valósít meg, amely rendelkezik introduction.md fájllal
Ha a feladat egy Problem Specifications feladatot valósít meg, akkor ennek a fájlnak a tartalmának meg kell egyeznie a Problem Specifications feladat introduction.md fájljával. A configlet képes automatikusan szinkronizálni ennek a fájlnak a tartalmát.
Ha a feladat nem Problem Specifications feladaton alapul, gondold át a következőket:
Nagy hangsúlyt fektetünk arra, hogy az Exercism tartalma mindenki számára biztonságos legyen, ezért a történetek megfelelőségének eldöntésekor gyakran a biztonságosabb utat választjuk. Bár odafigyelünk arra, hogy mit olvasztunk be, tisztában vagyunk vele, hogy nehéz felismerni, mi tűnhet problémásnak, ezért mindig jóhiszeműnek tekintünk, és a lehető legjobb tudásunk szerint, konfrontáció nélkül igyekszünk kiszűrni a problémákat a bírálat során. Ha szeretnél egy történetet megbeszélni velünk, jelöld meg az @exercism/leadership csoportot, és együtt megnézzük. Íme néhány iránymutató pont:
# Introduction
Bob is a lackadaisical teenager. In conversation, his responses are very limited.
.docs/introduction.append.md
Cél: További bevezető szöveg, amely a meglévő bevezető után fűződik hozzá.
Jelenlét: Opcionális
Néhány (ritka) esetben bővíteni szeretnéd a feladat introduction.md fájlját, például amikor a feladat olyan teszteket valósít meg, amelyeket a meglévő utasítások nem fednek le.
Egy kurzus, amely nem szeretné, hogy Bob támogassa a nem ASCII üzeneteket, a következőt adhatja hozzá:
# Introduction append
## Note
As part of his teenage rebellion, Bob has decided to only communicate using ASCII.
A hozzáfűzött fájloknak H1 fejléccel kell kezdődniük. Ez a fejléc nem jelenik meg, de mégis ott kell lennie. A H1 fejlécet gyakran egy H2 fejléc követi, amely segít elválasztani az általános tartalmat a kurzusspecifikus tartalomtól.
.docs/instructions.md
Cél: A feladat utasításainak megadása.
Jelenlét: Kötelező
Ha a feladat egy Problem Specifications feladatot valósít meg, akkor ennek a fájlnak a tartalmának meg kell egyeznie a Problem Specifications feladat instructions.md fájljával (vagy a description.md fájllal, ha nincs instructions.md fájl). A configlet képes automatikusan szinkronizálni ennek a fájlnak a tartalmát.
Ha a feladat nem Problem Specifications feladaton alapul, gondold át a következőket:
Nagy hangsúlyt fektetünk arra, hogy az Exercism tartalma mindenki számára biztonságos legyen, ezért a történetek megfelelőségének eldöntésekor gyakran a biztonságosabb utat választjuk. Bár odafigyelünk arra, hogy mit olvasztunk be, tisztában vagyunk vele, hogy nehéz felismerni, mi tűnhet problémásnak, ezért mindig jóhiszeműnek tekintünk, és a lehető legjobb tudásunk szerint, konfrontáció nélkül igyekszünk kiszűrni a problémákat a bírálat során. Ha szeretnél egy történetet megbeszélni velünk, jelöld meg az @exercism/leadership csoportot, és együtt megnézzük. Íme néhány iránymutató pont:
# 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
Cél: További utasításszöveg, amely a meglévő utasítások után fűződik hozzá.
Jelenlét: Opcionális
Néhány (ritka) esetben bővíteni szeretnéd a feladat instructions.md fájlját, például amikor a feladat olyan teszteket valósít meg, amelyeket a meglévő utasítások nem fednek le.
# 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.
A hozzáfűzött fájloknak H1 fejléccel kell kezdődniük. Ez a fejléc nem jelenik meg, de mégis ott kell lennie. A H1 fejlécet gyakran egy H2 fejléc követi, amely segít elválasztani az általános tartalmat a kurzusspecifikus tartalomtól.
.docs/hints.md
Cél: Tippeket ad a tanulónak, hogy segítsen kijutni a holtpontról egy feladatban.
Jelenlét: Opcionális
## General fejléc alatt.A tippek megtekintése nem „javasolt” útvonal, és (finoman) el fogjuk tanácsolni a használatát, kivéve, ha a tanuló nélküle nem tud továbbhaladni. Ezért érdemes figyelembe venni, hogy az azt olvasó tanuló kicsit zavarodott vagy túlterhelt lesz, esetleg frusztrált.
## General
- There are many [built-in methods][integers] to simplify working with integers.
[integers]: https://ruby-doc.org/core-2.7.0/Integer.html
Cél: A feladat tervének leírása.
Jelenlét: Opcionális
Ez a fájl a feladat tervéről tartalmaz információkat, többek között a céljáról, a tanítási céljairól, arról, hogy mit ne tanítsunk, és egyebekről.
Azért létezik, hogy tájékoztassa a jövőbeli karbantartókat vagy közreműködőket egy feladat scope-járól és korlátairól, elkerülve azt a természetes tendenciát, hogy a feladatok idővel egyre bonyolultabbá váljanak.
# 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
Cél: A feladatra vonatkozó metaadatokat tartalmazza.
Jelenlét: Kötelező
Ez a fájl a feladatra vonatkozó metaadatokat tartalmazza:
authors: a feladat szerzőjének (szerzőinek) GitHub-felhasználóneve (opcionális)
contributors: a feladat közreműködőinek GitHub-felhasználóneve (opcionális)
files: a feladatban használt fájlok helye, a feladat könyvtárához viszonyítva (kötelező)
solution: a stub megvalósítás fájlja(i) (kötelező)test: a tesztfájl(ok) (kötelező)example: a példamegvalósítás fájlja(i) (kötelező)editor: további fájlok, amelyek csak olvashatóként jelennek meg a szerkesztőben (opcionális)invalidator: olyan fájlok, amelyek megváltoztatása elavulttá teszi a megoldást (opcionális)language_versions: nyelvi verziókövetelmények (opcionális)blurb: a feladat rövid leírása. A hossza <= 350. A Markdown nem támogatott (kötelező)source: a forrás, amelyen ez a feladat alapul (opcionális)source_url: annak a forrásnak az URL-je, amelyen ez a feladat alapul (opcionális)test_runner: jelzi, hogy a feladat megoldásait a tesztfuttatóban kell-e tesztelni. Ha nincs megadva, az alapértéke true. (opcionális)representer: metaadatok arról, hogyan dolgozza fel a representer ezt a fájlt (opcionális)
version: egész szám, a feladathoz használandó representer verziója (kötelező, ha a szülőkulcs jelen van)icon: az ikon slugja (lásd az ikonok teljes listáját). Ha nincs megadva, a feladat slugja lesz használva (opcionális)custom: bármilyen feladatspecifikus, nem szabványos adat. Arra használható, hogy feladatonként testre szabja a kurzus toolingjának viselkedését (opcionális)Ha valaki egyszerre szerző és közreműködő, csak szerzőként soroljuk fel.
{
"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"
}
Vedd figyelembe, hogy:
language_versions szabad formátumú string, amelyet a kurzusok tetszés szerint használhatnak és értelmezhetnek.Cél: Arról tartalmaz információt, hogy mely tesztek vannak megvalósítva.
Jelenlét: Opcionális
Ez a fájl arról tartalmaz információt, hogy mely tesztek vannak megvalósítva, feltéve, hogy a feladatnak van bármilyen tesztje a problem-specifications repóban található canonical-data.json fájljában.
Azért létezik, hogy segítsen a karbantartóknak nyomon követni, mely tesztek vannak megvalósítva, és hogy (opcionálisan) dokumentálja, miért nincs megvalósítva egy adott teszt. Arra is használható, hogy felderítse a nem megvalósított teszteket.
A configlet eszköz a configlet sync paranccsal végzi ennek a fájlnak a frissítését/szinkronizálását a problem-specifications repóban található adatokkal. Szinkronizáláskor a configlet minden nem megvalósított tesztnél megkérdezi, hogy belefoglalja-e azt vagy sem.
# 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
Cél: Bevezető a feladat leggyakoribb megközelítéseibe
Jelenlét: Opcionális
Ez a fájl a feladat leggyakoribb megközelítéseit írja le. Nézdd meg a dokumentációt, hogy többet megtudj arról, mi kerüljön ebbe a fájlba.
# 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
Cél: A megközelítések metaadatai
Jelenlét: Opcionális (kötelező, ha létezik megközelítés-bevezető vagy megközelítés)
Ez a fájl a feladat megközelítéseiről tartalmaz metaadatokat:
introduction: a feladat megközelítés-bevezetője szerzőjének (szerzőinek) GitHub-felhasználóneve (opcionális)
authors: a feladat megközelítés-bevezetője szerzőjének (szerzőinek) GitHub-felhasználóneve (kötelező)
contributors: a feladat megközelítés-bevezetője közreműködőinek GitHub-felhasználóneve (opcionális)
approaches: a részletes megközelítéseket felsoroló tömb (opcionális)
uuid: egy V4 UUID, amely egyedileg azonosítja a megközelítést. A UUID-nak egyedinek kell lennie mind a kurzuson belül, mind az összes kurzus között, és soha nem változhat megslug: a megközelítés slugja, amely egy kisbetűs, kebab-case string. A slugnak egyedinek kell lennie a kurzus összes megközelítés-slugja között. A hossza <= 255.title: a megközelítés címe. A hossza <= 255.blurb: a megközelítés rövid leírása. A hossza <= 350. A Markdown nem támogatott (kötelező)authors: a feladat megközelítése szerzőjének (szerzőinek) GitHub-felhasználóneve (kötelező)
contributors: a feladat megközelítése közreműködőinek GitHub-felhasználóneve (opcionális)
tags: meghatározza, milyen feltételek esetén kapcsolódik egy beküldés egy megközelítéshez. (opcionális)
all: olyan címkék tömbje, amelyeknek mind jelen kell lenniük egy beküldésen (opcionális, kivéve, ha az any egyetlen elemet sem tartalmaz)any: olyan címkék tömbje, amelyek közül legalább egynek jelen kell lennie egy beküldésen (opcionális, kivéve, ha az all egyetlen elemet sem tartalmaz)not: egyik címke sem lehet jelen egy beküldésen (opcionális){
"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
Cél: A megközelítés részletes leírása
Jelenlét: Opcionális (a megközelítéseknél kötelező)
Ez a fájl a megközelítés részletes leírását tartalmazza. Nézdd meg a dokumentációt, hogy többet megtudj arról, mi kerüljön ebbe a fájlba.
# 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
Cél: A megközelítést bemutató kódrészlet
Jelenlét: Opcionális (a megközelítéseknél kötelező)
Ez a fájl egy kis részletet tartalmaz, amely bemutatja a megközelítést. A részlet a feladat „Áss mélyebbre” oldalán jelenik meg.
A sorainak száma <= 8.
Nézdd meg a dokumentációt, hogy többet megtudj arról, mi kerüljön ebbe a fájlba.
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
Cél: A cikkek metaadatai
Jelenlét: Opcionális (kötelező, ha létezik cikk)
Ez a fájl a feladat cikkeiről tartalmaz metaadatokat:
articles: a részletes cikkeket felsoroló tömb (opcionális)
uuid: egy V4 UUID, amely egyedileg azonosítja a cikket. A UUID-nak egyedinek kell lennie mind a kurzuson belül, mind az összes kurzus között, és soha nem változhat megslug: a cikk slugja, amely egy kisbetűs, kebab-case string. A slugnak egyedinek kell lennie a kurzus összes cikk-slugja között. A hossza <= 255.title: a cikk címe. A hossza <= 255.blurb: a cikk rövid leírása. A hossza <= 350. A Markdown nem támogatott (kötelező)authors: a feladat cikke szerzőjének (szerzőinek) GitHub-felhasználóneve (kötelező)
contributors: a feladat cikke közreműködőinek GitHub-felhasználóneve (opcionális)
{
"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
Cél: A megközelítés részletes leírása
Jelenlét: Opcionális (a megközelítéseknél kötelező)
Ez a fájl a megközelítés részletes leírását tartalmazza. Nézdd meg a dokumentációt, hogy többet megtudj arról, mi kerüljön ebbe a fájlba.
# 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
Cél: A megközelítést bemutató kódrészlet
Jelenlét: Opcionális (a cikkeknél kötelező)
Ez a fájl egy kis részletet tartalmaz, amely bemutatja a cikket. A részlet a feladat „Áss mélyebbre” oldalán jelenik meg.
A sorainak száma <= 8.
Nézdd meg a dokumentációt, hogy többet megtudj arról, mi kerüljön ebbe a fájlba.
| Method | Mean | Allocated |
| -----: | --------: | --------: |
| Linq | 29.133 ns | 80 B |
| Array | 4.806 ns | - |
Cél: Kiindulópontot ad a tanulóknak.
Jelenlét: Kötelező
.meta/config.json fájl "files.solution" kulcsában kell megadni.using System;
public static class Isogram
{
public static bool IsIsogram(string word)
{
throw new NotImplementedException("You need to implement this function.");
}
}
Cél: A megoldás helyességének ellenőrzése.
Jelenlét: Kötelező
.meta/config.json fájl "files.test" kulcsában kell megadni.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"));
}
Cél: Olyan példamegvalósítást ad, amely minden teszten átmegy.
Jelenlét: Kötelező
.meta/config.json fájl "files.example" kulcsában kell megadni.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él: További projekt-, build- vagy támogatófájlok, amelyek szükségesek a tesztek futtatásához.
Jelenlét: Kötelező, ha az alapértelmezett fájlok nem elegendőek a tesztek futtatásához
Egyes nyelveknél további fájlok kellenek a tesztek futtatásához. Ilyenek például a C# projektfájljai és a Node package.json fájljai, amelyek nélkül nem lehet futtatni a teszteket.
Egyes fájlok nem egyedi feladatokhoz kapcsolódnak, hanem minden feladatra érvényesek. Nézd meg a dokumentációt további információért.
Különbség van abban, hogyan jelenítjük meg a feladat dokumentációját a tanulónak a böngészőben futó szerkesztő és a CLI használata esetén. További információért lásd ezt a dokumentumot.
Minden feladathoz tartozik egy kísérő ikon.
Alapértelmezés szerint az az ikon jelenik meg, amelynek a neve megegyezik a feladat slugjával.
Ezt felül lehet bírálni az icon tulajdonság megadásával a feladat .meta/config.json fájljában.
Ha egy feladatot a problem-specifications metaadatai alapján valósítasz meg, valószínűleg már létezik ikon ahhoz a feladathoz. Ha nem, kérjük, nyiss egy issue-t a website-icons repóban.