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.

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.
TurnIDNameWeightTotal Weight
15Alice250250
23Alex350600
36John Cena4001000(último en abordar)
42Marie2001200(no pudo abordar)
54Bob175___
61Winston500___

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 © 2025