Я знаю, что это ужасное решение, но на данный момент единственный способ провести различие между iPad Mini и iPad 2 - это проверить его номер сборки и сопоставить каждый номер сборки с соответствующим устройством.
Позвольте привести пример: iPad mini версии 6.0 отображает «10A406
» в качестве номера сборки, а iPad 2 - «10A5376e
».
Это значение может быть легко получено через регулярное выражение в пользовательском агенте (window.navigator.userAgent
); к этому номеру добавляется префикс «Mobile/
».
К сожалению, это единственный недвусмысленный способ обнаружить iPad Mini; Я бы предложил принять подход, связанный с viewport
(где он поддерживается, с использованием блоков vh / vw) для правильного отображения содержимого на экранах разных размеров.
Существует довольно простая система, используемая, например, в шахматных турнирах, называемых круговыми.
Идея состоит в том, чтобы разделить игроков на две стороны стола. Один из игроков обозначен как «хаб» (для лучшего слова). Турнир начинается с того, что игроки сталкиваются друг с другом и играют друг против друга. После первого раунда все, кроме центра, передвигаются на один стул вперед, и порядок белого / черного (дома / на выезде в спорте) меняется. Соревнование по круговой системе заканчивается, когда игроки садятся на свои места. Если вы хотите, чтобы все сыграли со всеми дважды, просто сделайте то же самое еще раз.
Статья в Википедии с подробностями реализации.
В вашем особом случае я бы попробовал провести круговой алгоритм один раз, включая все команды. Затем вы делаете то же самое для каждого дивизиона один раз, и, чтобы убедиться, что команды внутри дивизионов играют друг с другом один раз дома и один раз на выезде, проверьте в первом круговом режиме, как команды играли в этом раунде.
это, конечно, то, что вы будете играть все матчи между дивизионами задолго до окончания турнира (поскольку последние n-1 матчей проводятся против команд внутри дивизиона [n = количество команд в дивизионе]). Если это проблема, вы можете просто немного поменять местами совпадения.
На самом деле я написал простой скрипт Python, который делает это. Это не потребовало много строк кода и дало довольно хорошие результаты. Это создаст расписание, в котором каждая команда сыграет с каждой командой своего дивизиона дважды и один раз против команд из других дивизионов. Однако нет проверки, чтобы команды встречались друг с другом дважды таким образом, чтобы одна и та же команда находилась дома. Но этот код должен дать хорошее представление о том, как создать свой собственный код планирования.
#!/usr/bin/python
div1 = ["Lions", "Tigers", "Jaguars", "Cougars"]
div2 = ["Whales", "Sharks", "Piranhas", "Alligators"]
div3 = ["Cubs", "Kittens", "Puppies", "Calfs"]
def create_schedule(list):
""" Create a schedule for the teams in the list and return it"""
s = []
if len(list) % 2 == 1: list = list + ["BYE"]
for i in range(len(list)-1):
mid = int(len(list) / 2)
l1 = list[:mid]
l2 = list[mid:]
l2.reverse()
# Switch sides after each round
if(i % 2 == 1):
s = s + [ zip(l1, l2) ]
else:
s = s + [ zip(l2, l1) ]
list.insert(1, list.pop())
return s
def main():
for round in create_schedule(div1):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div2):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div3):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div1+div2+div3):
for match in round:
print match[0] + " - " + match[1]
print
if __name__ == "__main__":
main()
There are two algorithms, one for odd teams, one for even teams to make sure the round robin happens.
I am going to generate you a graphic if i can.
ODD # of teams
The algorithm is to rotate all the teams clockwise. If we had 5 teams:
1 2 --> 3 1 --> 5 3 --> 4 5 --> 2 4
3 4 5 2 4 1 2 3 1 5
5 4 2 1 3
At this point we have completed one round robin where everyone plays each other once... the next round would again be..
1 2
3 4
5
EVEN # of teams
When we have an even number of teams, you do the same rotation, except you hold team #1 in fixed position and rotate all the other teams around #1 in a clockwise fashion. So, if we had 4 teams..
1 2 --> 1 3 --> 1 4
3 4 4 2 2 3
This would be one complete round robin... the next match up would be..
1 2
3 4
Programmatically, There's a few ways you could approach this. Maybe the code posted above does the same thing lol..
Я бы просто закодировал эти ограничения в виде логической формулы и использовал бы SAT-решатель для получения решений (например, MiniSAT для C ++, SAT4J для Java, и вы даже можете написать собственный простой решатель). Вход для этих решателей стандартизирован DIMACS.
См. Также «Кодирование SAT для социальной проблемы игрока в гольф» и «Планировщик на основе SAT для расписания турниров» для SAT-кодирования аналогичных задач.
вот пример реализации
public interface ITeam
{
bool PlaysOn(DateTime date);
bool canPlay(ITeam); //returns true if a game between the teams is legal (played once/twice
//already, same different divisions and other applicable rules
}
IEnumerable<ITeam> teams = null; //replace with initialization
IEnumerable<ITeams> reversed = team.Reverse();
IEnumerable<DateTIme> gameDays = null;//replace with initialization
var count = teams.Count();
foreach(var date in gameDays)
{
for(int i = 0;i<count;i++)
{
var innerTeams = i % 2 == 0 ? teams : reversed;
var team = (from t in innerTeams
where !t.PlaysOn(date)
select t).First();
var opp = (from t in teams
where !t.PlaysOn(date) && t.CanPlay(team)
select t).First();
SetupGame(team,opp);
}
} //lot of optimazation possible :)
Я тестировал ее только на бумаге, но для моей установки она работает. Чередуя начало списка команд с начала и конца списка, я избегаю ситуаций, когда одной и той же команде придется играть с одной и той же командой снова и снова (или повторно играть в один и тот же день) в моем бумажном тесте. представлял все возможные встречи как разные противники, но в основном это то, что должен делать метод CanPlay. Надеюсь, это поможет, хотя это и не полное решение