“Вкладка заказывает” в приложении для направляющих

То, что вы описываете, невозможно без особых более строгих ограничений (и, возможно, даже тогда).

Давайте рассмотрим только одну группу list с. Представьте, что вы пробуете сценарий добавления к 15 индексам из 30 со всеми пятью возможными значениями в игре. Это 5 15 sup> (более 30 миллионов) способов заполнения 15 выбранных индексов, а 30 выбирают 15 наборов индексов для заполнения (более 155 миллионов), что объединяет 4 733 811 035 156 250 000 (4,7 квинтиллиона) списков. Может быть немного меньше, так как у вас будет ограничение на использование каждого из пяти значений хотя бы один раз (в противном случае вы пересчитаете одно и то же list с меньшим набором выбранных значений), но это все равно будет безумно. И это только для индекса 15, пять значений; другие будут несколько меньше, но большинство все равно будет невозможно вычислить по отдельности при жизни человека, не говоря уже о вычислимости в совокупности.

Вы могли бы попытаться отфильтровать его несколькими способами, превентивно вычисляя сумму вашего большого ввода list, и пропуская любую комбинацию значений, которая гарантированно превысит ваше максимальное совокупное значение, а также упреждающе уменьшив кратность. любой ценности, которая подтолкнет вас через кепку. Но это сильно пахнет проблемой XY ; всякий раз, когда вы рассматриваете этот уровень комбинаторного безумия, у вас, вероятно, есть лучший способ выполнить вашу задачу (и / или ваша задача невозможна).

Для вашего простого случая вы просто комбинируете itertools инструменты, чтобы сделать это:

from itertools import combinations, product

def make_lists(list1, list2, limit):
    maxvalues = limit - sum(list1)
    minlist2 = min(list2)
    for numindices in range(1, len(list1)+1):
        if minlist2 * numindices >= maxvalues:
            continue
        for indices in combinations(range(len(list1)), numindices):
            for values in product([x for x in list2 if x < maxvalues], repeat=numindices):
                if sum(values) >= maxvalues:
                    continue
                newlist = list1[:]
                for i, v in zip(indices, values):
                    newlist[i] += v
                yield newlist

Но это займет время «тепловой смерти вселенной» для любой значимой входной длины. Рекурсивные решения могут более эффективно отфильтровывать недействительные выходные данные, но если ограничение не будет действительно строгим, вы все равно умрете до завершения программы.

7
задан Mike Woodhouse 21 April 2009 в 14:02
поделиться

3 ответа

Я не пытался сделать это (но, возможно, мне следует). Как бы то ни было, w3.org имеет следующее: http://www.w3.org/TR/WCAG10-HTML-TECHS/#forms-keyboard-access , в котором кратко описано использование tabindex атрибут. Я полагаю, вам нужно было бы настроить его индивидуально на вашем контроле, что было бы немного утомительно, но не так ужасно.

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

0
ответ дан 6 December 2019 в 14:09
поделиться

Я не специалист по рельсам, но я использовал другие веб-фреймворки MVC. Просто предостережение:)

Когда вы выводите свои элементы формы, вы должны иметь возможность добавлять дополнительные атрибуты для каждого (например, класс, onchange и т. Д.). Вы можете достичь желаемого, установив для каждого значение tabindex, увеличивая его по мере продвижения. Получившийся html выглядел бы примерно так:

<input type="text" id="myInput" tabindex=1 />
<select id="mySelect" tabIndex=2>
    <option id="myOpt1" value="someValue">Foo!</option>
</select>

Нечто подобное будет работать.

Кроме того, похоже, что этот вопрос уже был опубликован :)

1
ответ дан 6 December 2019 в 14:09
поделиться

Я не уверен на 100%, но я полагаю, что вы можете взять под контроль функцию Tab, чтобы управлять самим порядком.

В псевдокоде, который может создать что-то подобное

all_fields = ["field1","field2"]
current = 0
if catch event("tab pressed"){
 current = (current+1) %all_fields.size
 all_fields[current].focus
}

Однажды элемент выбирается с помощью клавиатуры, которую вы можете ввести любым способом или использовать стрелки для просмотра выпадающего меню.

Вы также можете использовать tabindex http://www.w3.org/TR/html401/interact/forms. HTML , но я никогда не делал этого, поэтому я не уверен, что это будет работать нормально.

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

0
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: