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.
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)