Skip to content

Instantly share code, notes, and snippets.

@pochemuto
Created March 1, 2016 11:42
Show Gist options
  • Save pochemuto/59b50330ba707c27a922 to your computer and use it in GitHub Desktop.
Save pochemuto/59b50330ba707c27a922 to your computer and use it in GitHub Desktop.
Yandex Test
#coding=utf
# На зачёт к преподавателю английского языка пришли 30 студентов:
# 13 с факультета экономики, 9 с факультета математики и
# 8 с факультета компьютерных наук.
# Их одинаковые внешне и на ощупь зачётные книжки лежат на столе.
# Какое наибольшее количество зачётных книжек должен взять преподаватель,
# чтобы быть уверенным, что среди оставшихся на столе присутствуют
# зачётки хотя бы 7 студентов одного факультета и 4 студентов другого?
# https://yandex.ru/math/test/
from math import ceil
from itertools import permutations
def terms(value, size):
if size < 1:
raise "Size must be greater than zero"
if size > value:
raise "Size greater than value"
if size == 1:
yield (value,)
return
first_most = value - size + 1 # из расчета, чтобы хватило в каждую оставшуюся ячейку по единичку
first_least = int(ceil((value - size + 2) / 2.0))
for i in range(first_most, first_least - 1, -1):
for sub in terms(value - i, size - 1):
yield (i,) + sub
def termsWithZeros(value, size):
for s in range(1, min(value, size) + 1):
for t in terms(value, s):
yield t + (0,) * (size - s)
students = (13, 9, 8)
groups = len(students)
def find(students, test):
for removed_count in range(1, sum(students) + 1):
for remove_combination in termsWithZeros(removed_count, groups):
for removed in permutations(remove_combination, groups):
left = [s - r for s, r in zip(students, removed)]
if not all(i >= 0 for i in left):
continue
if not test(left):
return removed_count - 1, left
def test(left):
left = sorted(left, reverse=True)
return left[0] >= 7 and left[1] >= 4
print find(students, test)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment