Trilhas
/
Ballerina
Ballerina
/
Exercícios
/
Auxílio Combustível JSON
Auxílio Combustível JSON

Auxílio Combustível JSON

Médio

Instruções

Enunciado do problema

Todo funcionário da ABC Corp recebe um auxílio combustível ilimitado. Os funcionários precisam enviar um registro toda vez que abastecem seus veículos. Esses registros são acrescentados ao mesmo arquivo JSON e processados no fim do mês.

Como membro da equipe de operações digitais, sua tarefa é ler esse arquivo JSON e escrever os resultados em outro arquivo JSON. O arquivo de saída deve conter uma entrada para cada funcionário com os seguintes detalhes:

  • Número do funcionário
  • Número de abastecimentos
  • Custo total com combustível
  • Total de galões
  • Total de milhas acumuladas

Você recebe dois argumentos do tipo string.

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

O arquivo JSON de entrada contém um array de objetos JSON. Cada objeto JSON tem o seguinte formato.

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

Sua tarefa é transformar a entrada JSON no formato JSON a seguir e escrever o conteúdo no caminho informado. O arquivo de saída deve conter uma entrada para cada funcionário, ordenada de forma crescente pelo 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;
|};

Restrições

  • Número de registros de abastecimento n no arquivo JSON de entrada: 0 <= n <= 1000
  • Número de funcionários na empresa: 97
  • O preço da gasolina é por galão
  • Nenhum registro de abastecimento está faltando

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

Dicas

   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);
  • Use 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 O link abre em uma nova janela ou aba
Ballerina Exercism

Tudo pronto para começar Auxílio Combustível JSON?

Crie sua conta no Exercism para aprender e dominar Ballerina com 60 exercícios e mentoria humana de verdade, tudo de graça.