← run

he-017

1.000
1/1 tests· basic
Challenge · difficulty 1/5
# HumanEval/17

Implement a file **`solution.py`** that completes the function below. Keep the given name and signature; your file must define it at module level.

```python
from typing import List


def parse_music(music_string: str) -> List[int]:
    """ Input to this function is a string representing musical notes in a special ASCII format.
    Your task is to parse this string and return list of integers corresponding to how many beats does each
    not last.

    Here is a legend:
    'o' - whole note, lasts four beats
    'o|' - half note, lasts two beats
    '.|' - quater note, lasts one beat

    >>> parse_music('o o| .| o| o| .| .| .| .| o o')
    [4, 2, 1, 2, 2, 1, 1, 1, 1, 4, 4]
    """
```

<!-- imported from OpenAI HumanEval (HumanEval/17) -->
tests/test_he_017.py
# Auto-generated from OpenAI HumanEval HumanEval/17. Do not edit by hand.
from solution import *  # noqa: F401,F403 (prompt helpers may be referenced by tests)
from solution import parse_music as candidate

METADATA = {
    'author': 'jt',
    'dataset': 'test'
}


def check(candidate):
    assert candidate('') == []
    assert candidate('o o o o') == [4, 4, 4, 4]
    assert candidate('.| .| .| .|') == [1, 1, 1, 1]
    assert candidate('o| o| .| .| o o o o') == [2, 2, 1, 1, 4, 4, 4, 4]
    assert candidate('o| .| o| .| o o| o o|') == [2, 1, 2, 1, 4, 2, 4, 2]


def test_he_017():
    check(candidate)
System prompt
You are an expert programmer. Solve the task exactly as specified. Output your solution as fenced code blocks using the required file name(s) and the exact function/type signatures requested. Prefer correctness; do not include prose outside code unless asked.
Proposed solution
```python
from typing import List


def parse_music(music_string: str) -> List[int]:
    """ Input to this function is a string representing musical notes in a special ASCII format.
    Your task is to parse this string and return list of integers corresponding to how many beats does each
    not last.

    Here is a legend:
    'o' - whole note, lasts four beats
    'o|' - half note, lasts two beats
    '.|' - quater note, lasts one beat

    >>> parse_music('o o| .| o| o| .| .| .| .| o o')
    [4, 2, 1, 2, 2, 1, 1, 1, 1, 4, 4]
    """
    note_map = {
        'o': 4,
        'o|': 2,
        '.|': 1
    }
    
    return [note_map[note] for note in music_string.split()]
```

Test output (stdout)

.                                                                        [100%]
1 passed in 0.01s
Reasoning (chain-of-thought)
The user wants me to implement a function `parse_music` that parses a string of musical notes and returns a list of integers representing the beat duration of each note.

The legend is:
- 'o' - whole note, 4 beats
- 'o|' - half note, 2 beats
- '.|' - quarter note, 1 beat

The input is a space-separated string of these note symbols.

Let me trace through the example:
Input: 'o o| .| o| o| .| .| .| .| o o'
Split by space: ['o', 'o|', '.|', 'o|', 'o|', '.|', '.|', '.|', '.|', 'o', 'o']
Map to beats:
- 'o' -> 4
- 'o|' -> 2
- '.|' -> 1
- 'o|' -> 2
- 'o|' -> 2
- '.|' -> 1
- '.|' -> 1
- '.|' -> 1
- '.|' -> 1
- 'o' -> 4
- 'o' -> 4

Result: [4, 2, 1, 2, 2, 1, 1, 1, 1, 4, 4]

This matches the expected output.

The implementation is straightforward:
1. Split the string by spaces
2. For each token, map it to the corresponding beat value
3. Return the list of beat values

Let me write the code:

```python
from typing import List


def parse_music(music_string: str) -> List[int]:
    """ Input to this function is a string representing musical notes in a special ASCII format.
    Your task is to parse this string and return list of integers corresponding to how many beats does each
    not last.

    Here is a legend:
    'o' - whole note, lasts four beats
    'o|' - half note, lasts two beats
    '.|' - quater note, lasts one beat

    >>> parse_music('o o| .| o| o| .| .| .| .| o o')
    [4, 2, 1, 2, 2, 1, 1, 1, 1, 4, 4]
    """
    note_map = {
        'o': 4,
        'o|': 2,
        '.|': 1
    }
    
    return [note_map[note] for note in music_string.split()]
```

This should work correctly. Let me verify once more with the example.

Input: 'o o| .| o| o| .| .| .| .| o o'
Split: ['o', 'o|', '.|', 'o|', 'o|', '.|', '.|', '.|', '.|', 'o', 'o']
Mapped: [4, 2, 1, 2, 2, 1, 1, 1, 1, 4, 4]

Yes, this is correct.