Gyakorlófeladatok


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 👇

Note

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

Metaadatok

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.

Példa

{
  "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

A practices kulcs azoknak a fogalmaknak a slugjait sorolja fel, amelyeket ez a gyakorlófeladat aktívan gyakoroltat a tanulóval.

  • Ezek a felületen így jelennek meg: „Gyakorold ezt a fogalmat itt: TwoFer, Leap stb.”
  • Igyekezz 3-8 feladatot választani, amelyek gyakoroltatják az adott fogalmat.
  • Igyekezz legalább két olyan feladatot választani, amelyek segítségével valaki gyakorolhatja egy fogalom alapjait.
  • Néhány fogalom nagyon gyakori (például a 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.

prerequisites

A prerequisites kulcs azokat a fogalmakat sorolja fel, amelyeket a tanulónak teljesítenie kell ahhoz, hogy hozzáférjen ehhez a gyakorlófeladathoz.

  • Ezek a felületen így jelennek meg: „Tanuld meg a stringeket a TwoFer feloldásához”
  • Minden olyan fogalmat tartalmazzon, amelyet a tanulónak ismernie kell ahhoz, hogy a feladatot legalább egy idiomatikus módon meg tudja oldani. A Ruby nyelvű TwoFer feladatnál például az előfeltételek között szerepelhet a strings, az optional-params és az implicit-return.
  • Azoknál a feladatoknál, amelyek alternatív fogalmakkal is megoldhatók (például egy feladat megoldható 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.”

Fájlok

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:

Dokumentációs fájlok

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)

Metaadatfájlok

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)

Megközelítésfájlok

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)

Cikkfájlok

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)

Feladatfájlok

A nyelvspecifikus fájlok, például a megvalósítási és tesztfájlok. Ezeknek a fájloknak a nevei kurzusspecifikusak.

  • Tesztcsomag: ellenőrzi a megoldás helyességét.
  • Stub megvalósítás: kiindulópontot ad a tanulóknak.
  • Példa megvalósítás: olyan példamegvalósítást ad, amely minden teszten átmegy.
  • További fájlok: biztosítják, hogy a tesztek lefuthatnak.

Példa

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)

Fájl: .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:

  • Igyekezz biztosítani, hogy a történet befogadó legyen, és mindenki megértse. Ha a történet belsős vicceket vagy regionális szlenget tartalmaz, gondolj alternatív megfogalmazásokra.
  • Igyekezz olyan példákat írni, amelyek mindenkit befogadnak. Gondolj például más kultúrákból származó nevek és vegyes nemek használatára.
  • Kérdezd meg magadtól, ismersz-e személyesen olyat, akit megsértene a történet. Ha igen, gondold át, hogyan változtasd meg, hogy elkerüld ezt.

Példa

# Introduction

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

Fájl: .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.

Fájl: .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:

  • Igyekezz biztosítani, hogy a történet befogadó legyen, és mindenki megértse. Ha a történet belsős vicceket vagy regionális szlenget tartalmaz, gondolj alternatív megfogalmazásokra.
  • Igyekezz olyan példákat írni, amelyek mindenkit befogadnak. Gondolj például más kultúrákból származó nevek és vegyes nemek használatára.
  • Kérdezd meg magadtól, ismersz-e személyesen olyat, akit megsértene a történet. Ha igen, gondold át, hogyan változtasd meg, hogy elkerüld ezt.

Példa

# 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.

Fájl: .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.

Fájl: .docs/hints.md

Cél: Tippeket ad a tanulónak, hogy segítsen kijutni a holtpontról egy feladatban.

Jelenlét: Opcionális

  • Ha a tanuló elakad, engedjük, hogy egy gombra kattintva tippet kérjen, amely megjeleníti a fájl megfelelő részét.
  • A tippeket felsorolásjelekkel, fejlécek alatt kell megadni.
  • A tippek legyenek elegendőek ahhoz, hogy szinte minden tanulót kisegítsenek.
  • A tippek ne írják le a megoldást, hanem mutassanak egy olyan forrásra, amely leírja a megoldást (például linkeljenek a használandó függvény dokumentációjára).
  • A tippek használhatnak kódpéldákat a fogalmak magyarázatára, de nem a megoldás felvázolására. Egy listás feladatnál például mutathatnak egy részletet arról, hogyan működik egy bizonyos listafüggvény, de nem olyan formában, hogy az közvetlenül beillesszthető legyen a megoldásba.
  • A tippeknek Markdown-listaként kell megjelenniük egy ## General fejléc alatt.
  • Ha nincsenek tippek, a fejlécet el kell hagyni.

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.

Példa

## General

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

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

Fájl: .meta/design.md

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.

Példa

# 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.

Fájl: .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)
    • Ide tartoznak azok a bírálók is, akiknek a bírálata lényegesen megváltoztatja a feladatot (olyannyira, hogy úgy tűnik, „együtt jutottatok el odáig”)
  • contributors: a feladat közreműködőinek GitHub-felhasználóneve (opcionális)
    • Ide tartoznak azok a bírálók is, akiknek a bírálata tartalmas / hasznosítható / hasznosított.
  • files: a feladatban használt fájlok helye, a feladat könyvtárához viszonyítva (kötelező)
  • 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.

Példa

{
  "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:

  • A szerzők és közreműködők sorrendje nem számít, és nincs jelentése.
  • A language_versions szabad formátumú string, amelyet a kurzusok tetszés szerint használhatnak és értelmezhetnek.

Fájl: .meta/tests.toml

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.

Példa

# 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"

Fájl: .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.

Példa

# 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.

Fájl: .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ő)
      • Ide tartoznak azok a bírálók is, akiknek a bírálata lényegesen megváltoztatja a feladat megközelítés-bevezetőjét (olyannyira, hogy úgy tűnik, „együtt jutottatok el odáig”)
    • contributors: a feladat megközelítés-bevezetője közreműködőinek GitHub-felhasználóneve (opcionális)
      • Ide tartoznak azok a bírálók is, akiknek a bírálata tartalmas / hasznosítható / hasznosított.
  • 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 meg
    • slug: 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ő)
      • Ide tartoznak azok a bírálók is, akiknek a bírálata lényegesen megváltoztatja a feladat megközelítését (olyannyira, hogy úgy tűnik, „együtt jutottatok el odáig”)
    • contributors: a feladat megközelítése közreműködőinek GitHub-felhasználóneve (opcionális)
      • Ide tartoznak azok a bírálók is, akiknek a bírálata tartalmas / hasznosítható / hasznosított.
    • 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)

Példa

{
  "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"]
    }
  ]
}

Fájl: .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.

Példa

# 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.

Fájl: .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.

Példa

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);

Fájl: .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 meg
    • slug: 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ő)
      • Ide tartoznak azok a bírálók is, akiknek a bírálata lényegesen megváltoztatja a feladat cikkét (olyannyira, hogy úgy tűnik, „együtt jutottatok el odáig”)
    • contributors: a feladat cikke közreműködőinek GitHub-felhasználóneve (opcionális)
      • Ide tartoznak azok a bírálók is, akiknek a bírálata tartalmas / hasznosítható / hasznosított.

Példa

{
  "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"]
    }
  ]
}

Fájl: .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.

Példa

# 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 |         - |

Fájl: .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.

Példa

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

Fájl: Stub megvalósítás

Cél: Kiindulópontot ad a tanulóknak.

Jelenlét: Kötelező

  • Úgy tervezd meg a stubot, hogy a tanuló tudja, hova kell kódot írnia.
  • A fordított nyelveknél fontold meg, hogy a kód leforduljon, mert a fordító üzenetei néha nehezen érthetők a nyelvben újonc tanulóknak.
  • A kód legyen a lehető legegyszerűbb.
  • Csak az előfeltételek (és azok előfeltételei, és így tovább) által bevezetett nyelvi elemeket használd.
  • A stub fájl megjelenik a tanulónak, amikor a böngészőben kódol, és letöltődik a tanuló fájlrendszerére, amikor a CLI-t használja.
  • A stub megvalósítás fájljához vezető relatív útvonalakat a .meta/config.json fájl "files.solution" kulcsában kell megadni.

Példa

using System;

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

Fájl: Tesztek

Cél: A megoldás helyességének ellenőrzése.

Jelenlét: Kötelező

  • A kód legyen a lehető legegyszerűbb.
  • Csak a feladat előfeltételei (és azok előfeltételei, és így tovább) által bevezetett nyelvi elemeket használd.
  • A tesztfájl megjelenik a tanulónak, amikor a böngészőben kódol, és letöltődik a tanuló fájlrendszerére, amikor a CLI-t használja.
  • Az Exercism azt részesíti előnyben, hogy a gyakorlófeladatokat tesztvezérelt fejlesztéssel oldják meg. Ennek eléréséhez két lehetőség van:
    • A tesztfuttatónak a fájlban meghatározott sorrendben kell futtatnia a teszteket, ÉS a tesztcsomagnak le kell állnia az első hibánál; vagy
    • Az első kivételével minden tesztet alapértelmezés szerint ki kell hagyni.
  • A tesztfájl(ok)hoz vezető relatív útvonalakat a .meta/config.json fájl "files.test" kulcsában kell megadni.

Példa

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"));
}

Fájl: Példa megvalósítás

Cél: Olyan példamegvalósítást ad, amely minden teszten átmegy.

Jelenlét: Kötelező

  • Ezt a megvalósítást arra használjuk, hogy ellenőrizzük: létezik olyan megvalósítás, amely átment a teszteken. Szándékosan nem az a célkód, amelyre a tanulónak törekednie kell.
  • Minden kurzumnak a folyamatos integrációs környezetében ellenőriznie kell, hogy a példamegvalósítás átmegy a teszteken.
  • A mentoroknak nem jelenítjük meg ezt a kódot.
  • A példafájl nem jelenik meg a tanulónak, amikor a böngészőben kódol, és nem töltődik le a tanuló fájlrendszerére, amikor a CLI-t használja.
  • A példamegvalósítás fájljához vezető relatív útvonalakat a .meta/config.json fájl "files.example" kulcsában kell megadni.

Példa

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;
    }
}

Fájl: További fájlok

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.

Megosztott fájlok

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.

Megjelenítés

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.

Ikon

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.