Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Strings Concept Exercise Re-Write #2433

Merged
merged 16 commits into from
May 29, 2021
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
"exercises": {
"concept": [
{
"slug": "processing-logs",
"name": "Processing Logs",
"slug": "little-sisters-vocab",
"name": "Little Sisters Vocab",
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
"uuid": "5a9b42fb-ddf4-424b-995d-f9952ea63c37",
"concepts": ["strings"],
"prerequisites": ["basics"],
Expand Down
39 changes: 39 additions & 0 deletions exercises/concept/little-sisters-vocab/.docs/hints.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Hints

## General

- The [Python Docs Tutorial for strings][python-str-doc] has an overview of the Python `str` type.
- String methods [<str>.join()][str-join] and [<str>.split()][str-split] ar very helpful when processing strings.
- The [Python Docs on Sequence Types][common sequence operations] has a rundown of operations common to all sequences, including `strings`, `lists`, `tuples`, and `ranges`.

You're helping your younger sister with her English vocabulary homework, which she's finding very tedious. Her class is learning to create new words by adding _prefixes_ and _suffixes_, and have been given different sets of words to modify. The teacher is looking for correctly transformed words and correct spelling, given the word beginning or ending.

BethanyG marked this conversation as resolved.
Show resolved Hide resolved
There's four activities in the assignment, each with a set of text or words to work with.

## 1. Add a prefix to a word

- Small strings can be concatenated with the `+` operator.

## 2. Add prefixes to word groups

- Believe it or not, <str>.join() is all you need.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
- Like `<str>.split()`, `<str>.join()` can take an arbitrary-length string, made up of any unicode code points.

## 3. Remove a suffix from a word

- Strings can be both indexed and sliced from either the left (starting at 0) or the right (starting at -1).
- If you want the last code point of an arbitrary-length string, you can use [-1].
- The last three letters in a string can be "sliced off" using a negative index. e.g. 'beautiful'[:-3] == 'beauti'

## 4. Extract and transform a word

- Using `<str>.split()` returns a list of strings broken on white space.
- `lists` are sequences, and can be indexed.
- `<str>.split()` can be direcly indexed. e.g. `'Exercism rocks!'.split()[0] == 'Exercism'`
- Be careful of punctuation! Periods can be removed via slice: `'dark.'[:-1] == 'dark'`

[python-str-doc]: https://docs.python.org/3/tutorial/introduction.html#strings

[common sequence operations]: https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str
[str-join]: https://docs.python.org/3/library/stdtypes.html#str.join
[str-split]: https://docs.python.org/3/library/stdtypes.html#str.split
69 changes: 69 additions & 0 deletions exercises/concept/little-sisters-vocab/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Instructions

You're helping your younger sister with her English vocabulary homework, which she's finding very tedious. Her class is learning to create new words by adding _prefixes_ and _suffixes_, and have been given different sets of words to modify. The teacher is looking for correctly transformed words and correct spelling, given the word beginning or ending.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

There's four activities in the assignment, each with a set of text or words to work with.

## 1. Add a prefix to a word

One of the most common prefixes in English is `un`, meaning "not". In this activity, your sister needs to make negative, or "not" words by adding `un` to them.

Implement the `add_prefix_un()` function that takes `word` as a parameter and returns a new `un` prefixed word:

```python
>>> add_prefix_un("happy")
'unhappy'

>>> add_prefix("manageable")
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
'unmanagable'
```

## 2. Add prefixes to word groups

There are four more common prefixes that your sister's class is studying: `en` (_meaning to 'put into' or 'cover with'_), `pre` (_meaning before or forward _), `auto` (_meaning self or same_), and `inter` (_meaning between or among_). In this exercise, the class is creating groups of vocabulary words using these prefixes, so they can be studied together. Each prefix comes in a list with common words it's used with. The students need to apply the prefix and produce a string that shows the prefix and the words with the prefix applied.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

Implement the `make_word_groups()` function that takes a `vocab_words` as a parameter in the following form: [`<prefix>`, `word_1`, `word_2` .... `word_n`], and returns a string with the prefix applied to each word that looks like `'<prefix> :: <prefix><word_1> :: <prefix><word_2> :: <prefix><word_n>'`.

```python
>>> make_word_groups(['en', close, joy, lighten])
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
'en :: enclose :: enjoy :: enlighten'

>>> make_word_groups(['pre', serve, dispose, position])
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
'pre :: preserve :: predispose :: preposition'

>> make_word_groups(['auto', 'didactic', 'graph', 'mate'])
'auto :: autodidactic :: autograph :: automate'

>>> make_word_groups(['inter', 'twine', 'connected', 'dependant'])
'inter :: intertwine :: interconnected :: interdependant'
```

## 3. Remove a suffix from a word

`ness` is a common suffix that means "state of being". In this activity, your sister needs to "extract" the original root word by removing the `ness` suffix. But of course there are pesky spelling rules. If the root word originally ended in a consonant followed by a 'y', then the 'y' was changed to to 'i'. So removing the 'ness' needs to restore the 'y' in the original word. `happiness` --> `happi` --> `happy`.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

Implement the `remove_suffix_ness()` function that takes in a word and returns the base word with `ness` removed.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

```python
>>> remove_suffix_ness("heaviness")
'heavy'

>>> remove_suffix_ness("sadness")
'sad'
```

## 4. Extract and transform a word

Suffixes are often used to change the part of speech a word has. A common practice in English is "verbing" or "verbifying" -- where a ajective _becomes_ a verb by adding an `en` suffix.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

In this task, your sister is going to practice "verbing" by extracting an ajective from a sentence and turning it into a verb. Fortunately, all the words that need to be transformed here are "regular" - they don't need spelling changes to add the suffix.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

Implement the `noun_to_verb()` function that takes two parameters. A `sentence` using the vocabulary word, and the `index` of the word, once that sentence is split apart. The function should return the extracted ajective as a verb.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

```python
>>> noun_to_verb('I need to make that bright.', -1 )
'brighten'

>>> noun_to_verb('It got dark as the sun set.', 2)
'darken'
```
203 changes: 203 additions & 0 deletions exercises/concept/little-sisters-vocab/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
# Introduction

A `str` in Python is an [immutable sequence][text sequence] of [Unicode code points][unicode code points].
These could include letters, diacritical marks, positioning characters, numbers, currecy symbols, emoji, punctuation, space and line break characters, and more.
Being immutable, a `str` object's value in memory doesn't change; methods that appear to modify a string return a new copy or instance of `str`.

A `str` literal can be declared via single `'` or double `"` quotes. The escape `\` character is available as needed.

```python

>>> single_quoted = 'These allow "double quoting" without "escape" characters.'

>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character".
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
```

Muliti-line strings are declared with `'''` or `"""`.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

```python
>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
Line break characters, tabs and other whitespace is fully supported.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

You\'ll most often encounter these as "doc strings" or "doc tests" written just below the first line of a function or class definition.
They\'re often used with auto documentation ✍ tools.
'''
```

Strings can be concatenated using the `+` operator.
This method should be used sparingly, as it is not very performant or easily maintained.

```python
language = "Ukrainian"
number = "nine"
word = "девять"

sentence = word + " " + "means" + " " + number + " in " + language + "."

>>> print(sentence)
...
"девять means nine in Ukrainian."
```

If a `list`, `tuple`, `set` or other collection of individual strings needs to be combined into a single `str`, [`<str>.join(<iterable>)`][str-join], is a better option:

```python
# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"]
>>> ' '.join(chickens)
'hen egg rooster'

# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'

>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'
```

Code points within a `str` can be referenced by 0-based index number from the left:

```python
creative = '창의적인'

>>> creative[0]
'창'

>>> creative[2]
'적'

>>> creative[3]
'인'
```

Indexing also works from the right, starting with `-1`:

```python
creative = '창의적인'

>>> creative[-4]
'창'

>>> creative[-2]
'적'

>>> creative[-1]
'인'

```

There is no separate “character” or "rune" type in Python, so indexing a string produces a new `str` of length 1:

```python

>>> website = "exercism"
>>> type(website[0])
<class 'str'>

>>> len(website[0])
1

>>> website[0] == website[0:1] == 'e'
True
```

Substrings can be selected via _slice notation_, using [`<str>[<start>:stop:<step>]`][common sequence operations] to produce a new string.
BethanyG marked this conversation as resolved.
Show resolved Hide resolved
Results exclude the `stop` index.
If no `start` is given, the starting index will be 0.
If no `stop` is given, the `stop` index will be the end of the string.

```python
moon_and_stars = '🌟🌟🌙🌟🌟⭐'

>>> moon_and_stars[1:4]
'🌟🌙🌟'

>>> moon_and_stars[:3]
'🌟🌟🌙'

>>> moon_and_stars[3:]
'🌟🌟⭐'

>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'

>>> moon_and_stars[:-3]
'🌟🌟🌙'
```
BethanyG marked this conversation as resolved.
Show resolved Hide resolved

Strings can also be broken into smaller strings via [`<str>.split(<separator>)`][str-split], which will return a `list` of substrings.
The list can then be further indexed or split, if needed.
Using `<str>.split()` without any arguments will split the string on whitespace.

```python
>>> cat_ipsum = "Destroy house in 5 seconds mock the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'mock', 'the', 'hooman.']


>>> cat_ipsum.split()[-1]
'hooman.'


>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(',')
...
['feline, four-footed, ferocious, furry']
```

Seperators for `<str>.split()` can be more than one character. The whole string will be used for matching.

```python

>>> colors = """red,
orange,
green,
purple,
yellow"""

>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']
```

Strings support all [common sequence operations][common sequence operations].
Individual code points can be iterated through in a loop via `for item in <str>`.
Indexes _with_ items can be iterated through in a loop via `for index, item in enumerate(<str>)`

```python

>>> exercise = 'လေ့ကျင့်'

# Note that there are more code points than percieved glyphs or characters
>>> for code_point in exercise:
... print(code_point)
...
က

# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
... print(index, ": ", code_point)
...
0 : လ
1 : ေ
2 : ့
3 : က
4 : ျ
5 : င
6 : ်
7 : ့
```

[text sequence]: https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str
[unicode code points]: https://stackoverflow.com/questions/27331819/whats-the-difference-between-a-character-a-code-point-a-glyph-and-a-grapheme
[common sequence operations]: https://docs.python.org/3/library/stdtypes.html#common-sequence-operations
[str-split]: https://docs.python.org/3/library/stdtypes.html#str.split
[str-join]: https://docs.python.org/3/library/stdtypes.html#str.join
[str-constructor]: https://docs.python.org/3/library/stdtypes.html#str
10 changes: 10 additions & 0 deletions exercises/concept/little-sisters-vocab/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"blurb": "Learn about strings by helping your little sister with her vocabulary homework.",
"icon": "two-fer",
"authors": ["aldraco", "bethanyg"],
"files": {
"solution": ["strings.py"],
"test": ["strings_test.py"],
"exemplar": [".meta/exemplar.py"]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,19 @@ The goal of this exercise is to teach the student about Python strings, and fami
## Things to teach

- Know that Python has a `str` type.
- Know how to find items in a string.
- How to use `<str>.join()`
- How to use `<str>.split()`
- Know how to manipulate strings to create new strings.
- Familiarize one's self with string instance methods in Python.
- Learn about string formatting.

## Things not to teach

- Regex: `regex` is a useful tool for a solution, but isn't required.
- Regex: `regex`. That is for a different exercise.
- Iteration: Although strings are iterable, this is not the focus of this exercise.

## Concepts

The Concepts this exercise unlocks are:

- `strings-basic`: know about `str` type in Python, know some basic methods, know about formatting.

## Prerequisites

- `functions`: The student should be familiar with creating functions.
- `basics`: The student should be familiar with the basics exercise.

## Representer

Expand Down
Loading