Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.04.2016, 11:32
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

Вычисление индекса любого элемента в массиве
Привет!

Решаю задачу:
Есть очередь из людей перед кофе-автоматом, каждый человек из этой очереди возьмёт себе 2 порции кофе.
После того, как человек взял 2 порции кофе, он возвращается в конец очереди, чтобы повторить всё сначала.

Нужно вычислить, передав функции порядковый номер порции кофе, кто её купил.

Я написал такой код:
https://jsfiddle.net/1Lfky51k/

function nextPerson ( r ) {

	var names = ["Kurt", "Dave", "Kris", "Pat", "Steve"];


	if ( r % 10 === 1 || r % 10 === 2 ) {

		res = names[0]

		return res

	}

	else if ( r % 10 === 3 || r % 10 === 4 ) {

		res = names[1]

		return res

	}

	else if ( r % 10 === 5 || r % 10 === 6 ) {

		res = names[2]

		return res

	}
	
	else if ( r % 10 === 7 || r % 10 === 8 ) {

		res = names[3]

		return res

	}

	else if ( r % 10 === 9 || r % 10 === 0 ) {

		res = names[4]

		return res

	}


}
 
alert ( nextPerson ( 17 ) )


Вопрос: каким образом можно оптимизировать мой код для такой задачи в сторону минимизации?

-------------------

И хотелось бы усложнить условие:
что если мы не знаем всех людей в очереди, т.е. будут приходить новые люди (динамическое добавление в массив).
Как тогда продумать вычисление?

Что-то вроде
var names = ["Kurt", "Dave", "Kris" ]

var newName = names[names.length] = "Pat" //Правильно?


А как для вычислить чашку кофе для newName?
Ответить с цитированием
  #2 (permalink)  
Старый 01.04.2016, 12:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Сообщение от Alexander Belov
как для вычислить чашку кофе для newName?
так чашку или чашки?
Ответить с цитированием
  #3 (permalink)  
Старый 01.04.2016, 12:59
Аватар для Alexander Belov
Профессор
Отправить личное сообщение для Alexander Belov Посмотреть профиль Найти все сообщения от Alexander Belov
 
Регистрация: 12.03.2015
Сообщений: 173

рони,
Чашку.
Т.е., вернуть имя человека, который выпьет N-ную чашку (при условии, что он возьмёт их 2 подряд и имена будут добавляться произвольно).

Чтобы было так:
nextPerson( r, name ) {
...
}

nextPerson( 7899364, Richard )//где 7899364 - произвольный номер чашки кофе, а Richard - произвольное новое имя для массива names[]
Ответить с цитированием
  #4 (permalink)  
Старый 01.04.2016, 13:13
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Alexander Belov,
Так писать точно не стоит. Во-первых код слишком громоздкий. Во-вторых решение не гибкое, то есть как вы написали далее - если будут динамически добавляться элементы в массив - скрипт работать не будет. Самое банальное решение, но не производительное - создать для каждого элемента массива некое множество - Set. В это множество добавить номера чашек, которые будут однозначно идентифицировать элемент массива. А далее всё просто. Цикл по множествам и если введенное нами число есть в очередном можестве, то вывести соответствующее уведомление и прекратить итерации.
Ответить с цитированием
  #5 (permalink)  
Старый 01.04.2016, 13:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Alexander Belov,
var names = ["Kurt", "Dave", "Kris", "Pat", "Steve"]
function nextPerson(a) {
    if (a != +a) return a = names.indexOf(a) + 1, [a *= 2, --a].reverse();
    a % 2 && ++a;
    for (var d = names.length, b = -1, c = 0; c < a; c += 2) b = ++b % d;
    return names[b]
};
alert ( nextPerson ( 17 ) );
alert ( nextPerson ( "Pat" ) );
names.push( "Richard" );
alert ( nextPerson ( "Richard" ) );
Ответить с цитированием
  #6 (permalink)  
Старый 01.04.2016, 14:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

цикл лишний ...
var names = ["Kurt", "Dave", "Kris", "Pat", "Steve"]
function nextPerson(a) {
    return a != +a ? (a = names.indexOf(a) + 1, [a *= 2, --a].reverse())
    : (a % 2 && ++a, a = (a - 2) / 2 % names.length, names[a]) };
alert ( nextPerson ( 17 ) );
alert ( nextPerson ( 18 ) );

alert ( nextPerson ( "Pat" ) );
names.push( "Richard" );
alert ( nextPerson ( "Richard" ) );

Последний раз редактировалось рони, 02.04.2016 в 01:26.
Ответить с цитированием
  #7 (permalink)  
Старый 01.04.2016, 18:37
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

рони,
А в какой момент пришел Richard? Если после того, как Pat выпил 17, то у него не может быть 11, 12
А если до - то 17 будет не у Pat

Последний раз редактировалось Dilettante_Pro, 01.04.2016 в 18:49.
Ответить с цитированием
  #8 (permalink)  
Старый 01.04.2016, 18:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Dilettante_Pro,
это уже к тс , а по умолчанию у всех всегда будут только 2 чашки с фирменными номерами
Ответить с цитированием
  #9 (permalink)  
Старый 01.04.2016, 21:01
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

А это случайно не 1 апреля?
Ответить с цитированием
  #10 (permalink)  
Старый 01.04.2016, 21:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Dilettante_Pro,
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение нового элемента в массиве Sashkouuu Элементы интерфейса 6 01.02.2016 10:33
Инкремент индекса элемента массива или как создавать уникальные имена для переменных? Blondinka Общие вопросы Javascript 6 20.08.2015 09:50
Вопрос по удалению элемента в массиве и по функциям bot87 Общие вопросы Javascript 5 26.04.2012 14:43
Сортировка элемента в массиве bayrach Общие вопросы Javascript 2 23.02.2012 18:41
Как сделать реакцию на изменение любого элемента формы. Mik Events/DOM/Window 3 28.07.2011 08:52