Xin các cao nhân chỉ giáo

Discussion in 'Trao đổi về thuật toán' started by ninh_nguyen, 22/12/16.

  1. ninh_nguyen

    ninh_nguyen New Member

    Tình hình là em có làm 1 bài test do cty đưa ra. Nhưng em đang bị fail kha khá trường hợp. Em up nguyên văn nội dung câu hỏi và code em đang code, mong mọi người vào giúp em với ạ. Hiện tại trường hợp số ngày trong năm chia hết cho số ngày trong tháng em đã chạy được, nhưng còn trường hợp chia dư thì em đang bị sai. Cả trường hợp số ngày trong tháng chia dư cho số ngày trong tuần nữa.

    Đề bài:
    Calendar Specifications
    There are 3 parameters for our new calendar.

    • daysInYear: days contained in a year
    • daysInMonth: days contained in a month
    • daysInWeek: days contained in a week
    For example:

    • daysInYear: 300
    • daysInMonth: 30
    • daysInWeek: 10
    This would mean that:

    • 1 year = 300 days
    • 1 month = 30 days
      • So, 1 year = 10 months
    • 1 week = 10 days
      • So, it's always 1 month = 3 weeks
      • The first day of every month is always the first day of the first week.
    In the actual calendar, months have different numbers of days. (e.g. 31, 30, 28)
    But in this calendar, all months have the same number of days.

    Regarding days of the week,
    We'll call the first day of the week as 'A'.
    The following day is 'B', then 'C', 'D'... and so on.

    For convenience, the maximum number of days in the week is set to 26.
    (The longest possible week is an 'A' to 'Z' week.)

    The origin date of this calendar is always 0001-01-01,
    of which the day of the week is always 'A'.

    Leap Months
    The parameters daysInYear and daysInMonth are separate.
    Thus, daysInYear might not be divisible by daysInMonth.

    For example,

    • daysInYear: 365
    • daysInMonth: 50
    In this case, 1 year = 7 months and 15 remainder days.
    The remainder days accumulate every year. When the total remainder days reach daysInMonth, an additional month is added to that year.
    So in this example:

    • Year 0001 has 7 months and 15 remainder days
    • Year 0002 has 7 months and 30 remainder days total
    • Year 0003 has 7 months and 45 remainder days total
    • Year 0004 has 8 months and 5 remainder days. (50 days are rounded up to the additional month)
    Weeks repeat uninterrupted over months and years.

    Còn đây là nội dung file test:

    Code:
    { "input": "160 30 7 0001-01-01", "output": [ "A" ] },
      { "input": "160 30 7 0001-01-07", "output": [ "G" ] },
      { "input": "160 30 7 0001-01-08", "output": [ "A" ] },
      { "input": "160 30 7 0001-01-30", "output": [ "B" ] },
      { "input": "160 30 7 0001-01-31", "output": [ "-1" ] },
      { "input": "160 30 7 0003-06-30", "output": [ "D" ] },
      { "input": "160 30 7 0003-07-01", "output": [ "-1" ] },
      { "input": "160 30 7 0004-01-01", "output": [ "E" ] },
      { "input": "160 30 7 0004-06-01", "output": [ "-1" ] },

    Còn đây là code của em. Các bác giúp em với ạ.


    Code:
    public static void main(String[] args) {
            int lenght = args.length;
            if (lenght != 4) {
                System.out.print(-1);
                return;
            }
            String daysYear = args[0];
            String daysMonth = args[1];
            String daysWeek = args[2];
            String date = args[3];
            int daysInYear = Integer.parseInt(daysYear);
            int daysInMonth = Integer.parseInt(daysMonth);
            int daysInWeek = Integer.parseInt(daysWeek);
            String[] dateTime = date.split("-");
    
            if (dateTime == null) {
                System.out.print(-1);
                return;
            }
            int nMonth = daysInYear / daysInMonth;
            int yearInput = Integer.parseInt(dateTime[0]);
            int monthInput = Integer.parseInt(dateTime[1]);
            int dayInput = Integer.parseInt(dateTime[2]);
            int remainders = daysInYear % daysInMonth;
            int remainder_day_week = daysInMonth % daysInWeek;
    
            if (remainders == 0) {
                if (dayInput > daysInMonth || monthInput > nMonth) {
                    System.out.print(-1);
                    return;
                }
                int ASCII = (dayInput % daysInWeek) + 64;
                String result = Character.toString((char) ASCII);
                System.out.println(result);
    
            } else {
                while (remainders != 0) {
    
                    if (remainders < daysInMonth) {
                        yearInput = yearInput + 1;
                        remainders = remainders + 15;
                    } else {
                        yearInput = yearInput + 1;
                        remainders = remainders - daysInMonth;
                        nMonth += 1;
                    }
                    if (dayInput > daysInMonth || monthInput > nMonth) {
                        System.out.print(-1);
                        return;
                    }
    
                    int ASCII = (dayInput % daysInWeek) + ((monthInput - 1) * remainder_day_week) + 64;
                    String result = Character.toString((char) ASCII);
                    System.out.println(result);
                    remainders = 0;
                }
            }
        }
    
  2. badboy3283

    badboy3283 Active Member

    Đề là tính số dư ngày còn lại sau khi lấy tổng ngày chia cho số ngày trong tháng, lấy số dư bắt đầu từ 0001 + dồn vào cho đến khi đủ tháng
    Và tính thứ tự thứ theo A-Z: Tính ra được tổng sô ngày theo input date, lấy số dư theo tổng số ngày trong tuần, lưu ý 0 = A

    Code Python:

    Code:
    dayOfYears = 365
    dayOfMonths = 50
    dayOfWeeks = 7
    
    inputYear = 3
    inputMonth = 6
    inputDay = 30
    
    year = 1
    remaining = 0
    actualDays = 0
    while year <= inputYear:
        days = remaining + dayOfYears
        month = int(days / dayOfMonths)
        remaining = days % dayOfMonths
        if year < inputYear:
            actualDays += month * dayOfMonths
        else:
            #-1 skip current month
            actualDays += (inputMonth - 1) * dayOfMonths 
         
        print "Year %s has %s month and remaining for next year is %s" % (year, month, remaining)
        year += 1
    
    print "Name of Day of Week of year %s and month %s" % (inputYear, inputMonth)  
    while inputDay <= dayOfMonths:
        days = actualDays + inputDay
        week = (days - 1) % dayOfWeeks
        print "%s: (%s - 1) mod %s = %s = %s" % (inputDay, days, dayOfWeeks, week, chr(97 + week))
        inputDay += 1
    
    Result:

    Code:
    Year 1 has 7 month and remaining for next year is 15
    Year 2 has 7 month and remaining for next year is 30
    Year 3 has 7 month and remaining for next year is 45
    Name of Day of Week of year 3 and month 6
    30: (980 - 1) mod 7 = 6 = g
    31: (981 - 1) mod 7 = 0 = a
    32: (982 - 1) mod 7 = 1 = b
    33: (983 - 1) mod 7 = 2 = c
    34: (984 - 1) mod 7 = 3 = d
    35: (985 - 1) mod 7 = 4 = e
    36: (986 - 1) mod 7 = 5 = f
    37: (987 - 1) mod 7 = 6 = g
    38: (988 - 1) mod 7 = 0 = a
    39: (989 - 1) mod 7 = 1 = b
    40: (990 - 1) mod 7 = 2 = c
    41: (991 - 1) mod 7 = 3 = d
    42: (992 - 1) mod 7 = 4 = e
    43: (993 - 1) mod 7 = 5 = f
    44: (994 - 1) mod 7 = 6 = g
    45: (995 - 1) mod 7 = 0 = a
    46: (996 - 1) mod 7 = 1 = b
    47: (997 - 1) mod 7 = 2 = c
    48: (998 - 1) mod 7 = 3 = d
    49: (999 - 1) mod 7 = 4 = e
    50: (1000 - 1) mod 7 = 5 = f
    
    
  3. Nolimit

    Nolimit New Member

    Cái input này :
    { "input": "160 30 7 0003-06-30", "output": [ "D" ] } sao lại ra D được nhỉ, tính nó phải ra C chứ nhỉ, chủ thớt làm chưa giải thích hộ mình cái.
  4. badboy3283

    badboy3283 Active Member

    Thứ trong tuần bắt đầu tính từ 0001-01-01 nhé
  5. Nolimit

    Nolimit New Member

    Thì đây là ngày đầu tiên theo lịch và là A. Rồi đến 0003-06-30 là qua 2 năm 5 tháng và 30 ngày. Đó là ngày thứ 2*160+5*30+30 = 500. Chia cho 7 thì dư 3 => là C chứ nhỉ
    p/s: laptop hư lên giờ mới có thời gian lên lại, sr nhé
  6. badboy3283

    badboy3283 Active Member

    Mỗi năm có số dư ngày sẽ cộng dồn cho năm sau nhé

    Đoạn code mình demo sai chỗ này, tính theo số ASCII bắt đầu là A:
    week = days % dayOfWeeks
    Chuyển thành:
    week = (days - 1) % dayOfWeeks

    Theo options:
    dayOfYears = 365
    dayOfMonths = 50
    dayOfWeeks = 7

    Đề bài dạng này không thể áp 1 công thức để tính tổng sô ngày đc, phải loop từ ngày bắt đầu mới ra chính xác.

    Thì năm 1 ngày kết thúc là 50/07/0001 = 350 ngày
    Năm 2 ngày bắt đầu: 01/01/0002 = 351 ngày
    Nolimit likes this.
  7. Nolimit

    Nolimit New Member

    uh phải tính kiểu này mới đúng, cảm ơn c nhé, hehe tính lâu rồi mà giờ mới post xác nhận lại :-bd

Chia sẻ trang này