Вычисление индекса любого элемента в массиве
Привет!
Решаю задачу: Есть очередь из людей перед кофе-автоматом, каждый человек из этой очереди возьмёт себе 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? |
Цитата:
|
рони,
Чашку. Т.е., вернуть имя человека, который выпьет N-ную чашку (при условии, что он возьмёт их 2 подряд и имена будут добавляться произвольно). Чтобы было так: nextPerson( r, name ) { ... } nextPerson( 7899364, Richard )//где 7899364 - произвольный номер чашки кофе, а Richard - произвольное новое имя для массива names[] |
Alexander Belov,
Так писать точно не стоит. Во-первых код слишком громоздкий. Во-вторых решение не гибкое, то есть как вы написали далее - если будут динамически добавляться элементы в массив - скрипт работать не будет. Самое банальное решение, но не производительное - создать для каждого элемента массива некое множество - Set. В это множество добавить номера чашек, которые будут однозначно идентифицировать элемент массива. А далее всё просто. Цикл по множествам и если введенное нами число есть в очередном можестве, то вывести соответствующее уведомление и прекратить итерации. |
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" ) ); |
: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" ) ); |
рони,
А в какой момент пришел Richard? Если после того, как Pat выпил 17, то у него не может быть 11, 12 А если до - то 17 будет не у Pat |
Dilettante_Pro,
это уже к тс , а по умолчанию у всех всегда будут только 2 чашки с фирменными номерами :) |
А это случайно не 1 апреля?
|
Dilettante_Pro,
:blink: |
Часовой пояс GMT +3, время: 16:47. |