← run 2026-07-02T101616Z-9f192f9-minimal

bielik-11b-v3 — py-fix-bug

rep 1 PARTIAL 6/10

pi 56.9s · verify 0.3s · 4115 tok · responded: bielik-11b-v3 · transcript

verify output
..FF...FF.                                                               [100%]
=================================== FAILURES ===================================
____________________________ test_back_to_back_two _____________________________

    def test_back_to_back_two():
>       assert min_rooms([(0, 10), (10, 20)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 10), (10, 20)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:27: AssertionError
___________________________ test_back_to_back_chain ____________________________

    def test_back_to_back_chain():
>       assert min_rooms([(0, 5), (5, 10), (10, 15)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 5), (5, 10), (10, 15)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:31: AssertionError
____________________________ test_staggered_overlap ____________________________

    def test_staggered_overlap():
>       assert min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:47: AssertionError
___________________________ test_touch_then_overlap ____________________________

    def test_touch_then_overlap():
        # At t=10 one meeting ends and two start: the freed room is reused, peak is 2, not 3.
>       assert min_rooms([(0, 10), (10, 20), (10, 30)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (10, 20), (10, 30)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:52: AssertionError
=========================== short test summary info ============================
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_two
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_chain
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_staggered_overlap
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_touch_then_overlap
4 failed, 6 passed in 0.02s
score: 6/10 (60%)
produced code
.gitignore
__pycache__/
*.pyc
.pytest_cache/
meetings/__init__.py
from .core import min_rooms, total_meeting_time

__all__ = ["min_rooms", "total_meeting_time"]
meetings/core.py
"""Meeting-room scheduling helpers.

Meetings are half-open intervals ``[start, end)``: a room is occupied from ``start`` and becomes
free again exactly at ``end``. So ``[0, 10)`` and ``[10, 20)`` do not conflict and can share one
room, while ``[0, 10)`` and ``[5, 15)`` overlap and need two rooms.
"""


def _peak_concurrency(meetings):
    """Maximum number of meetings that are in progress at the same instant.

    Implemented with a sweep over start/end events: a ``+1`` when a meeting starts and a ``-1``
    when it ends. Because the intervals are half-open, at any shared timestamp a room is freed
    (``-1``) *before* the next meeting takes one (``+1``).
    """
    events = []
    for start, end in meetings:
        if end < start:
            raise ValueError(f"meeting ends before it starts: {(start, end)}")
        events.append((start, +1))
        events.append((end, -1))

    # Order events by time. On ties, an end must be processed before a start so a back-to-back
    # meeting reuses the freed room instead of demanding a new one.
    events.sort(key=lambda e: (e[0], -e[1]))

    current = peak = 0
    for _, delta in events:
        current += delta
        if current > peak:
            peak = current
    return peak


def min_rooms(meetings):
    """Minimum number of rooms needed to host every meeting without a conflict."""
    return _peak_concurrency(meetings)


def total_meeting_time(meetings):
    """Total scheduled time across all meetings (each meeting counted once)."""
    return sum(end - start for start, end in meetings)
tests_visible/test_meetings.py
import os
import sys

# Make the package importable no matter what directory pytest is invoked from.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from meetings import min_rooms, total_meeting_time


def test_total_meeting_time():
    assert total_meeting_time([(0, 10), (30, 45)]) == 25


def test_overlapping_meetings_need_two_rooms():
    assert min_rooms([(0, 30), (5, 10), (15, 20)]) == 2


def test_back_to_back_meetings_share_one_room():
    # The first room frees exactly when the second meeting starts, so one room is enough.
    assert min_rooms([(0, 10), (10, 20)]) == 1

rep 2 PARTIAL 6/10

pi 18.8s · verify 0.3s · 2008 tok · responded: bielik-11b-v3 · transcript

verify output
..FF...FF.                                                               [100%]
=================================== FAILURES ===================================
____________________________ test_back_to_back_two _____________________________

    def test_back_to_back_two():
>       assert min_rooms([(0, 10), (10, 20)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 10), (10, 20)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:27: AssertionError
___________________________ test_back_to_back_chain ____________________________

    def test_back_to_back_chain():
>       assert min_rooms([(0, 5), (5, 10), (10, 15)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 5), (5, 10), (10, 15)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:31: AssertionError
____________________________ test_staggered_overlap ____________________________

    def test_staggered_overlap():
>       assert min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:47: AssertionError
___________________________ test_touch_then_overlap ____________________________

    def test_touch_then_overlap():
        # At t=10 one meeting ends and two start: the freed room is reused, peak is 2, not 3.
>       assert min_rooms([(0, 10), (10, 20), (10, 30)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (10, 20), (10, 30)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:52: AssertionError
=========================== short test summary info ============================
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_two
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_chain
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_staggered_overlap
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_touch_then_overlap
4 failed, 6 passed in 0.02s
score: 6/10 (60%)
produced code
.gitignore
__pycache__/
*.pyc
.pytest_cache/
meetings/__init__.py
from .core import min_rooms, total_meeting_time

__all__ = ["min_rooms", "total_meeting_time"]
meetings/core.py
"""Meeting-room scheduling helpers.

Meetings are half-open intervals ``[start, end)``: a room is occupied from ``start`` and becomes
free again exactly at ``end``. So ``[0, 10)`` and ``[10, 20)`` do not conflict and can share one
room, while ``[0, 10)`` and ``[5, 15)`` overlap and need two rooms.
"""


def _peak_concurrency(meetings):
    """Maximum number of meetings that are in progress at the same instant.

    Implemented with a sweep over start/end events: a ``+1`` when a meeting starts and a ``-1``
    when it ends. Because the intervals are half-open, at any shared timestamp a room is freed
    (``-1``) *before* the next meeting takes one (``+1``).
    """
    events = []
    for start, end in meetings:
        if end < start:
            raise ValueError(f"meeting ends before it starts: {(start, end)}")
        events.append((start, +1))
        events.append((end, -1))

    # Order events by time. On ties, an end must be processed before a start so a back-to-back
    # meeting reuses the freed room instead of demanding a new one.
    events.sort(key=lambda e: (e[0], -e[1]))

    current = peak = 0
    for _, delta in events:
        current += delta
        if current > peak:
            peak = current
    return peak


def min_rooms(meetings):
    """Minimum number of rooms needed to host every meeting without a conflict."""
    return _peak_concurrency(meetings)


def total_meeting_time(meetings):
    """Total scheduled time across all meetings (each meeting counted once)."""
    return sum(end - start for start, end in meetings)
tests_visible/test_meetings.py
import os
import sys

# Make the package importable no matter what directory pytest is invoked from.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from meetings import min_rooms, total_meeting_time


def test_total_meeting_time():
    assert total_meeting_time([(0, 10), (30, 45)]) == 25


def test_overlapping_meetings_need_two_rooms():
    assert min_rooms([(0, 30), (5, 10), (15, 20)]) == 2


def test_back_to_back_meetings_share_one_room():
    # The first room frees exactly when the second meeting starts, so one room is enough.
    assert min_rooms([(0, 10), (10, 20)]) == 1

rep 3 PARTIAL 6/10

pi 13.4s · verify 0.3s · 1714 tok · responded: bielik-11b-v3 · transcript

verify output
..FF...FF.                                                               [100%]
=================================== FAILURES ===================================
____________________________ test_back_to_back_two _____________________________

    def test_back_to_back_two():
>       assert min_rooms([(0, 10), (10, 20)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 10), (10, 20)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:27: AssertionError
___________________________ test_back_to_back_chain ____________________________

    def test_back_to_back_chain():
>       assert min_rooms([(0, 5), (5, 10), (10, 15)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 5), (5, 10), (10, 15)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:31: AssertionError
____________________________ test_staggered_overlap ____________________________

    def test_staggered_overlap():
>       assert min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:47: AssertionError
___________________________ test_touch_then_overlap ____________________________

    def test_touch_then_overlap():
        # At t=10 one meeting ends and two start: the freed room is reused, peak is 2, not 3.
>       assert min_rooms([(0, 10), (10, 20), (10, 30)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (10, 20), (10, 30)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:52: AssertionError
=========================== short test summary info ============================
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_two
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_chain
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_staggered_overlap
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_touch_then_overlap
4 failed, 6 passed in 0.02s
score: 6/10 (60%)
produced code
.gitignore
__pycache__/
*.pyc
.pytest_cache/
meetings/__init__.py
from .core import min_rooms, total_meeting_time

__all__ = ["min_rooms", "total_meeting_time"]
meetings/core.py
"""Meeting-room scheduling helpers.

Meetings are half-open intervals ``[start, end)``: a room is occupied from ``start`` and becomes
free again exactly at ``end``. So ``[0, 10)`` and ``[10, 20)`` do not conflict and can share one
room, while ``[0, 10)`` and ``[5, 15)`` overlap and need two rooms.
"""


def _peak_concurrency(meetings):
    """Maximum number of meetings that are in progress at the same instant.

    Implemented with a sweep over start/end events: a ``+1`` when a meeting starts and a ``-1``
    when it ends. Because the intervals are half-open, at any shared timestamp a room is freed
    (``-1``) *before* the next meeting takes one (``+1``).
    """
    events = []
    for start, end in meetings:
        if end < start:
            raise ValueError(f"meeting ends before it starts: {(start, end)}")
        events.append((start, +1))
        events.append((end, -1))

    # Order events by time. On ties, an end must be processed before a start so a back-to-back
    # meeting reuses the freed room instead of demanding a new one.
    events.sort(key=lambda e: (e[0], -e[1]))

    current = peak = 0
    for _, delta in events:
        current += delta
        if current > peak:
            peak = current
    return peak


def min_rooms(meetings):
    """Minimum number of rooms needed to host every meeting without a conflict."""
    return _peak_concurrency(meetings)


def total_meeting_time(meetings):
    """Total scheduled time across all meetings (each meeting counted once)."""
    return sum(end - start for start, end in meetings)
tests_visible/test_meetings.py
import os
import sys

# Make the package importable no matter what directory pytest is invoked from.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from meetings import min_rooms, total_meeting_time


def test_total_meeting_time():
    assert total_meeting_time([(0, 10), (30, 45)]) == 25


def test_overlapping_meetings_need_two_rooms():
    assert min_rooms([(0, 30), (5, 10), (15, 20)]) == 2


def test_back_to_back_meetings_share_one_room():
    # The first room frees exactly when the second meeting starts, so one room is enough.
    assert min_rooms([(0, 10), (10, 20)]) == 1

rep 4 PARTIAL 6/10

pi 28.0s · verify 0.3s · 2551 tok · responded: bielik-11b-v3 · transcript

verify output
..FF...FF.                                                               [100%]
=================================== FAILURES ===================================
____________________________ test_back_to_back_two _____________________________

    def test_back_to_back_two():
>       assert min_rooms([(0, 10), (10, 20)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 10), (10, 20)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:27: AssertionError
___________________________ test_back_to_back_chain ____________________________

    def test_back_to_back_chain():
>       assert min_rooms([(0, 5), (5, 10), (10, 15)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 5), (5, 10), (10, 15)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:31: AssertionError
____________________________ test_staggered_overlap ____________________________

    def test_staggered_overlap():
>       assert min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:47: AssertionError
___________________________ test_touch_then_overlap ____________________________

    def test_touch_then_overlap():
        # At t=10 one meeting ends and two start: the freed room is reused, peak is 2, not 3.
>       assert min_rooms([(0, 10), (10, 20), (10, 30)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (10, 20), (10, 30)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:52: AssertionError
=========================== short test summary info ============================
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_two
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_chain
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_staggered_overlap
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_touch_then_overlap
4 failed, 6 passed in 0.02s
score: 6/10 (60%)
produced code
.gitignore
__pycache__/
*.pyc
.pytest_cache/
meetings/__init__.py
from .core import min_rooms, total_meeting_time

__all__ = ["min_rooms", "total_meeting_time"]
meetings/core.py
"""Meeting-room scheduling helpers.

Meetings are half-open intervals ``[start, end)``: a room is occupied from ``start`` and becomes
free again exactly at ``end``. So ``[0, 10)`` and ``[10, 20)`` do not conflict and can share one
room, while ``[0, 10)`` and ``[5, 15)`` overlap and need two rooms.
"""


def _peak_concurrency(meetings):
    """Maximum number of meetings that are in progress at the same instant.

    Implemented with a sweep over start/end events: a ``+1`` when a meeting starts and a ``-1``
    when it ends. Because the intervals are half-open, at any shared timestamp a room is freed
    (``-1``) *before* the next meeting takes one (``+1``).
    """
    events = []
    for start, end in meetings:
        if end < start:
            raise ValueError(f"meeting ends before it starts: {(start, end)}")
        events.append((start, +1))
        events.append((end, -1))

    # Order events by time. On ties, an end must be processed before a start so a back-to-back
    # meeting reuses the freed room instead of demanding a new one.
    events.sort(key=lambda e: (e[0], -e[1]))

    current = peak = 0
    for _, delta in events:
        current += delta
        if current > peak:
            peak = current
    return peak


def min_rooms(meetings):
    """Minimum number of rooms needed to host every meeting without a conflict."""
    return _peak_concurrency(meetings)


def total_meeting_time(meetings):
    """Total scheduled time across all meetings (each meeting counted once)."""
    return sum(end - start for start, end in meetings)
tests_visible/test_meetings.py
import os
import sys

# Make the package importable no matter what directory pytest is invoked from.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from meetings import min_rooms, total_meeting_time


def test_total_meeting_time():
    assert total_meeting_time([(0, 10), (30, 45)]) == 25


def test_overlapping_meetings_need_two_rooms():
    assert min_rooms([(0, 30), (5, 10), (15, 20)]) == 2


def test_back_to_back_meetings_share_one_room():
    # The first room frees exactly when the second meeting starts, so one room is enough.
    assert min_rooms([(0, 10), (10, 20)]) == 1

rep 5 PARTIAL 6/10

pi 16.3s · verify 0.3s · 1880 tok · responded: bielik-11b-v3 · transcript

verify output
..FF...FF.                                                               [100%]
=================================== FAILURES ===================================
____________________________ test_back_to_back_two _____________________________

    def test_back_to_back_two():
>       assert min_rooms([(0, 10), (10, 20)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 10), (10, 20)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:27: AssertionError
___________________________ test_back_to_back_chain ____________________________

    def test_back_to_back_chain():
>       assert min_rooms([(0, 5), (5, 10), (10, 15)]) == 1
E       assert 2 == 1
E        +  where 2 = min_rooms([(0, 5), (5, 10), (10, 15)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:31: AssertionError
____________________________ test_staggered_overlap ____________________________

    def test_staggered_overlap():
>       assert min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (5, 15), (10, 20), (15, 25)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:47: AssertionError
___________________________ test_touch_then_overlap ____________________________

    def test_touch_then_overlap():
        # At t=10 one meeting ends and two start: the freed room is reused, peak is 2, not 3.
>       assert min_rooms([(0, 10), (10, 20), (10, 30)]) == 2
E       assert 3 == 2
E        +  where 3 = min_rooms([(0, 10), (10, 20), (10, 30)])

/home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py:52: AssertionError
=========================== short test summary info ============================
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_two
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_back_to_back_chain
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_staggered_overlap
FAILED ../../home/lzieniew/Documents/my_local_llm_benchmarks/tasks/py-fix-bug/tests/test_grade.py::test_touch_then_overlap
4 failed, 6 passed in 0.02s
score: 6/10 (60%)
produced code
.gitignore
__pycache__/
*.pyc
.pytest_cache/
meetings/__init__.py
from .core import min_rooms, total_meeting_time

__all__ = ["min_rooms", "total_meeting_time"]
meetings/core.py
"""Meeting-room scheduling helpers.

Meetings are half-open intervals ``[start, end)``: a room is occupied from ``start`` and becomes
free again exactly at ``end``. So ``[0, 10)`` and ``[10, 20)`` do not conflict and can share one
room, while ``[0, 10)`` and ``[5, 15)`` overlap and need two rooms.
"""


def _peak_concurrency(meetings):
    """Maximum number of meetings that are in progress at the same instant.

    Implemented with a sweep over start/end events: a ``+1`` when a meeting starts and a ``-1``
    when it ends. Because the intervals are half-open, at any shared timestamp a room is freed
    (``-1``) *before* the next meeting takes one (``+1``).
    """
    events = []
    for start, end in meetings:
        if end < start:
            raise ValueError(f"meeting ends before it starts: {(start, end)}")
        events.append((start, +1))
        events.append((end, -1))

    # Order events by time. On ties, an end must be processed before a start so a back-to-back
    # meeting reuses the freed room instead of demanding a new one.
    events.sort(key=lambda e: (e[0], -e[1]))

    current = peak = 0
    for _, delta in events:
        current += delta
        if current > peak:
            peak = current
    return peak


def min_rooms(meetings):
    """Minimum number of rooms needed to host every meeting without a conflict."""
    return _peak_concurrency(meetings)


def total_meeting_time(meetings):
    """Total scheduled time across all meetings (each meeting counted once)."""
    return sum(end - start for start, end in meetings)
tests_visible/test_meetings.py
import os
import sys

# Make the package importable no matter what directory pytest is invoked from.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from meetings import min_rooms, total_meeting_time


def test_total_meeting_time():
    assert total_meeting_time([(0, 10), (30, 45)]) == 25


def test_overlapping_meetings_need_two_rooms():
    assert min_rooms([(0, 30), (5, 10), (15, 20)]) == 2


def test_back_to_back_meetings_share_one_room():
    # The first room frees exactly when the second meeting starts, so one room is enough.
    assert min_rooms([(0, 10), (10, 20)]) == 1