Menu
Topics Index
...
`

Weekend Hack - 17 Aug 2013 - Results

Thanks to Tejaswini Rao, Ramana Tadakamalla, Pramod Jain, Amar Kumar Biradar and Nishan Sharma K for spending so much time, coming up with original and innovative answers and for submitting them. Thanks to many others who have tried to get the solution.
We have reviewed the solutions as per the criteria mentioned at Weekend Hack and included the comments below. Given the experience of the participants, they were really innovative and clean. Few minor comments found are included below in the order of the submission. These comments are not intended to point out the mistakes in the solutions but to learn from them.

The winner of the Weekend Hack 17 Aug 2013 is Tejaswini Rao. She will get a recharge or gift voucher worth Rs. 125. Since others are also very close to the winner, they will get a recharge of Rs. 50 each.

Generate bus ticket

Write a program to generate a Bus Ticket with fare details, scheduled arrival and departure times given the starting point and the destination point. Also if the passenger has Cat Card, there should be a discount of 10% on the fare. The final fare should be rounded up to the nearest integer.

1. The fare calculation is dependent on the distance travelled. The chart is given below. For eg if the distance is 65 kms the price is (40 * 0.9 + 20 * 0.8 + 5 * 0.7)
2. The journey can be either FORWARD or BACKWARD. If the given starting point and destination point are not correct, then it should return null.
3. The stages and the distance to destination are given for the services.
4. The scheduled times at various stages have to be calculated using the service start time and the average speed of the bus. The minutes are to be rounded using java.util.Math.rint().
Fares Chart (From Kms, To Kms, Price Per Km): {[0, 40, 0.90], [41, 60, 0.80], [61, 80, 0.70], [81, 100, 0.65], [101, 500, 0.60]}

----------------------------------------------------------
Service-1
----------------------------------------------------------
[KAMMAREDDYPALLY, 100.0]
[TELKAPALLY, 94.0]
[RAGUPATHIPET, 85.0]
[KALWAKURTHI, 70.0]
[VELDANDA, 60.0]
[THANDA, 55.0]
[AMANGAL, 40.0]
[KADTHAL, 30.0]
[THUKKUGUDA, 20.0]
[CHANDRAN GUTTA, 15.0]
[SANTHOSH NAGAR, 10.0]
[NALGONDA X ROAD, 5.0]
[KOTI, 1.0]
[HYDERABAD, 0.0]

----------------------------------------------------------
Service-2
----------------------------------------------------------
[THIRUPATHI, 300.0]
[SRI KALAHASTHI, 280.0]
[NAIDU PETA, 250.0]
[GUDUR, 200.0]
[NELLORE, 180.0]
[KAVALI, 150.0]
[ONGOLE, 120.0]
[CHIRALA, 110.0]
[THENALI, 90.0]
[GUNTUR, 85.0]
[MIRYALA GUDA, 70.0]
[NALGONDA, 40.0]
[CHERLA PALLI, 10.0]
[SEC-BAD, 5.0]
[HYDERABAD, 0.0]

Input (List, List, double, String, String, String, JourneyType, Boolean) Output (Ticket)
{Service-1, [fares, stages, 60.0, "08:00", "SANTHOSH NAGAR", "VELDANDA", JourneyType.BACKWARD, false]} {"SANTHOSH NAGAR", "VELDANDA", 50.0, 44.0, "08:10", "09:00"}
Service-1 [fares, stages, 60.0, "08:00", "KAMMAREDDYPALLY", "TELKAPALLY", JourneyType.BACKWARD, true] null
{Service-1, [fares, stages, 60.0, "08:00", "KOTI", "VELDANDA", JourneyType.BACKWARD, true]} {"KOTI", "VELDANDA", 59.0, 47.0, "08:01", "09:00"}
{Service-2, [fares, stages, 50.0, "05:00", "HYDERABAD", "GUNTUR", JourneyType.BACKWARD, false]} {"HYDERABAD", "GUNTUR", 85.0, 70.0, "05:00", "06:42"}
{Service-2, [fares, stages, 50.0, "05:00", "GUNTUR", "GUNTUR", JourneyType.FORWARD, false]} null
{Service-2,[fares, stages, 80.0, "01:00", "VIJAYAWADA", "NELLORE", JourneyType.BACKWARD, true] null

Solution 1 - Submitted on Sat Aug 17 17:24:11 2013

class GenerateTicket {

    public static void main(String s[]) {
        List fares = new ArrayList();
        fares.add(new Fare(0, 40, 0.90));
        fares.add(new Fare(41, 60, 0.80));
        fares.add(new Fare(61, 80, 0.70));
        fares.add(new Fare(81, 100, 0.65));
        fares.add(new Fare(101, 500, 0.60));
        List stages = new ArrayList();
        stages.add(new Stage("KAMMAREDDYPALLY", 100.0));
        stages.add(new Stage("TELKAPALLY", 94.0));
        stages.add(new Stage("RAGUPATHIPET", 85.0));
        stages.add(new Stage("KALWAKURTHI", 70.0));
        stages.add(new Stage("VELDANDA", 60.0));
        stages.add(new Stage("THANDA", 55.0));
        stages.add(new Stage("AMANGAL", 40.0));
        stages.add(new Stage("KADTHAL", 30.0));
        stages.add(new Stage("THUKKUGUDA", 20.0));
        stages.add(new Stage("CHANDRAN GUTTA", 15.0));
        stages.add(new Stage("SANTHOSH NAGAR", 10.0));
        stages.add(new Stage("NALGONDA X ROAD", 5.0));
        stages.add(new Stage("KOTI", 1.0));
        stages.add(new Stage("HYDERABAD", 0.0));
        System.out.println("The generated ticket: " + generateTicket(fares, stages, 60.0, "09:00", "TELKAPALLY", "KOTI", JourneyType.FORWARD, false));
    }

    public static Ticket generateTicket(List fares, List stages, double averageBusSpeed, String busStartTime, String from, String to, JourneyType journeyType, boolean hasCatCard) {
        Ticket t = new Ticket(null, null, null, null, null, null);
        Map map = new HashMap();
        Date date = null;
        for (Stage temp : stages) {
            map.put(temp.from, temp.distance);
        }
        Double distance1 = (Double) map.get(from);
        Double distance2 = (Double) map.get(to);
        if (distance1 == null || distance2 == null || distance1 == distance2)
            return null;
        if (distance1 > distance2) {
            if (journeyType == JourneyType.BACKWARD)
                return null;
        } else if (journeyType == JourneyType.FORWARD)
            return null;
        t.distance = Math.abs(distance1 - distance2);
        DateFormat df = new SimpleDateFormat("hh:mm");
        try {
            date = df.parse(busStartTime);
        } catch (Exception ex) {
        }
        double time1 = 0, time2 = 0;
        double fare = calcFare(t.distance, fares);
        System.out.println(fare);
        if (hasCatCard == true)
            t.fare = (double) Math.round(fare * 90 / 100.0 + 0.5);
        else
            t.fare = (double) Math.ceil(fare);
        if (journeyType == JourneyType.BACKWARD) {
            time1 = 60 * distance1 / averageBusSpeed;
            time2 = 60 * distance2 / averageBusSpeed;
        }
        if (journeyType == JourneyType.FORWARD) {
            time1 = 60 * (stages.get(0).distance - distance1) / averageBusSpeed;
            time2 = 60 * (stages.get(0).distance - distance2) / averageBusSpeed;
        }
        t.scheduledDepartureTime = time(time1, date);
        t.scheduledArrivalTime = time(time2, date);
        t.from = from;
        t.to = to;
        return t;
    }

    private static String time(double time, Date date) {
        DateFormat df = new SimpleDateFormat("hh:mm");
        int hrs = (int) (time / 60);
        int min = (int) Math.rint((time % 60));
        Calendar gc = new GregorianCalendar();
        gc.setTime(date);
        gc.add(Calendar.HOUR, hrs);
        gc.add(Calendar.MINUTE, min);
        String newTime = df.format(gc.getTime());
        return newTime;
    }

    private static double calcFare(Double distance, List fares) {
        double sum = 0;
        for (Fare temp : fares) {
            if (distance >= (temp.end - temp.start)) {
                int a = temp.end - temp.start;
                if (!fares.get(0).equals(temp))
                    a++;
                sum += a * temp.pricePerKM;
                distance -= a;
                System.out.println(sum);
            } else if (distance > 0) {
                sum += distance * temp.pricePerKM;
                distance -= temp.end - temp.start;
            } else
                break;
        }
        return sum;
    }
}

enum JourneyType {
    FORWARD, BACKWARD
}

class Stage {

    String from;
    Double distance;

    public Stage(String from, Double distance) {
        this.from = from;
        this.distance = distance;
    }
}

class Fare {

    int start;
    int end;
    double pricePerKM;

    public Fare(int start, int end, double pricePerKM) {
        this.start = start;
        this.end = end;
        this.pricePerKM = pricePerKM;
    }
}

class Ticket {

    String from;
    String to;
    Double distance;
    Double fare;
    String scheduledDepartureTime;
    String scheduledArrivalTime;

    public Ticket(String from, String to, Double distance, Double fare, String scheduledDepartureTime, String scheduledArrivalTime) {
        this.fare = fare;
        this.from = from;
        this.to = to;
        this.distance = distance;
        this.scheduledDepartureTime = scheduledDepartureTime;
        this.scheduledArrivalTime = scheduledArrivalTime;
    }

    @Override
    public String toString() {
        return from + " - " + to + " : " + distance + " - " + fare + " - " + scheduledDepartureTime + " - " + scheduledArrivalTime;
    }
}

Comments :

Solution 2 - Submitted on Sun Aug 18 10:33:15 2013

class GenerateTicket {

    public static void main(String s[]) {
        List fares = new ArrayList();
        fares.add(new Fare(0, 40, 0.90));
        fares.add(new Fare(41, 60, 0.80));
        fares.add(new Fare(61, 80, 0.70));
        fares.add(new Fare(81, 100, 0.65));
        fares.add(new Fare(101, 500, 0.60));
        List stages = new ArrayList();
        stages.add(new Stage("KAMMAREDDYPALLY", 100.0));
        stages.add(new Stage("TELKAPALLY", 94.0));
        stages.add(new Stage("RAGUPATHIPET", 85.0));
        stages.add(new Stage("KALWAKURTHI", 70.0));
        stages.add(new Stage("VELDANDA", 60.0));
        stages.add(new Stage("THANDA", 55.0));
        stages.add(new Stage("AMANGAL", 40.0));
        stages.add(new Stage("KADTHAL", 30.0));
        stages.add(new Stage("THUKKUGUDA", 20.0));
        stages.add(new Stage("CHANDRAN GUTTA", 15.0));
        stages.add(new Stage("SANTHOSH NAGAR", 10.0));
        stages.add(new Stage("NALGONDA X ROAD", 5.0));
        stages.add(new Stage("KOTI", 1.0));
        stages.add(new Stage("HYDERABAD", 0.0));
        System.out.println("The generated ticket: " + generateTicket(fares, stages, 60.0, "09:00", "TELKAPALLY", "KOTI", JourneyType.FORWARD, false));
    }

    public static Ticket generateTicket(List fares, List stages, double averageBusSpeed, String busStartTime, String from, String to, JourneyType journeyType, boolean hasCatCard) {
        /* 
           This is a generateTicket method where fares list, stages list, averageBusSpeed, busStartTime, from, to, journeyType and hasCatCard operators passed. 
           As our Admin said its very easy. I used two exta methods for calculating time and fare as getTime() and getFare() methods. 
            */
        Ticket ticket = new Ticket(null, null, 0.0, 0.0, null, null);
        // Created a null object of Ticket class as ticket
        int startingPoint = -1, destinationPoint = -1;
        // Initialising Source, Destination point as -1 
        for (int i = 0; i < stages.size(); i++)
        // For loop to check all the element from stages list
        {
            Stage stage = stages.get(i);
            // Creating object to a Stage class & assigning stages list elemts
            if (stage.from == from)
                startingPoint = i;
            /* Now modifying starting and destination points positions if they matched in the stages list */
            if (stage.from == to)
                destinationPoint = i;
        }
        if (startingPoint == destinationPoint || startingPoint == -1 || destinationPoint == -1)
            return null;
        /* If the source and destination points are equal or if any one of the stages is not present in the stages list of service 1 or 2 then we are returning as null */
        if (startingPoint < destinationPoint)
        /* If the sourcePoint is less than the destinationPoint the journeyType becomes ForwardType else it becomes BackwardType */
        {
            if (JourneyType.FORWARD == journeyType)
            /* If the Enum type matches forward  then we assign source destination names to ticket class object else return null */
            {
                ticket.from = from;
                ticket.to = to;
                Stage s1 = stages.get(0);
                Stage s2 = stages.get(startingPoint);
                /* Here two objects of Stage class created, This is a forward type journey so s1 for first stage of stages list, s2 for the source stage */
                double d2 = s1.distance - s2.distance;
                // Here the difference of first stage to source stage
                double dd2 = d2 * 60 / averageBusSpeed;
                // This is the time taken for bus with speed
                String gettime1 = getTime(dd2, busStartTime);
                /* Here getTime method is called where dd2 extra time from first stage to source stage and source stage start time are passed */
                ticket.scheduledDepartureTime = gettime1;
                // Here assigning the original start time to the Ticket object
            } else
                return null;
        } else {
            if (JourneyType.BACKWARD == journeyType) {
                // For backward journey type steps repeats as forward        
                ticket.to = to;
                ticket.from = from;
                Stage s3 = stages.get(stages.size() - 1);
                // For backward type last stages element is first stage
                Stage s4 = stages.get(startingPoint);
                double d3 = s4.distance - s3.distance;
                double dd3 = d3 * 60 / averageBusSpeed;
                String gettime2 = getTime(dd3, busStartTime);
                ticket.scheduledDepartureTime = gettime2;
            } else
                return null;
        }
        Stage s5 = stages.get(startingPoint);
        Stage s6 = stages.get(destinationPoint);
        // two objects of Stage class
        ticket.distance = Math.abs(s5.distance - s6.distance);
        // Total distance from source to destination
        ticket.fare = getFare(fares, ticket.distance, hasCatCard);
        /* Here getFare method is called to calculate the amount required for travel, fares list-which have conditions for KM, distance-between source to destination and hasCatCard-for discount of 10 percentage */
        double traveltime = Math.rint(ticket.distance * 60 / averageBusSpeed);
        // Travel time with bus speed
        String arrivaltime = getTime(traveltime, ticket.scheduledDepartureTime);
        // Here we are calling getTime method for calculating arrival time    
        ticket.scheduledArrivalTime = arrivaltime;
        /* ALL THE VALUES ARE ASSIGNED TO OBJECT TICKET AND RETURNING IT */
        return ticket;
    }

    /* GetFare Method, In this method we are creating farePrize double variable which has to return.
      Then using for loop, initially i value is 0 and Fare class object have first fares list element as start end and pricePerKM,if the distance doesn't match the range then goes to else part and farePrice is added for the first fares list element and this repeats till the range gets executed and breaks after successfull calculation of farePrice and if Cartcard is true then it makes 10 percent discount  and returns farePrice. */
    public static double getFare(List fares, double distance, boolean cc) {
        double farePrice = 0.0;
        for (int i = 0; i < fares.size(); i++) {
            Fare f = fares.get(i);
            // Fare class object
            if (distance >= f.start && distance <= f.end) {
                if (f.start == 0) {
                    farePrice = farePrice + (distance - f.start) * f.pricePerKM;
                    break;
                } else {
                    farePrice = farePrice + ((distance - f.start) + 1) * f.pricePerKM;
                    break;
                }
            } else {
                if (f.start == 0)
                    farePrice = farePrice + (f.end - f.start) * f.pricePerKM;
                else
                    farePrice = farePrice + ((f.end - f.start) + 1) * f.pricePerKM;
            }
        }
        if (cc == false)
            return Math.ceil(farePrice);
        else {
            farePrice = farePrice - farePrice * 0.1;
            return Math.ceil(farePrice);
        }
    }

    /*===============================================================*/
    /* getTime method, In this method tm-time in minuts and stringTime-String time variables are passed.
      tm-minutes is compared first with 60 mins, 120 mins...upto 360 mins and depending upon the satisfied if case the stringtime is splitted int hour and mins and then the tm time in mins ahe divided into hours and mins and added to hour and mins. If the mins is equal to 60 then adding hour 1 and mins subtracting 60 and again combining time to string and returning stringtime.*/
    public static String getTime(double tm, String stringtime) {
        if (tm < 60) {
            String[] components = stringtime.split(":");
            int hour = Integer.parseInt(components[0]);
            int min = Integer.parseInt(components[1]);
            hour += 0;
            min += tm;
            if (min == 60) {
                hour += 1;
                min -= 60;
            }
            stringtime = String.format("%02d:%02d", hour, min);
        } else if (tm < 120) {
            String[] components = stringtime.split(":");
            int hour = Integer.parseInt(components[0]);
            int min = Integer.parseInt(components[1]);
            hour += 1;
            min += tm - 60;
            if (min == 60) {
                hour += 1;
                min -= 60;
            }
            stringtime = String.format("%02d:%02d", hour, min);
        } else if (tm < 180) {
            String[] components = stringtime.split(":");
            int hour = Integer.parseInt(components[0]);
            int min = Integer.parseInt(components[1]);
            hour += 2;
            min += tm - 120;
            if (min == 60) {
                hour += 1;
                min -= 60;
            }
            stringtime = String.format("%02d:%02d", hour, min);
        } else if (tm < 240) {
            String[] components = stringtime.split(":");
            int hour = Integer.parseInt(components[0]);
            int min = Integer.parseInt(components[1]);
            hour += 3;
            min += tm - 180;
            if (min == 60) {
                hour += 1;
                min -= 60;
            }
            stringtime = String.format("%02d:%02d", hour, min);
        } else if (tm < 300) {
            String[] components = stringtime.split(":");
            int hour = Integer.parseInt(components[0]);
            int min = Integer.parseInt(components[1]);
            hour += 4;
            min += tm - 240;
            if (min == 60) {
                hour += 1;
                min -= 60;
            }
            stringtime = String.format("%02d:%02d", hour, min);
        } else if (tm < 360) {
            String[] components = stringtime.split(":");
            int hour = Integer.parseInt(components[0]);
            int min = Integer.parseInt(components[1]);
            hour += 5;
            min += tm - 300;
            if (min == 60) {
                hour += 1;
                min -= 60;
            }
            stringtime = String.format("%02d:%02d", hour, min);
        }
        return stringtime;
    }
}

enum JourneyType {
    FORWARD, BACKWARD
}

class Stage {

    String from;
    Double distance;

    public Stage(String from, Double distance) {
        this.from = from;
        this.distance = distance;
    }
}

class Fare {

    int start;
    int end;
    double pricePerKM;

    public Fare(int start, int end, double pricePerKM) {
        this.start = start;
        this.end = end;
        this.pricePerKM = pricePerKM;
    }
}

class Ticket {

    String from;
    String to;
    Double distance;
    Double fare;
    String scheduledDepartureTime;
    String scheduledArrivalTime;

    public Ticket(String from, String to, Double distance, Double fare, String scheduledDepartureTime, String scheduledArrivalTime) {
        this.fare = fare;
        this.from = from;
        this.to = to;
        this.distance = distance;
        this.scheduledDepartureTime = scheduledDepartureTime;
        this.scheduledArrivalTime = scheduledArrivalTime;
    }

    @Override
    public String toString() {
        return from + " - " + to + " : " + distance + " - " + fare + " - " + scheduledDepartureTime + " - " + scheduledArrivalTime;
    }
}

Comments :

Solution 3 - Submitted on Sun Aug 18 14:52:13 2013

class GenerateTicket {

    public static void main(String s[]) {
        List fares = new ArrayList();
        fares.add(new Fare(0, 40, 0.90));
        fares.add(new Fare(41, 60, 0.80));
        fares.add(new Fare(61, 80, 0.70));
        fares.add(new Fare(81, 100, 0.65));
        fares.add(new Fare(101, 500, 0.60));
        List stages = new ArrayList();
        stages.add(new Stage("KAMMAREDDYPALLY", 100.0));
        stages.add(new Stage("TELKAPALLY", 94.0));
        stages.add(new Stage("RAGUPATHIPET", 85.0));
        stages.add(new Stage("KALWAKURTHI", 70.0));
        stages.add(new Stage("VELDANDA", 60.0));
        stages.add(new Stage("THANDA", 55.0));
        stages.add(new Stage("AMANGAL", 40.0));
        stages.add(new Stage("KADTHAL", 30.0));
        stages.add(new Stage("THUKKUGUDA", 20.0));
        stages.add(new Stage("CHANDRAN GUTTA", 15.0));
        stages.add(new Stage("SANTHOSH NAGAR", 10.0));
        stages.add(new Stage("NALGONDA X ROAD", 5.0));
        stages.add(new Stage("KOTI", 1.0));
        stages.add(new Stage("HYDERABAD", 0.0));
        System.out.println("The generated ticket: " + generateTicket(fares, stages, 60.0, "09:00", "TELKAPALLY", "KOTI", JourneyType.FORWARD, false));
    }

    public static Ticket generateTicket(List fares, List stages, double averageBusSpeed, String busStartTime, String from, String to, JourneyType journeyType, boolean hasCatCard) {
        //To generate the ticket
        Ticket t = new Ticket("", "", 0.0, 0.0, "", "");
        int stage1 = -1, stage2 = -1, time1 = 0, time2 = 0;
        double d1 = 0, d2 = 0, point1 = 0, point2 = 0, total = 0;
        for (int i = 0; i < stages.size(); i++) {
            Stage s = stages.get(i);
            //Stage number and starting point of journey
            if (s.from == from) {
                stage1 = i;
                d1 = s.distance;
            }
            //Stage number and ending point of journey
            if (s.from == to) {
                stage2 = i;
                d2 = s.distance;
            }
            //Start and end points of service
            if (i == 0)
                point1 = s.distance;
            if (i == stages.size() - 1)
                point2 = s.distance;
        }
        //Total distance between starting and ending points of service
        total = point1 - point2;
        //Invalid stages
        if (stage1 == stage2)
            return null;
        //If journey type is forward
        if (JourneyType.FORWARD == journeyType) {
            //Valid stages
            if (stage1 < stage2) {
                t.from = from;
                t.to = to;
                t.distance = d1 - d2;
                time1 = (int) Math.rint(((total - d1) / averageBusSpeed) * 60);
                time2 = (int) Math.rint(((d1 - d2) / averageBusSpeed) * 60);
            }
            //Invalid stages
            else
                return null;
        }
        //If journey type is backward
        else if (JourneyType.BACKWARD == journeyType) {
            //Valid stages
            if (stage1 > stage2) {
                t.from = from;
                t.to = to;
                t.distance = d2 - d1;
                time1 = (int) Math.rint((d1 / averageBusSpeed) * 60);
                time2 = (int) Math.rint(((d2 - d1) / averageBusSpeed) * 60);
            }
            //Invalid stages
            else
                return null;
        }
        //Invalid journey type
        else
            return null;
        //Calling method getFare
        t.fare = getFare(fares, t.distance, hasCatCard);
        //Using SimpleDateFormat and Calendar of java.util package for calculating departure time and arrival time 
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm");
        Calendar cal = Calendar.getInstance();
        //Storing hours and minutes of bus start time in integer form
        int h = Integer.parseInt(busStartTime.substring(0, 2));
        int m = Integer.parseInt(busStartTime.substring(3, 5));
        //Setting the calendar to reflect the bus start time
        cal.set(Calendar.HOUR, h);
        cal.set(Calendar.MINUTE, m);
        //Adding time to calculate the departure time
        cal.add(Calendar.MINUTE, time1);
        t.scheduledDepartureTime = sdf.format(cal.getTime());
        //Adding time to calculate the arrival time
        cal.add(Calendar.MINUTE, time2);
        t.scheduledArrivalTime = sdf.format(cal.getTime());
        return t;
    }

    //To calculate the fare
    public static double getFare(List fares, double distance, boolean hasCatCard) {
        double fare = 0, discount = 0;
        for (int i = 0; i < fares.size(); i++) {
            Fare f = fares.get(i);
            //Calculating fare when in range of journey length
            if (distance > f.start && distance <= f.end) {
                if (f.start == 0) {
                    fare += f.pricePerKM * (distance - f.start);
                    break;
                } else {
                    fare += f.pricePerKM * (distance - f.start + 1);
                    break;
                }
            }
            //Calculating fare when in lower range than that of journey length
            else {
                if (f.start == 0)
                    fare += (f.end - f.start) * f.pricePerKM;
                else
                    fare += (f.end - f.start + 1) * f.pricePerKM;
            }
        }
        //Discount of 10% if the passenger has Cat Card
        if (hasCatCard) {
            discount = fare / 10;
            fare -= discount;
        }
        return Math.ceil(fare);
    }
}

enum JourneyType {
    FORWARD, BACKWARD
}

class Stage {

    String from;
    Double distance;

    public Stage(String from, Double distance) {
        this.from = from;
        this.distance = distance;
    }
}

class Fare {

    int start;
    int end;
    double pricePerKM;

    public Fare(int start, int end, double pricePerKM) {
        this.start = start;
        this.end = end;
        this.pricePerKM = pricePerKM;
    }
}

class Ticket {

    String from;
    String to;
    Double distance;
    Double fare;
    String scheduledDepartureTime;
    String scheduledArrivalTime;

    public Ticket(String from, String to, Double distance, Double fare, String scheduledDepartureTime, String scheduledArrivalTime) {
        this.fare = fare;
        this.from = from;
        this.to = to;
        this.distance = distance;
        this.scheduledDepartureTime = scheduledDepartureTime;
        this.scheduledArrivalTime = scheduledArrivalTime;
    }

    @Override
    public String toString() {
        return from + " - " + to + " : " + distance + " - " + fare + " - " + scheduledDepartureTime + " - " + scheduledArrivalTime;
    }
}

Comments :

Solution 4 - Submitted on Sun Aug 18 15:34:20 2013

class GenerateTicket {

    public static void main(String s[]) {
        List fares = new ArrayList();
        fares.add(new Fare(0, 40, 0.90));
        fares.add(new Fare(41, 60, 0.80));
        fares.add(new Fare(61, 80, 0.70));
        fares.add(new Fare(81, 100, 0.65));
        fares.add(new Fare(101, 500, 0.60));
        List stages = new ArrayList();
        stages.add(new Stage("KAMMAREDDYPALLY", 100.0));
        stages.add(new Stage("TELKAPALLY", 94.0));
        stages.add(new Stage("RAGUPATHIPET", 85.0));
        stages.add(new Stage("KALWAKURTHI", 70.0));
        stages.add(new Stage("VELDANDA", 60.0));
        stages.add(new Stage("THANDA", 55.0));
        stages.add(new Stage("AMANGAL", 40.0));
        stages.add(new Stage("KADTHAL", 30.0));
        stages.add(new Stage("THUKKUGUDA", 20.0));
        stages.add(new Stage("CHANDRAN GUTTA", 15.0));
        stages.add(new Stage("SANTHOSH NAGAR", 10.0));
        stages.add(new Stage("NALGONDA X ROAD", 5.0));
        stages.add(new Stage("KOTI", 1.0));
        stages.add(new Stage("HYDERABAD", 0.0));
        System.out.println("The generated ticket: " + generateTicket(fares, stages, 60.0, "09:00", "TELKAPALLY", "KOTI", JourneyType.FORWARD, false));
    }

    public static Ticket generateTicket(List fares, List stages, double averageBusSpeed, String busStartTime, String from, String to, JourneyType journeyType, boolean hasCatCard) {
        double temp_distance = 0.0;
        double distance = 0, fare;
        double start = -1, end = -1;
        String scheduledDepartureTime = "", scheduledArrivalTime = "";
        for (Stage s : stages) {
            if (s.from == from) {
                start = s.distance;
                temp_distance = s.distance;
            }
            if (s.from == to)
                end = s.distance;
        }
        if (start == -1 || end == -1 || start == end)
            return null;
        switch (journeyType) {
            case FORWARD :
                if (start < end)
                    return null;
        }
        distance = end - start;
        switch (journeyType) {
            case FORWARD :
                temp_distance = stages.get(0).distance - temp_distance;
                distance = start - end;
        }
        Collections.sort(fares, new Comparator() {

            public int compare(Fare Fare1, Fare Fare2) {
                return Double.compare(Fare1.pricePerKM, Fare2.pricePerKM);
            }
        });
        fare = Amount(fares, distance, hasCatCard);
        DateFormat df = new SimpleDateFormat("hh:mm");
        Date date = new Date();
        try {
            date = df.parse(busStartTime);
        } catch (ParseException pe) {
        }
        Date clonedate = (java.util.Date) date.clone();
        date.setMinutes((int) Math.rint((temp_distance / averageBusSpeed * 60)));
        scheduledDepartureTime = df.format(date);
        clonedate.setMinutes((int) Math.rint(((temp_distance + distance) / averageBusSpeed * 60)));
        scheduledArrivalTime = df.format(clonedate);
        if (fare < 0)
            return null;
        return new Ticket(from, to, distance, fare, scheduledDepartureTime, scheduledArrivalTime);
    }

    public static double Amount(List fares, Double distance, boolean hasCatCard) {
        double fare = 0;
        if (distance <= 40)
            fare = distance * fares.get(4).pricePerKM;
        else if (distance > 40 && distance <= 60)
            fare = 40 * fares.get(4).pricePerKM + (distance - 40) * fares.get(3).pricePerKM;
        else if (distance > 60 && distance <= 80)
            fare = 40 * fares.get(4).pricePerKM + 20 * fares.get(3).pricePerKM + (distance - 60) * fares.get(2).pricePerKM;
        else if (distance > 80 && distance <= 100)
            fare = 40 * fares.get(4).pricePerKM + 20 * fares.get(3).pricePerKM + 20 * fares.get(2).pricePerKM + (distance - 80) * fares.get(1).pricePerKM;
        else
            fare = 40 * fares.get(4).pricePerKM + 20 * fares.get(3).pricePerKM + 20 * fares.get(2).pricePerKM + 20 * fares.get(1).pricePerKM + (distance - 100) * fares.get(0).pricePerKM;
        if (hasCatCard == true)
            fare = fare - (fare * 0.1);
        fare = java.lang.Math.ceil(fare);
        return fare;
    }
}

enum JourneyType {
    FORWARD, BACKWARD
}

class Stage {

    String from;
    Double distance;

    public Stage(String from, Double distance) {
        this.from = from;
        this.distance = distance;
    }
}

class Fare {

    int start;
    int end;
    double pricePerKM;

    public Fare(int start, int end, double pricePerKM) {
        this.start = start;
        this.end = end;
        this.pricePerKM = pricePerKM;
    }
}

class Ticket {

    String from;
    String to;
    Double distance;
    Double fare;
    String scheduledDepartureTime;
    String scheduledArrivalTime;

    public Ticket(String from, String to, Double distance, Double fare, String scheduledDepartureTime, String scheduledArrivalTime) {
        this.fare = fare;
        this.from = from;
        this.to = to;
        this.distance = distance;
        this.scheduledDepartureTime = scheduledDepartureTime;
        this.scheduledArrivalTime = scheduledArrivalTime;
    }

    @Override
    public String toString() {
        return from + " - " + to + " : " + distance + " - " + fare + " - " + scheduledDepartureTime + " - " + scheduledArrivalTime;
    }
}

Comments :

Solution 5 - Submitted on Sun Aug 18 15:40:16 2013

class GenerateTicket {

    public static void main(String s[]) {
        List fares = new ArrayList();
        fares.add(new Fare(0, 40, 0.90));
        fares.add(new Fare(41, 60, 0.80));
        fares.add(new Fare(61, 80, 0.70));
        fares.add(new Fare(81, 100, 0.65));
        fares.add(new Fare(101, 500, 0.60));
        List stages = new ArrayList();
        stages.add(new Stage("KAMMAREDDYPALLY", 100.0));
        stages.add(new Stage("TELKAPALLY", 94.0));
        stages.add(new Stage("RAGUPATHIPET", 85.0));
        stages.add(new Stage("KALWAKURTHI", 70.0));
        stages.add(new Stage("VELDANDA", 60.0));
        stages.add(new Stage("THANDA", 55.0));
        stages.add(new Stage("AMANGAL", 40.0));
        stages.add(new Stage("KADTHAL", 30.0));
        stages.add(new Stage("THUKKUGUDA", 20.0));
        stages.add(new Stage("CHANDRAN GUTTA", 15.0));
        stages.add(new Stage("SANTHOSH NAGAR", 10.0));
        stages.add(new Stage("NALGONDA X ROAD", 5.0));
        stages.add(new Stage("KOTI", 1.0));
        stages.add(new Stage("HYDERABAD", 0.0));
        System.out.println("The generated ticket: " + generateTicket(fares, stages, 60.0, "09:00", "TELKAPALLY", "KOTI", JourneyType.FORWARD, false));
    }

    public static Ticket generateTicket(List fares, List stages, double averageBusSpeed, String busStartTime, String from, String to, JourneyType journeyType, boolean hasCatCard) {
        int fromIndex = -1;
        int toIndex = -1;
        // finding the indexes of from station and to station
        for (int i = 0; i < stages.size(); i++) {
            if (stages.get(i).from.equals(from)) {
                fromIndex = i;
            }
            if (stages.get(i).from.equals(to)) {
                toIndex = i;
            }
        }
        // if the journey is not possible then return null
        if ((journeyType == JourneyType.FORWARD && toIndex <= fromIndex) || (journeyType == JourneyType.BACKWARD && toIndex >= fromIndex))
            return null;
        else {
            //find the distance between starting point and source
            double distanceBetweenStartAndSource;
            if (journeyType == JourneyType.FORWARD) {
                // for the forward journey (first stop - given stop)
                distanceBetweenStartAndSource = Math.abs(stages.get(0).distance - stages.get(fromIndex).distance);
            } else {
                // for the forward journey (last stop - given stop)
                distanceBetweenStartAndSource = Math.abs(stages.get(stages.size() - 1).distance - stages.get(fromIndex).distance);
            }
            // calculating time taken to travel from source to boarding point 
            int timeForStartToSource = (int) Math.rint(distanceBetweenStartAndSource * 60 / averageBusSpeed);
            Calendar cal1 = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            try {
                cal1.setTime(sdf.parse(busStartTime));
                // adding the given time to starting time to get the boarding time
                cal1.add(Calendar.MINUTE, timeForStartToSource);
            } catch (ParseException e1) {
                e1.printStackTrace();
            }
            double fare = 0.0;
            String arrivalTime = "";
            String startTime = sdf.format(cal1.getTime());
            //calculating distance between source and destination and time taken to travel from source to destination
            double distanceBetweeenSourceAndDestination = Math.abs(stages.get(fromIndex).distance - stages.get(toIndex).distance);
            int timeBetweenSourceAndDestination = (int) Math.rint(distanceBetweeenSourceAndDestination * 60 / averageBusSpeed);
            Calendar cal = Calendar.getInstance();
            try {
                cal.setTime(sdf.parse(startTime));
                // adding the time obtained to boarding time to get arrival time at destination
                cal.add(Calendar.MINUTE, timeBetweenSourceAndDestination);
                arrivalTime = sdf.format(cal.getTime());
                fare = calculateFare(distanceBetweeenSourceAndDestination, fares, hasCatCard);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return new Ticket(from, to, distanceBetweeenSourceAndDestination, fare, startTime, arrivalTime);
        }
    }

    // function to calculate fare for the given distance
    public static double calculateFare(double distance, List fares, boolean hasCatCard) {
        double fare = 0.0;
        boolean flag = true;
        // for the first boundary limits
        if (fares.get(0).end <= distance)
            fare = fare + fares.get(0).pricePerKM * (fares.get(0).end - fares.get(0).start);
        else {
            fare = fare + fares.get(0).pricePerKM * (distance - fares.get(0).start);
            flag = false;
        }
        // for the other boundary limits
        if (flag) {
            for (int i = 1; i < fares.size(); i++) {
                if (fares.get(i).end <= distance)
                    fare = fare + fares.get(i).pricePerKM * (fares.get(i).end - fares.get(i).start + 1);
                else {
                    fare = fare + fares.get(i).pricePerKM * (distance - fares.get(i).start + 1);
                    break;
                }
            }
        }
        if (hasCatCard)
            fare = fare * 0.9;
        return Math.ceil(fare);
    }
}

enum JourneyType {
    FORWARD, BACKWARD
}

class Stage {

    String from;
    Double distance;

    public Stage(String from, Double distance) {
        this.from = from;
        this.distance = distance;
    }
}

class Fare {

    int start;
    int end;
    double pricePerKM;

    public Fare(int start, int end, double pricePerKM) {
        this.start = start;
        this.end = end;
        this.pricePerKM = pricePerKM;
    }
}

class Ticket {

    String from;
    String to;
    Double distance;
    Double fare;
    String scheduledDepartureTime;
    String scheduledArrivalTime;

    public Ticket(String from, String to, Double distance, Double fare, String scheduledDepartureTime, String scheduledArrivalTime) {
        this.fare = fare;
        this.from = from;
        this.to = to;
        this.distance = distance;
        this.scheduledDepartureTime = scheduledDepartureTime;
        this.scheduledArrivalTime = scheduledArrivalTime;
    }

    @Override
    public String toString() {
        return from + " - " + to + " : " + distance + " - " + fare + " - " + scheduledDepartureTime + " - " + scheduledArrivalTime;
    }
}

Comments :

© meritcampus 2019

All Rights Reserved.

Open In App