المسارات
/
Ballerina
Ballerina
/
التمارين
/
بدل الوقود بصيغة JSON
بدل الوقود بصيغة JSON

بدل الوقود بصيغة JSON

متوسط

التعليمات

نص المسألة

يحصل كل موظف في شركة ABC Corp على بدل وقود غير محدود. ويُطلب من الموظفين إرسال سجل في كل مرة يعبّئون فيها سياراتهم بالوقود. تُضاف هذه السجلات إلى الملف نفسه بصيغة JSON وتُعالَج في نهاية الشهر.

بصفتك عضوًا في فريق العمليات الرقمية، مهمتك أن تقرأ ملف JSON هذا وتكتب النتائج في ملف JSON آخر. ينبغي أن يحتوي ملف الخرج على مدخل لكل موظف يتضمن التفاصيل التالية:

  • رقم الموظف
  • عدد مرات تعبئة الوقود
  • إجمالي تكلفة الوقود
  • إجمالي الغالونات
  • إجمالي الأميال المتراكمة

ستُعطى وسيطين اثنين من النوع string.

  1. مسار ملف JSON المُدخل.
  2. مسار ملف JSON المُخرج.

يحتوي ملف JSON المُدخل على مصفوفة من كائنات JSON. يأخذ كل كائن JSON الشكل التالي.

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

مهمتك أن تحوّل دخل JSON إلى صيغة JSON التالية وتكتب المحتوى إلى المسار المعطى. ينبغي أن يحتوي ملف الخرج على مدخل لكل موظف، مرتبةً تصاعديًا حسب 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;
|};

القيود

  • عدد سجلات التعبئة n في ملف JSON المُدخل: 0 <= n <= 1000
  • عدد الموظفين في الشركة: 97
  • سعر الوقود لكل غالون
  • لا توجد سجلات تعبئة مفقودة

المثال 1

  • الدخل: example01_input.json
[
    {
        "employeeId": 2312,
        "odometerReading": 230,
        "gallons": 18.561,
        "gasPrice": 4.56
    },
    {
        "employeeId": 2312,
        "odometerReading": 500,
        "gallons": 19.345,
        "gasPrice": 4.89
    }
]
  • الخرج: example01_output.json
[
    {
        "employeeId": 2312,
        "gasFillUpCount": 2,
        "totalFuelCost": 179.23521,
        "totalGallons": 37.906,
        "totalMilesAccrued": 270
    }
]

المثال 2

  • الدخل: 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
    }
]

  • الخرج: 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
    }
]

تلميحات

   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);
  • استخدم دوالًا بجسم تعبيري للدوال التي تحتوي على تعبير واحد فقط. مثل الدوال التي تحتوي على عبارة الإرجاع فقط.
   function cfr(int deaths, int cases) returns decimal => <decimal>deaths / <decimal>cases * 100;
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Ballerina Exercism

مستعد لبدء بدل الوقود بصيغة JSON؟

سجّل في Exercism لتتعلّم وتتقن Ballerina عبر 60 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.