Tracks
/
Ballerina
Ballerina
/
Ejercicios
/
Asignación de combustible en JSON
Asignación de combustible en JSON

Asignación de combustible en JSON

Intermedia

Instrucciones

Planteamiento del problema

Cada empleado de ABC Corp recibe una asignación ilimitada de combustible. Se pide a los empleados que envíen un registro cada vez que llenan el tanque de sus vehículos. Estos registros se agregan al mismo archivo JSON y se procesan al final del mes.

Como miembro del equipo de operaciones digitales, tu tarea es leer este archivo JSON y escribir los resultados en otro archivo JSON. El archivo de salida debe contener una entrada por cada empleado con los siguientes datos:

  • Número de empleado
  • Cantidad de cargas de combustible
  • Costo total del combustible
  • Total de galones
  • Total de millas acumuladas

Recibes dos argumentos de tipo string.

  1. Ruta del archivo JSON de entrada.
  2. Ruta del archivo JSON de salida.

El archivo JSON de entrada contiene un array de objetos JSON. Cada objeto JSON tiene la siguiente forma.

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "employeeId": {
                "type": "integer"
            },
            "odometerReading": {
                "type": "integer"
            },
            "gallons": {
                "type": "number"
            },
            "gasPrice": {
                "type": "number"
            }
        },
        "required": [
            "employeeId",
            "odometerReading",
            "gallons",
            "gasPrice"
        ]
    }
}
// Ballerina record type definition
type FillUpEntry record {|
    int employeeId;
    int odometerReading;
    decimal gallons;
    decimal gasPrice;
|};

Tu tarea es transformar la entrada JSON al siguiente formato JSON y escribir el contenido en la ruta indicada. El archivo de salida debe contener una entrada por cada empleado, ordenadas de forma ascendente según el employeeId.

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "employeeId": {
                "type": "integer"
            },
            "gasFillUpCount": {
                "type": "integer"
            },
            "totalFuelCost": {
                "type": "number"
            },
            "totalGallons": {
                "type": "number"
            },
            "totalMilesAccrued": {
                "type": "integer"
            }
        },
        "required": [
            "employeeId",
            "gasFillUpCount",
            "totalFuelCost",
            "totalGallons",
            "totalMilesAccrued"
        ]
    }
 }
// Ballerina record type definition
type EmployeeFillUpSummary record {|
    int employeeId;
    int gasFillUpCount;
    decimal totalFuelCost;
    decimal totalGallons;
    int totalMilesAccrued;
|};

Restricciones

  • Cantidad de registros de carga n en el archivo JSON de entrada: 0 <= n <= 1000
  • Cantidad de empleados en la empresa: 97
  • El precio de la gasolina es por galón
  • No hay registros de carga faltantes

Ejemplo 1

  • Entrada: example01_input.json
[
    {
        "employeeId": 2312,
        "odometerReading": 230,
        "gallons": 18.561,
        "gasPrice": 4.56
    },
    {
        "employeeId": 2312,
        "odometerReading": 500,
        "gallons": 19.345,
        "gasPrice": 4.89
    }
]
  • Salida: example01_output.json
[
    {
        "employeeId": 2312,
        "gasFillUpCount": 2,
        "totalFuelCost": 179.23521,
        "totalGallons": 37.906,
        "totalMilesAccrued": 270
    }
]

Ejemplo 2

  • Entrada: example02_input.json
[
    {
        "employeeId": 2413,
        "odometerReading": 4089,
        "gallons": 21.682,
        "gasPrice": 3.46
    },
    {
        "employeeId": 3423,
        "odometerReading": 6582,
        "gallons": 15.248,
        "gasPrice": 4.56
    },
    {
        "employeeId": 2413,
        "odometerReading": 4127,
        "gallons": 4.221,
        "gasPrice": 3.40
    },
    {
        "employeeId": 2413,
        "odometerReading": 4349,
        "gallons": 11.192,
        "gasPrice": 4.10
    },
    {
        "employeeId": 3423,
        "odometerReading": 6767,
        "gallons": 8.696,
        "gasPrice": 3.34
    },
    {
        "employeeId": 2413,
        "odometerReading": 4547,
        "gallons": 9.197,
        "gasPrice": 2.90
    }
]

  • Salida: example02_output.json
[
    {
        "employeeId": 2413,
        "gasFillUpCount": 4,
        "totalFuelCost": 161.92962,
        "totalGallons": 46.292,
        "totalMilesAccrued": 458
    },
    {
        "employeeId": 3423,
        "gasFillUpCount": 2,
        "totalFuelCost": 98.57552,
        "totalGallons": 23.944,
        "totalMilesAccrued": 185
    }
]

Sugerencias

   json jsonPayload = {id: "2", title: "Jeru", artist: "Gerry Mulligan", price: 17.99};

   // Using cloneWithType  
   Album album1 = check jsonPayload.cloneWithType();
   io:println(album1);
 
   // Using fromJsonWithType
   Album album2 = check jsonPayload.fromJsonWithType();
   io:println(album2);
   Album {id, title, artist, price} = album1;
   io:println(id);
   io:println(title);
  • Usa funciones con cuerpo de expresión para las funciones que tienen una sola expresión. Por ejemplo, las funciones que solo tienen la sentencia return.
   function cfr(int deaths, int cases) returns decimal => <decimal>deaths / <decimal>cases * 100;
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Ballerina Exercism

¿Todo listo para empezar Asignación de combustible en JSON?

Regístrate en Exercism para aprender y dominar Ballerina con 60 ejercicios y mentoría humana real, todo gratis.