Percursos
/
Ballerina
Ballerina
/
Exercícios
/
Subsídio de Combustível em JSON
Subsídio de Combustível em JSON

Subsídio de Combustível em JSON

Médio

Instruções

Enunciado do problema

Todos os empregados da ABC Corp recebem um subsídio de combustível ilimitado. Os empregados têm de enviar um registo sempre que abastecem os seus veículos. Esses registos são acrescentados ao mesmo ficheiro JSON e processados no final do mês.

Como membro da equipa de operações digitais, a tua tarefa é ler este ficheiro JSON e escrever os resultados noutro ficheiro JSON. O ficheiro de saída deve conter uma entrada para cada empregado, com os seguintes detalhes:

  • Número de empregado
  • Número de abastecimentos
  • Custo total do combustível
  • Total de galões
  • Total de milhas acumuladas

Recebes dois argumentos do tipo string.

  1. Caminho do ficheiro JSON de entrada.
  2. Caminho do ficheiro JSON de saída.

O ficheiro JSON de entrada contém um array de objetos JSON. Cada objeto JSON tem a seguinte 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;
|};

A tua tarefa é transformar a entrada JSON no seguinte formato JSON e escrever o conteúdo no caminho indicado. O ficheiro de saída deve conter uma entrada para cada empregado, ordenadas por employeeId em ordem crescente.

{
    "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;
|};

Restrições

  • Número de registos de abastecimento n no ficheiro JSON de entrada: 0 <= n <= 1000
  • Número de empregados na empresa: 97
  • O preço do combustível é por galão
  • Não faltam registos de abastecimento

Exemplo 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
    }
]
  • Saída: example01_output.json
[
    {
        "employeeId": 2312,
        "gasFillUpCount": 2,
        "totalFuelCost": 179.23521,
        "totalGallons": 37.906,
        "totalMilesAccrued": 270
    }
]

Exemplo 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
    }
]

  • Saída: 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
    }
]

Sugestões

   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 funções com corpo de expressão para funções com uma única expressão. Por exemplo, funções que têm apenas a instrução de retorno.
   function cfr(int deaths, int cases) returns decimal => <decimal>deaths / <decimal>cases * 100;
Editar via GitHub A ligação abre numa nova janela ou separador
Ballerina Exercism

Estás pronto para começar Subsídio de Combustível em JSON?

Inscreve-te no Exercism para aprenderes e dominares Ballerina com 60 exercícios, e mentoria humana real, tudo grátis.