#10
Sir1to
osint
Итоги приняты личный турнир на выбывание
Первый тестовый турнир на Арене
| Тур | Победителю матча | Проигравшему | Лимит | ||
|---|---|---|---|---|---|
| инферы | рейтинг | инферы | рейтинг | ||
| Групповой тур · 6 категорий |
|
+5 | — | +3 | 10 мин |
| Полуфинал · 5 категорий |
|
+10 |
|
+7 | 10 мин |
| Гранд-финал · 3 категории |
|
+10 |
|
+7 | 10 мин |
| Чемпиону турнира сверху |
|
+10 | — | — | — |
Инферы и рейтинг начисляются одной суммой после турнира, когда админ принимает отчёт.
Регистрация закрыта.
У каждого участника свой флаг. Чужой флаг не подойдёт, а попытка сдать его видна в отчёте и засчитывается как поражение в матче.
Зерно 89c65725a842d9701adc164f6bb6cc30, проведена 20.09 18:00 (мск).
Скрипт ниже воспроизводит сетку первого тура на вашей машине: если он выведет
«совпало», значит состав групп получен из зерна, а не выбран руками.
import hashlib, hmac
SEED = "89c65725a842d9701adc164f6bb6cc30"
IDS = [1, 65, 76, 155, 164, 254, 344, 421, 452, 469, 475, 729] # участники (id), как их взял сервер
SIZES = [2, 3, 3, 4] # размеры групп первого тура
GROUPS = [[344, 729], [1, 164, 452], [475, 155, 76], [469, 421, 254, 65]] # что получилось в сетке
def stream(seed, count):
out, counter = [], 0
while len(out) < count:
block = hmac.new(seed.encode(), f"ctfinf-arena:{counter}".encode(),
hashlib.sha256).digest()
out += [int.from_bytes(block[i:i + 4], "big") for i in range(0, 32, 4)]
counter += 1
return out[:count]
ids = sorted(IDS)
numbers = stream(SEED, len(ids) - 1)
for step, position in enumerate(range(len(ids) - 1, 0, -1)):
target = numbers[step] % (position + 1)
ids[position], ids[target] = ids[target], ids[position]
groups, cursor = [], 0
for size in SIZES:
groups.append(ids[cursor:cursor + size])
cursor += size
print(groups)
print("совпало" if groups == GROUPS else "НЕ совпало")
Нужен только стандартный Python 3 — ничего ставить не надо.