La última persona que aborda el autobús

Hay una fila de personas esperando para abordar un autobús. Sin embargo, el autobús tiene un límite de peso de 1000 kilogramos, de manera que habrá ocasiones en que no todas las personas podrán abordar. Escribe una solución para encontrar el person_name de la última persona que logró abordar el autobús sin exceder el límite de peso. Los casos de prueba son generados de tal forma que la primera persona no exceda el límite de peso permitido.

#pandas#advanced-select

Tabla: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+

- La columna person_id contiene valores únicos.
- Esta tabla contiene la información de todas las personas esperando un autobús.
- Las columnas person_id y turn contienen números del 1 a n, donde n es el número de filas en la tabla.
- turn determina el orden en el cual la gente aborda el autobús, donde turn=1 indica que esta fue la primera persona en abordar.
- weight es el peso de la persona en kilogramos.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Queue:
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5         | Alice       | 250    | 1    |
| 4         | Bob         | 175    | 5    |
| 3         | Alex        | 350    | 2    |
| 6         | John Cena   | 400    | 3    |
| 1         | Winston     | 500    | 6    |
| 2         | Marie       | 200    | 4    |
+-----------+-------------+--------+------+

Salida:

+-------------+
| person_name |
+-------------+
| John Cena   |
+-------------+

Explicación: La siguiente tabla está ordenada por el turno para mayor simplicidad.
Turn ID Name Weight Total Weight
1 5 Alice 250 250
2 3 Alex 350 600
3 6 John Cena 400 1000 (último en abordar)
4 2 Marie 200 1200 (no pudo abordar)
5 4 Bob 175 ___
6 1 Winston 500 ___

Solución:

import pandas as pd


def last_passenger(queue: pd.DataFrame) -> pd.DataFrame:
    queue = queue.sort_values(by='turn').reset_index(drop=True)
    queue['cumsum'] = queue['weight'].cumsum()

    board = queue.loc[queue['cumsum'] <= 1000]
    last_passenger = board.last_valid_index()

    return pd.DataFrame({
        'person_name': queue[queue.index==last_passenger]['person_name']
    }).reset_index(drop=True)


def test_last_passenger():
    data = [
        [5, 'Alice', 250, 1],
        [4, 'Bob', 175, 5],
        [3, 'Alex', 350, 2],
        [6, 'John Cena', 400, 3],
        [1, 'Winston', 500, 6],
        [2, 'Marie', 200, 4]
    ]
    queue = pd.DataFrame(
        data, columns=['person_id', 'person_name', 'weight', 'turn']
    ).astype({
        'person_id': 'Int64',
        'person_name': 'object',
        'weight': 'Int64',
        'turn': 'Int64'
    })

    expected = pd.DataFrame(
        [['John Cena']], columns=['person_name']
    ).astype({'person_name': str})

    got = last_passenger(queue)
    pd.testing.assert_frame_equal(got, expected)

slackmart blog © 2024