Вычисление индекса любого элемента в массиве
Привет!
Решаю задачу: Есть очередь из людей перед кофе-автоматом, каждый человек из этой очереди возьмёт себе 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: |
рони,
Прошу объяснить, что выполняет код 1. a!= +a //Если номер чашки не равен номеру чашки * 2? Т.е, если это не "ноль"? 2. (a = names.indexOf(a) + 1, [a *= 2, --a].reverse()) // Для чего тут используется reverse()? Какой массив мы им переворачиваем? 3. (a % 2 && --a, a = a / 2 % names.length, names[a]) // Вообще без внятных догадок... function nextPerson(a) { return a != +a ? (a = names.indexOf(a) + 1, [a *= 2, --a].reverse()) : (a % 2 && --a, a = a / 2 % names.length, names[a]) }; |
Alexander Belov,
1.проверка что а это строка 2. можно без reverse 3. если число 17(нечётное) сделать его 16(чётным), разделить на 2, стало 8, получить остаток от деления на длину массива 5 , стало 3 , вернуть элемент массива с индексом 3 , стало "Pat", |
Alexander Belov,
2. если а это строка "Pat" находим индекс элемента массива с этой строкой, было "Pat" стало индекс 3 + 1 , или 4, 4 умножить 2 = 8 , 8 - 1 = 7 итого [8,7] для мнимого удобства переворачиваем reverse , получили [7,8] -- то есть по порядку "Pat" выпьет седьмую и восьмую чашку ... |
рони,
Благодарю! Так понятнее. |
Alexander Belov,
исправил , сейчас (a % 2 && ++a, a = (a - 2) / 2 % names.length,names[a]) |
Alexander Belov,
<script> 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]) }; for (var i=1; i<=30; i++) {document.write(i + " => " +nextPerson ( i )+"<br>")} </script> |
Часовой пояс GMT +3, время: 07:27. |