A tanulófeladatok olyan feladatok, amelyek célja, hogy meghatározott (programozási) fogalmakat tanítsanak. A tanulófeladatok által tanított fogalmak egy tantervet alkotnak. Ha többet szeretnél megtudni arról, hogyan tervezz tantervet, nézd meg a tanterv dokumentációt.
Egy új tanulófeladatot gyorsan létrehozhatsz, ha a következő parancsokat futtatod a kurzus gyökérkönyvtárából:
bin/fetch-configlet
bin/configlet create --concept-exercise <slug>
További információért nézd meg a configlet create dokumentációt
A tanulófeladatok metaadatai az exercises.concept kulcsban vannak meghatározva a config.json fájlban. A metaadatok meghatározzák a feladat UUID-jét, slugját és egyebeket.
{
"exercises": {
"concept": [
{
"uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
"slug": "cars-assemble",
"name": "Cars, Assemble!",
"concepts": ["if-statements", "numbers"],
"prerequisites": ["basics"]
}
]
}
}
Minden tanulófeladatnak saját könyvtára van a kurzus exercises/concept könyvtárán belül. A tanulófeladat könyvtárának nevének meg kell egyeznie a tanulófeladat slug tulajdonságával, ahogyan az a config.json fájlban meg van határozva.
A tanulófeladatban négyféle fájl található:
Ezeket a fájlokat megmutatjuk a tanulónak, hogy segítsenek elmagyarázni a feladatot.
.docs/introduction.md: bemutatja a feladat által a tanulónak tanított fogalmat/fogalmakat (kötelező).docs/instructions.md: útmutatást ad a feladathoz (kötelező).docs/hints.md: tippeket ad a tanulónak, hogy segítsen neki, ha elakad egy feladatban (kötelező)Ezeket a fájlokat nem mutatjuk meg a tanulónak, hanem a feladat metaadatainak meghatározására szolgálnak.
.meta/config.json: a feladatra vonatkozó metaadatokat tartalmaz (kötelező).meta/design.md: leírja a feladat kialakítását (kötelező)Ezek a fájlok a feladathoz tartozó megközelítéseket írják le.
.approaches/introduction.md: bevezetés 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ó ré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ó részlet (opcionális)A nyelvspecifikus fájlok, mint például a megvalósítás és a tesztek fájljai. Ezeknek a fájloknak a neve kurzusspecifikus.
exercises
└── concept
└── cars-assemble
├── .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
| └── Exemplar.cs (exemplar megvalósítás)
├── CarsAssemble.cs (stub megvalósítás)
└── CarsAssemblyTests.cs (tesztek)
Az új feladatoknál az „optimista összevonás” megközelítést részesítjük előnyben, ahol a kurzusok „fejlesztés alatt” állapotban dolgozhatják ki a feladatokat. A minimális érvényes állapot, amely átmegy a configleten, és lehetővé teszi az összevonást:
config.json fájljában, a status wip-re állítva..meta/config.json fájl.docs/introduction.md.docs/instructions.md.docs/hints.md.docs/introduction.md
Cél: A feladat által a tanulónak tanított fogalom/fogalmak bemutatása.
Meglét: kötelező
about.md dokumentumában hagyd.Például egy „stringekkel” foglalkozó feladat bevezetése leírhatja a stringet pusztán „Unicode-karakterek sorozataként” vagy „bájtok sorozataként”, elmagyarázhatja a felhasználóknak, hogyan hozhatnak létre stringet, és kifejtheti, hogy a stringnek vannak metódusai, amelyekkel módosítható. Hacsak a tanulónak nem kell részletesebb összefüggéseket megértenie a feladat megoldásához, az ilyen rövid magyarázat (a szintaxisára vonatkozó példával együtt) elegendő információt nyújt a tanulónak a feladat megoldásához.
# Introduction
There are two primary ways to assign objects to names in Ruby - using variables or constants. Variables are always written in snake case. A variable can reference different objects over its lifetime. For example, `my_first_variable` can be defined and redefined many times using the `=` operator:
```ruby
my_first_variable = 1
my_first_variable = "Some string"
my_first_variable = SomeComplexObject.new
```
.docs/introduction.md.tpl
Cél: Sablon, amelyből egy introduction.md fájl generálható.
Meglét: opcionális
Az introduction.md dokumentum bemutatja a feladat fogalma(it) a tanulónak. Minden fogalomnak megvan a maga introduction.md dokumentuma is, amelyet a feladat kontextusán kívül nem mutatunk meg.
Ha a fogalom bevezetését szó szerint bele kell foglalni a feladat bevezetésébe, használható egy introduction.md.tpl fájl. Ez a fájl lehetővé teszi a fogalmak bevezetéseire való hivatkozást helyőrzőkön keresztül: %{concept:<concept-slug>}.
A configlet képes egy introduction.md fájlt létrehozni egy sablonfájlból. A létrehozott fájlban a fogalom helyőrzőit a fogalom introduction tartalma helyettesíti.
Az Exercism weboldala csak az introduction.md dokumentumról tud. A kurzus felelőssége, hogy létrehozza az introduction.md fájlt, amikor sablonfájlt használ.
A kurzusok feladatonként eldönthetik, hogy használnak-e sablont. Bizonyos esetekben nem biztos, hogy optimális a fogalom bevezetését szó szerint beilleszteni. Mindig azt válaszd, ami a legjobb tanulási élményt nyújtja a tanulónak.
# Introduction
%{concept:variables}
.docs/instructions.md
Cél: Útmutatást adni a feladathoz.
Meglét: kötelező
Ez a fájl két részre oszlik.
Minden részfeladatnak meg kell felelnie a következő szabványnak:
## 1. Do X, ## 2. Do Y).## 1. Check if an appointment has already passed).Implement method X(...) that takes an A and returns a Z),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ésénél gyakran inkább az óvatosabb utat választjuk. Bár odafigyelünk arra, mit vonunk össze, tisztában vagyunk vele, hogy nehéz észrevenni, mi tűnhet problémásnak, ezért mindig feltételezzük, hogy jóhiszeműen jársz el, és igyekszünk a felülvizsgálat során minden problémát konfrontálódás nélkül elkapni. Ha szeretnél egy történetet ellenőrizni velünk, említsd meg az @exercism/leadership csapatot, és együtt megnézzük. Íme néhány iránymutató pont:
# Instructions
In this exercise you're going to write some code to help you cook a brilliant lasagna from your favorite cooking book.
## 1. Calculate the remaining oven time in minutes
Define the `Lasagna#remaining_minutes_in_oven` method that takes the actual minutes the lasagna has been in the oven as a parameter and returns how many minutes the lasagna still has to remain in the oven, based on the expected oven time in minutes from the previous task.
```ruby
lasagna = Lasagna.new
lasagna.remaining_minutes_in_oven(30)
# => 10
```
.docs/hints.md
Cél: Tippeket adni a tanulónak, hogy segítsen neki, ha elakad egy feladatban.
Meglét: kötelező
## General címsor alatt.instructions.md fájlban (pl. ## 2. Do Y).## 2. Check if a book can be borrowed).Implement the 'canBorrowBook' function to check if a book can be borrowed. The function takes a book as its parameter and returns `true` if the book has not already been borrowed; otherwise, return `false`).A tippek megtekintése nem „ajánlott” útvonal lesz, és (finoman) lebeszélünk róla, hacsak a tanuló nem tud nélküle továbbhaladni. Ezért érdemes figyelembe venni, hogy az azt olvasó tanuló kicsit zavart/elveszett és talán frusztrált lesz.
# Hints
## General
- You need to define a [constant][constant] which should contain the [integer][integers] value specified in the recipe.
## 1. Calculate the remaining oven time in minutes
- You need to define a [method][methods] with a single parameter for the actual time so far.
[constants]: https://www.rubyguides.com/2017/07/ruby-constants/
[integers]: https://ruby-doc.org/core-2.7.0/Integer.html
[methods]: https://launchschool.com/books/ruby/read/methods
Cél: A feladat kialakításának leírása.
Meglét: kötelező
Ez a fájl a feladat kialakítására vonatkozó információkat tartalmaz, beleértve a célját, a tanítási céljait, azt, hogy mit nem szabad tanítani, és egyebeket. Ezek az információk kinyerhetők a feladathoz tartozó GitHub-issue-ból.
Azért létezik, hogy tájékoztassa a jövőbeli karbantartókat vagy közreműködőket a feladat scope-járól és korlátairól, elkerülve azt a természetes tendenciát, hogy a feladatok idővel egyre összetettebbekké válnak.
# Design
## Goal
The goal of this exercise is to teach the student the basics of programming in Ruby.
## Learning objectives
- Know what a variable is.
- Know how to define a variable.
- Know how to update a variable.
## Out of scope
- Memory and performance characteristics.
- Method overloads.
## Concepts
The Concepts this exercise unlocks are:
- `basics`: know what a variable is; know how to define a variable; know how to update a variable.
## Prerequisites
There are no prerequisites.
.meta/config.json
Cél: A feladatra vonatkozó metaadatokat tartalmaz.
Meglét: kötelező
Ez a fájl a feladatra vonatkozó metaadatokat tartalmazza:
authors: A feladat szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
contributors: A feladat közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (opcionális)
forked_from: Melyik feladat(ok)ból forkolták (kötelező, ha a feladat forkolt)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ájl(ok) (kötelező)test: a tesztfájl(ok) (kötelező)exemplar: az exemplar megvalósítás fájl(ok) (kötelező)editor: a szerkesztőben csak olvashatóként megjelenő egyéb fájlok (opcionális)invalidator: olyan fájlok, amelyek módosításakor a megoldás elavulttá válik (opcionális)language_versions: Nyelvi verziókövetelmények (opcionális)blurb: A feladat rövid leírása. A hossza legfeljebb 350 lehet. A Markdown nem támogatott (kötelező)source: A forrás, amelyen a feladat alapul (opcionális)source_url: A forrás URL-je, amelyen a feladat alapul (opcionális)representer: Azzal kapcsolatos metaadatok, hogy a representer hogyan dolgozza fel ezt a fájlt (opcionális)
version: Egész szám, amely a feladathoz használandó representer verzióját adja meg (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. A kurzus toolingjának feladatonkénti viselkedésének testreszabására használható (opcionális)Ha valaki egyszerre szerző és közreműködő, csak szerzőként sorold fel.
{
"authors": ["FSharpForever"],
"files": {
"solution": ["Lasagna.fs"],
"test": ["LasagnaTests.fs"],
"exemplar": [".meta/Exemplar.fs"]
},
"blurb": "Learn the basics of F# by cooking Lucian's Luscious Lasagna"
}
Tegyük fel, hogy a FSharpForever felhasználó írt egy log-levels nevű feladatot az F# kurzushoz. A PythonProfessor átalakítja a feladatot a Python kurzushoz. Később a GladToHelp felhasználó továbbfejleszti a feladatot.
{
"authors": ["PythonProfessor"],
"contributors": ["GladToHelp"],
"files": {
"solution": ["log_levels.py"],
"test": ["log_levels_test.py"],
"exemplar": [".meta/exemplar.py"],
"editor": ["test_helper.py"]
},
"forked_from": ["fsharp/log-levels"],
"language_versions": ">=3.7",
"blurb": "Learn how to work with strings by processing log lines.",
"source": "Wikipedia",
"source_url": "https://en.wikipedia.org/wiki/Log_file",
"representer": {
"version": 2
},
"icon": "logs",
"custom": {
"parallel": true
}
}
Vedd figyelembe, hogy:
forked_from helyes legyen.language_versions egy szabad formátumú string, amelyet a kurzusok tetszés szerint használhatnak és értelmezhetnek..approaches/introduction.md
Cél: Bevezetés a feladat leggyakoribb megközelítéseibe
Meglét: opcionális
Ez a fájl a feladat leggyakoribb megközelítéseit írja le. Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.
# 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
Meglét: opcionális (kötelező, ha létezik megközelítés-bevezetés vagy megközelítés)
Ez a fájl a feladat megközelítéseire vonatkozó metaadatokat tartalmazza:
introduction: A feladat megközelítés-bevezetésének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (opcionális)
authors: A feladat megközelítés-bevezetésének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
contributors: A feladat megközelítés-bevezetésének közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (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 a kurzusan belül és az összes kurzuson át is, és soha nem változhatslug: a megközelítés slugja, amely kisbetűs, kebab-case formátumú string. A slugnak egyedinek kell lennie a kurzushoz tartozó összes megközelítés-slug közül. A hossza legfeljebb 255 lehet.title: a megközelítés címe. A hossza legfeljebb 255 lehet.blurb: A megközelítés rövid leírása. A hossza legfeljebb 350 lehet. A Markdown nem támogatott (kötelező)authors: A feladat megközelítésének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
contributors: A feladat megközelítésének közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (opcionális)
tags: Meghatározza, milyen feltételek mellett kapcsolódik egy beküldés egy megközelítéshez. (opcionális)
all: Olyan tagek tömbje, amelyeknek mind jelen kell lenniük egy beküldésnél (opcionális, kivéve, ha az any-nek nincsenek elemei)any: Olyan tagek tömbje, amelyek közül legalább egynek jelen kell lennie egy beküldésnél (opcionális, kivéve, ha az all-nak nincsenek elemei)not: egyik tag sem lehet jelen egy beküldésnél (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
Meglé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. Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.
# 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ó részlet
Meglé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 legfeljebb 8 lehet.
Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.
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
Meglét: opcionális (kötelező, ha létezik cikk)
Ez a fájl a feladat cikkeire vonatkozó metaadatokat tartalmazza:
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 a kurzusan belül és az összes kurzuson át is, és soha nem változhatslug: a cikk slugja, amely kisbetűs, kebab-case formátumú string. A slugnak egyedinek kell lennie a kurzushoz tartozó összes cikk-slug közül. A hossza legfeljebb 255 lehet.title: a cikk címe. A hossza legfeljebb 255 lehet.blurb: A cikk rövid leírása. A hossza legfeljebb 350 lehet. A Markdown nem támogatott (kötelező)authors: A feladat cikkének szerzőjének/szerzőinek GitHub-felhasználóneve(i) (kötelező)
contributors: A feladat cikkének közreműködőjének/közreműködőinek GitHub-felhasználóneve(i) (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
Meglé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. Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.
# 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ó részlet
Meglé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 legfeljebb 8 lehet.
Ha többet szeretnél megtudni arról, mi kerüljön ebbe a fájlba, nézd meg a dokumentációt.
| Method | Mean | Allocated |
| -----: | --------: | --------: |
| Linq | 29.133 ns | 80 B |
| Array | 4.806 ns | - |
Cél: Kiindulópontot adni a tanulóknak.
Meglét: kötelező
.meta/config.json fájl "files.solution" kulcsában kell megadni.class Lasagna
def remaining_minutes_in_oven(actual_minutes_in_oven)
raise NotImplementedError, 'Please implement the Lasagna#remaining_minutes_in_oven method'
end
def preparation_time_in_minutes(layers)
raise NotImplementedError, 'Please implement the Lasagna#preparation_time_in_minutes method'
end
end
Cél: A megoldás helyességének ellenőrzése.
Meglét: kötelező
instructions.md fájl példáit..meta/config.json fájl "files.test" kulcsában kell megadni.require 'minitest/autorun'
require_relative 'lasagna'
class LasagnaTest < Minitest::Test
def test_remaining_minutes_in_oven
assert_equal 15, Lasagna.new.remaining_minutes_in_oven(25)
end
def test_preparation_time_in_minutes_with_one_layer
assert_equal 2, Lasagna.new.preparation_time_in_minutes(1)
end
def test_preparation_time_in_minutes_with_multiple_layers
assert_equal 8, Lasagna.new.preparation_time_in_minutes(4)
end
end
Cél: Biztosítani azt a célmegvalósítást, amelyre a tanulónak törekednie kell.
Meglét: kötelező
.meta/config.json fájl "files.exemplar" kulcsában kell megadni.class Lasagna
EXPECTED_MINUTES_IN_OVEN = 40
PREPARATION_MINUTES_PER_LAYER = 2
def remaining_minutes_in_oven(actual_minutes_in_oven)
EXPECTED_MINUTES_IN_OVEN - actual_minutes_in_oven
end
def preparation_time_in_minutes(layers)
layers * PREPARATION_MINUTES_PER_LAYER
end
end
Cél: Biztosítani, hogy a tesztek lefuthassanak.
Meglét: kötelező, ha az alapértelmezett fájlok nem elegendőek a tesztek futtatásához
Egyes nyelveknél további fájlokra van szükség 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 tartoznak, hanem minden feladatra érvényesek. További információért nézd meg a dokumentációt.
A tanulófeladatokat a történetük/témájuk alapján kell elnevezni, nem a fogalmaik alapján.
Jó példák nevekre:
Tim from MarketingLucian's Luscious LasagnaCalculator ConundrumNem megengedett nevek:
Booleans: fogalomnevet használ, nem történetnevetExercise #1: egy feladat nem történet/témaAmikor egy feladatot jelentős változtatások nélkül forkolsz, lehetőség szerint az eredeti nevet használd.
Minden feladatnak van egy slugja is, amely a feladat nevének normalizált változata a következő szabályok szerint:
[a-z0-9-]+)two-fer a 2-fer helyett)Jó példák slugokra:
tim-from-marketinglucians-luscious-lasagnacalculator-conundrumNem megengedett slugok:
TIM-FROM-MARKETING: nem használ kisbetűket (vagyis tim-from-marketing)TimFromMarketing: nem kebab-case formátumú (vagyis tim-from-marketing)floating-point-numbers: fogalomnevet használ, nem történetnevetKülönbség van abban, hogyan jelenítjük meg a feladat dokumentációját a tanulónak a böngészőbeli szerkesztő használatakor a CLI használatához képest. További információért lásd ezt a dokumentumot.
Minden feladathoz tartozik egy kísérő ikon.
Alapértelmezés szerint a megjelenített ikon az, 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 meglévő feladatot forkolsz, valószínűleg már van ikon ahhoz a feladathoz. Ha nincs, kérünk, nyiss egy issue-t a website-icons tárolóban.