using System.Collections.Generic;
public static void Main()
List<Vehicle> vehicles = new List<Vehicle>();
for(int i = 0; i < 3; i++)
string[] vArgs = Console.ReadLine().Split();
double fuelQuantity = double.Parse(vArgs[1]);
double fuelConsumption = double.Parse(vArgs[2]);
int tankCapacity = int.Parse(vArgs[3]);
vehicle = new Car(fuelQuantity, fuelConsumption, tankCapacity);
vehicle = new Truck(fuelQuantity, fuelConsumption, tankCapacity);
vehicle = new Bus(fuelQuantity, fuelConsumption, tankCapacity);
int commandsCount = int.Parse(Console.ReadLine());
for(int i = 0; i < commandsCount; i++)
string[] commandArgs = Console.ReadLine().Split();
string command = commandArgs[0];
string commandType = commandArgs[1];
double distance = double.Parse(commandArgs[2]);
Car car = (Car)vehicles.FirstOrDefault(x => x.GetType().Name == "Car");
Console.WriteLine(car.Drive(distance));
else if(commandType == "Truck")
Truck truck = (Truck)vehicles.FirstOrDefault(x => x.GetType().Name == "Truck");
Console.WriteLine(truck.Drive(distance));
Bus bus = (Bus)vehicles.FirstOrDefault(x => x.GetType().Name == "Bus");
Console.WriteLine(bus.Drive(distance));
else if (command == "Refuel")
double fuelAmount = double.Parse(commandArgs[2]);
Vehicle currentVehicle = vehicles.FirstOrDefault(x => x.GetType().Name == commandType);
currentVehicle.Refuel(fuelAmount);
Console.WriteLine(ex.Message);
double distance = double.Parse(commandArgs[2]);
Bus currentBus = (Bus)vehicles.FirstOrDefault(x => x.GetType().Name == commandType);
Console.WriteLine(currentBus.DriveEmpty((distance)));
foreach (var vehicle in vehicles)
Console.WriteLine(vehicle);
public abstract class Vehicle
private double fuelQuantatay;
public Vehicle(double fuelQuantatay, double fuelConsumption, int thankCapasity)
this.TankCapasity = thankCapasity;
this.FuelQuantatay = fuelQuantatay;
this.FuelConsumption = fuelConsumption;
public int TankCapasity { get; private set; }
public double FuelQuantatay
return this.fuelQuantatay;
if(value > this.TankCapasity)
this.FuelQuantatay = value;
public double FuelConsumption {get; protected set; }
public virtual void Refuel(double amount)
throw new ArgumentException("Fuel must be a posetive number");
double totalFuelAmount = this.FuelQuantatay + amount;
if(totalFuelAmount > this.TankCapasity)
throw new ArgumentException(string.Format("Cannot fit {0} fuel in the tank", amount));
this.FuelQuantatay += amount;
public string Drive(double distance)
string vehicleName = this.GetType().Name;
double neededFuel = distance * this.FuelConsumption;
if(neededFuel <= this.FuelQuantatay)
this.FuelQuantatay -= neededFuel;
return string.Format("{0} travelled {1:f2} km", vehicleName, distance);
return string.Format("{0} needs refueling", vehicleName);
public override string ToString()
return string.Format("{0}: {1:f2}", this.GetType().Name, this.FuelQuantatay);
public class Car : Vehicle
private const double airConditionConsumption = 0.9;
public Car(double fuelQuantatay, double fuelConsumption, int thankCapasity)
: base (fuelQuantatay, fuelConsumption + airConditionConsumption, thankCapasity)
public class Truck : Vehicle
private const double airConditionConsumption = 1.6;
private const double wastedFuel = 0.5;
public Truck(double fuelQuantatay, double fuelConsumption, int thankCapasity)
: base (fuelQuantatay, fuelConsumption + airConditionConsumption, thankCapasity)
public override void Refuel(double amount)
this.FuelQuantatay -= amount * wastedFuel;
public class Bus : Vehicle
private const double airConditionConsumption = 1.4;
public Bus(double fuelQuantatay, double fuelConsumption, int thankCapasity)
: base (fuelQuantatay, fuelConsumption + airConditionConsumption, thankCapasity)
public string DriveEmpty(double distance)
this.FuelConsumption -= airConditionConsumption;
return base.Drive(distance);