Loading...
alecc avatar alecc 12 Точки

9.** Monthly Calendar

Здравейте, 

Реших задачата и всичко се визуализира както трябва в browser-а.
Също така сравних и генерираният код от browser-a с тези, които са дадени в файла със задачите и са напълно идентични, но въпреки това на абсолютно всички тестове в judge ми гърми с една й съща грешка.

Expected Output: (празно)
Your Output: <table>  (оцветено в зелено и нищо повече)

Това е кода на функцията : http://pastebin.com/76dNSJ5x, а това на html-а : http://pastebin.com/r5zeeLnS.

Ще се радвам ако някой може да помогне.

Тагове:
0
JavaScript Fundamentals
dspassov avatar dspassov 16 Точки
Best Answer

Просто махни console.log-a накрая! Ако махнеш само return-a също взимаш 100/100, но тогава няма да излезне с html-a .

1
01/10/2016 23:46:13
alecc avatar alecc 12 Точки

Благодаря! Въобще не бях обърнал внимание точно на това.

0
chadel4e avatar chadel4e 15 Точки

Ето го и моя в judge неиска ето линк.

0
23/09/2016 13:28:06
nakov avatar nakov SoftUni Team Trainer 5295 Точки

При мене решението е такова:

function calendar([day, month, year])
{
    // TODO: return the HTML text holding the calendar table

    month--; // months in Date() are [0...11], not [1...12]
    let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
        daysInMonth[1] = 29; // leap year

    // Print the calendar table header
    let html = '<table>\n';
    html += '  <tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr>\n';

    // Print the days of the previous month
    let week = 0;
    let date = new Date(year, month, 1);
    let dayOfWeek = date.getDay();
    let firstDayPrevMonth = daysInMonth[(month-1 + 12) % 12]-dayOfWeek;
    if (dayOfWeek > 0)
        html += '  <tr>';
    for (let i=1; i<=dayOfWeek; i++) {
        html += '<td class="prev-month">' + (firstDayPrevMonth + i) + '</td>';
        week++;
    }

    // Print the days of the current month
    let monthDaysCount = daysInMonth[month];
    for (let i=1; i<=monthDaysCount; i++) {
        if (week == 0)
            html += '  <tr>';
        if (day == i)
            html += '<td class="today">' + i + '</td>';
        else
            html += '<td>' + i + '</td>';
        week++;
        if (week == 7) {
            html += '</tr>\n';
            week=0;
        }
    }

    // Print the days of the next month
    for (let i=1; week!=0; i++) {
        html += '<td class="next-month">' + i + '</td>';
        week++;
        if (week == 7) {
            html += '</tr>\n';
            week = 0;
        }
    }

    html += '</table>';
    return html;
}
4
23/09/2016 08:49:18
alecc avatar alecc 12 Точки

Благодаря! Решението е доста по-добро от моето ;д. Не бях добавил по принцип това с leap year, но като цяло все пак не разбрах защо гърми навсякъде.

0
chadel4e avatar chadel4e 15 Точки

Дам определено има доста повече логига аз до 70 точки го докарах :(

0
AntonPetrov avatar AntonPetrov 491 Точки

@nakov Всъщност проверката за високосна година е излишна. Апито за датите е хитро и си смята високосните години коректно.

Например console.log(new Date(2015,2,0)) дава 28 февруари 2015, а console.log(new Date(2016,2,0)) дава 29 феврари 2016. Датите се задават от 1, ден "0" е последният ден от предния месец.

0
bobekabg avatar bobekabg 30 Точки

Моето решение е малко по различно. Използвани са и неща, които не са взети все още. Ако на някой му е интересно:

http://pastebin.com/vpnkbmPs smiley

0
awesomeo avatar awesomeo 20 Точки

И аз я направих. С определяне на стартова дата, увеличаване с по 1 ден и проверки в кой клас попада датата.

 

function calendar([day, month, year]) {
            let html = '<table>\n';
            html += '  <tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr>\n';
            let inputDate = new Date(year, month - 1, day);
            let calendarDate = new Date(inputDate);
            calendarDate.setDate(1);
            calendarDate = new Date(calendarDate.getFullYear(), calendarDate.getMonth(), (calendarDate.getDate() - calendarDate.getDay()));
            for (let r = 0; r < 6; r++) {   // can't be more than 6 weeks
                if ((calendarDate.getMonth() != inputDate.getMonth()) && calendarDate.getTime() > inputDate.getTime()) {
                    continue;
                }
                else {
                    html += (r == 0) ? '  <tr>' : '<tr>';
                }
                for (let c = 0; c < 7; c++) {
                    if (calendarDate.getTime() === inputDate.getTime()) {
                        html += '<td class="today">' + calendarDate.getDate() + '</td>';
                    }
                    else if ((calendarDate.valueOf() < inputDate.valueOf()) && calendarDate.getMonth() != inputDate.getMonth()) {
                        html += '<td class="prev-month">' + calendarDate.getDate() + '</td>';
                    }
                    else if ((calendarDate.valueOf() > inputDate.valueOf()) && calendarDate.getMonth() != inputDate.getMonth()) {
                        html += '<td class="next-month">' + calendarDate.getDate() + '</td>';
                    }
                    else {
                        html += '<td>' + calendarDate.getDate() + '</td>';
                    }
                    calendarDate = new Date(calendarDate.getFullYear(), calendarDate.getMonth(), calendarDate.getDate()+1);
                }
                html += '</tr>\n';
            }

            html += '</table>';
            return html;

        }

 

2
AntonPetrov avatar AntonPetrov 491 Точки

@alecc  Имаш в началото на редовете преди <tr> два спейса вместо един, вероятно затова гърми.

0
alecc avatar alecc 12 Точки

Благодаря за предложението, но и това не е. Дава същата грешка. Нямам представа какво може да е.

0
AntonPetrov avatar AntonPetrov 491 Точки

Решение и от мен цък. Използвам активно, че new Date() може да приема и отрицателни стойности и не се чупи, връща датите назад. Например new Date(2016, 2, 0) е последният ден на февруари, а new Date(2016, 2, -1) е предпоследният и т.н. Същото важи и за месеците и за годините.

0
daredevil avatar daredevil 7 Точки

Някой може ли да ми  каже къде ми е грешката. Написах го от видеото на лекцията ине тръгна дава грешка :"(function (exports, require, module, __filename, __dirname) { function calendar([day,month,year]) {"

КОД:

 

function calendar([day,month,year]) {

    [day,month,year] = [day,month,year].map(Number);

    let today = new Date(year,month-1, day);
    let firstDay = new Date(year,month-1, 1);
    let firstMonthlyDay = new Date(firstDay);

    firstMonthlyDay.setDate(firstMonthlyDay.setDate()-firstMonthlyDay.getDay());

    let lastMonthlyDay = new Date(firstDay);

    lastMonthlyDay.setMonth(lastMonthlyDay.getMonth() + 1);
    lastMonthlyDay.setDate(0);

    lastMonthlyDay.setDate(lastMonthlyDay.getDate() + 6 - lastMonthlyDay.getDay());

    let html = '<table>\n';
    html+= '  <tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr>\n';

    for (var i = firstMonthlyDay; i <= lastMonthlyDay; i.setDate(i.getDate()+1)) {

        if(i.getDay()==0){
            html+='  <tr>';
        }

        if(i.getFullYear() < firstDay.getFullYear() ||
            (i.getMonth() < firstDay.getMonth() && i.getFullYear() == firstDay.getFullYear())) {
            html+=`<td class="prev-month">$(i.getDate())</td>`;
        } else if(i.getFullYear() > firstDay.getFullYear() ||
            (i.getMonth() > firstDay.getMonth() && i.getFullYear() == firstDay.getFullYear())){
            html+=`<td class="next-month">$(i.getDate())</td>`;
        } else if (i.getTime() === today.getTime()) {
            html+=`<td class="today">$(i.getDate())</td>`;
        } else{
            html+=`<td>$(i.getDate())</td>`;
        }

        if(i.getDay()==6){
            html+='</tr\n>';
        }
    }
    html+='</tr>';

    return html;
}

 

0
StanimirZ avatar StanimirZ 4 Точки

Тази задача е много интересна. Предоставям моето решение:

https://pastebin.com/sTUHum3h

100/100

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.