Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вычисление индекса любого элемента в массиве (https://javascript.ru/forum/events/62249-vychislenie-indeksa-lyubogo-ehlementa-v-massive.html)

Alexander Belov 01.04.2016 11:32

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

Решаю задачу:
Есть очередь из людей перед кофе-автоматом, каждый человек из этой очереди возьмёт себе 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?

рони 01.04.2016 12:44

Цитата:

Сообщение от Alexander Belov
как для вычислить чашку кофе для newName?

так чашку или чашки?

Alexander Belov 01.04.2016 12:59

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

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

nextPerson( 7899364, Richard )//где 7899364 - произвольный номер чашки кофе, а Richard - произвольное новое имя для массива names[]

destus 01.04.2016 13:13

Alexander Belov,
Так писать точно не стоит. Во-первых код слишком громоздкий. Во-вторых решение не гибкое, то есть как вы написали далее - если будут динамически добавляться элементы в массив - скрипт работать не будет. Самое банальное решение, но не производительное - создать для каждого элемента массива некое множество - Set. В это множество добавить номера чашек, которые будут однозначно идентифицировать элемент массива. А далее всё просто. Цикл по множествам и если введенное нами число есть в очередном можестве, то вывести соответствующее уведомление и прекратить итерации.

рони 01.04.2016 13:17

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" ) );

рони 01.04.2016 14:45

:write: цикл лишний ...
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" ) );

Dilettante_Pro 01.04.2016 18:37

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

рони 01.04.2016 18:54

Dilettante_Pro,
это уже к тс , а по умолчанию у всех всегда будут только 2 чашки с фирменными номерами :)

Dilettante_Pro 01.04.2016 21:01

А это случайно не 1 апреля?

рони 01.04.2016 21:04

Dilettante_Pro,
:blink:


Часовой пояс GMT +3, время: 16:47.