Какой сегодня день?


#1

для того чтобы пройти задание достаточно вот так описать программу, но в испытании не учтено несколько моментов, дело в том что в испытании дата всегда больше 7

var getDayOfWeek = function(day, numberDay) {
  var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
  var dayIndex = 0;
  var startDayIndex = week.indexOf(day);
  if (numberDay >= 7) {
    dayIndex = startDayIndex + (numberDay % 7) - 1;
  } 
  return week[dayIndex];
}

моменты следующие: если дата меньше 7, или например остаток дней в массиве меньше чем остаток от деления даты на длинну массива, в общем вот код который учел все варианты, которых нет в испытании:

var getDayOfWeek = function(day, numberDay) {
  var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
  var dayIndex = 0;
  var startDayIndex = week.indexOf(day);
  if (numberDay >= 7) {
    dayIndex = startDayIndex + (numberDay % 7) - 1;
  } 
  if (numberDay >= 7 && startDayIndex + numberDay % 7 > week.length) {
    dayIndex = startDayIndex - (numberDay % 7);
    } 
  if (numberDay < 7 && startDayIndex + numberDay <= week.length) {
    dayIndex = startDayIndex + numberDay - 1;
  } 
  if (numberDay < 7) {
    dayIndex = numberDay - startDayIndex;
  }
  if (dayIndex < 0) {
    dayIndex = dayIndex * (-1);
  }
  return week[dayIndex];
}

#2

перепроверил еще ряд вариантов, и пришлось дополнить код:

var getDayOfWeek = function(day, numberDay) {
  var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
  var dayIndex = 0;
  var startDayIndex = week.indexOf(day);
  if (numberDay >= 7) {
    dayIndex = startDayIndex + (numberDay % 7) - 1;
  } 
  if (numberDay >= 7 && startDayIndex + numberDay % 7 > week.length) {
    dayIndex = startDayIndex - (numberDay % 7);
    } 
   if (numberDay < 7) {
    dayIndex = numberDay - startDayIndex;
  }
  if (numberDay < 7 && startDayIndex + numberDay <= week.length) {
    dayIndex = startDayIndex + numberDay - 1;
  } 

  if (numberDay < 7 && startDayIndex + numberDay >= week.length) {
    dayIndex = startDayIndex - ((startDayIndex + numberDay) - 7);
  } 
  if (dayIndex < 0) {
    dayIndex = dayIndex * (-1);
  }
  return week[dayIndex];
}

испытание конечно же он проходит по параметрам в испытании, и в том и в этом варианте, но в испытании далеко не все варианты учтены. Возможно можно сделать иначе и короче, интересно у кого как выйдет.


#3

Разве Мы УЖЕ не умеем “дописывать массив”…?
893f28a8f389c4f8044444444


#4

точно, молодец !


#5

Добавлять что-то к эталонным дням недели не кажется хорошей затеей.


#7

на форумах нынче не аргументируют?


#8

Если неделя превышена, то она опять начнется с понедельника, а для определения дня недели нас опять интересует остаток.


#9
var rest = steps % 7; 
var thatDay =  week[rest];

можно и через “остаток”…


Почему? Где об этом почитать?


#10

Есть вполне определенные и понятные данные - дни недели и кроме их названий нам на самом деле ничего ведь и не нужно. Поэтому дописывать в дни недели опять же эти же дни недели, цикл для этого создавать - довольно лишнее занятие.

var weekDays = [‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’, ‘пятница’, ‘суббота’, ‘воскресенье’, ‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’…]; - сложно дать определение этому массиву, это уже не дни недели, поэтому под данные это не очень подходит.


#11

var getDayOfWeek = function(firstDay, day) {

var days = [‘воскресенье’,‘понедельник’,‘вторник’,‘среда’,‘четверг’,‘пятница’,‘суббота’];

day += days.indexOf(firstDay)-1;
s = days[day % 7]
return s;
}


#12

только параметр не очень хорошо переопределять, лучше завести переменную
и вернуть можно сразу выражение, без присвоения переменной, а то находите s и ниже тут же возвращаете.


#14
код

let days = [‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’, ‘пятница’, ‘суббота’, ‘воскресенье’]
let getDayOfWeek = function(firstDay, date) {
let d=date + days.indexOf(firstDay) - 1;
return days[d % 7];
};


#15


Попробовал сделать через SWITCH. вроде работает.


#16

Для каждого дня недели вы считаете одно и то же. Зачем тогда switch? (если понедельник, то 2+2, если вторник, то 2+2…)
И еще определение дня недели (когда вы находите остаток от деления на 7) у вас не учитывает день начала месяца.
Чтобы проверить работу программы можно вынести массив из функции:
var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];

var getDayOfWeek = function(dayOfWeek, date) {
	var a = date % 7 - 1;
	var day = '';

	switch(dayOfWeek) {
        case 'понедельник':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'вторник':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'среда':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'четверг':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'пятница':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'суббота':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'воскресенье':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
	}

	return day;
}

и для каждого дня недели вызвать функцию и передать в нее дату - от 1 до 31, например.

for (var i = 0; i < week.length; i++) {
	for (var j = 1; j <=31; j++) {
		console.log('день начала месяца: ' + week[i], ' число: ' + j, 'искомый день недели: ' + getDayOfWeek(week[i], j));
	}
}

и посмотреть где у вас вернется undefined.

день начала месяца: воскресенье число: 1 искомый день недели: воскресенье
день начала месяца: воскресенье число: 2 искомый день недели: undefined
день начала месяца: воскресенье число: 3 искомый день недели: undefined
день начала месяца: воскресенье число: 4 искомый день недели: undefined
день начала месяца: воскресенье число: 5 искомый день недели: undefined
день начала месяца: воскресенье число: 6 искомый день недели: undefined

Можно вставить весь код прямо в консоли браузера и проверить.

image


#17
Ответ
function getDayOfWeek(firstDay, requiredDay) {
  var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
  var requiredDayIndex = (week.indexOf(firstDay) + requiredDay - 1) % 7;
  return week[requiredDayIndex];
}

// индексИскомогоДня = (индексПервогоДня + номерИскомогоДня - 1 (отнимаем 1 потому что первый день уже учтен в числе requiredDay, в противном случае будем считать его два раза)). Для значений, превышающих длину массива, узнаём индекс нужного нам дня с помощью остатка при делении на семь (соответствует количеству элементов массива): week[15] превратится в week [1], такой код помогает обойтись без циклов и добавления новых элементов в массив.