Тото


Всички знаем, че разумен живот на Марс съществува и даже (подобно на хората) жителите на Червената планета обичат забавленията. Марсианците наскоро лицензираха българската игра 6/49, видоизменена да пасва на нравите на тамошните обитатели. Марсианският вариант на 6/49 се играе по следните правила:

Забележка: подобно на Българското Тото - 6/49 - комбинациите са ненаредени; това означава, че ако например журито си е намислило комбинация 15, 2, 43, 32, 16, 14, а вашата комбинация е 7, 8, 15, 32, 14, 28, то вие сте "познали" три числа: 15, 32 и 14.

Макар и интересна, така описаната игра би била твърде скучна за земен жител като Вас. Марсианците, бидейки малко по-глупави, не са забелязали, че Голямата награда може да се спечели всеки път (т.е. всеки рунд), независимо каква комбинация избере журито. Докажете им това - напишете програма ТОТО, която може да определи печелившата комбинация с не повече от 45 пуснати фиша. Понеже имате и конкуренция, добре е да решите задачата дори по-бързо. Ще получите максимален брой точки, ако "играете" по-малко от 29 дни.

"Диалогът" с журито ще се извършва чрез външен модул totolib. В него ще е реализирана функцията post_comb, която приема 6 цели параметъра (Вашата комбинация) и връща цяло число - броя на "познатите" от Вас числа. Програма Ви ще може да извика функцията post_comb не повече от 45 пъти, след което ще бъде прекратена. Ако успеете да решите задачата (т.е. да предадете фиш с правилната комбинация в отпуснатото време) ще получите точки за съответния тест, съгласно следната таблица:

Извиквания на post_comb
Точки
1 - 28
100%
29 - 31
80%
32 - 35
60%
36 - 40
40%
41 - 45
20%
45+
0%

Инструкции за модула totolib:

Език C C++ Pascal
Включване #include <totolib.h> #include <totolib.h> uses totolib;
Формат на post_comb int post_comb(int, int, int, int, int, int); int post_comb(int, int, int, int, int, int); function post_comb(p1, p2, p3, p4, p5, p6 : integer) : integer;
Ред за компилация gcc -o toto toto.c totolib.o g++ -o toto toto.c totolib.o  

Реда на параметрите подавани на post_comb е без значение.

За Ваше улеснение ще ви бъде предоставен пробен вариант на външния модул. Той записва във файл toto.log резултата от изпълнението на програмата ви. При стартиране, ако бъде открит файл toto.in, totolib го прочита (като очаква в него да има 6 различни цели числа от 1 до 49) и го ползва като "печеливша комбинация". Ако такъв файл не бъде намерен, totolib си намисля случайни числа.

Пример:

Ето две примерни програми, които включват модула и демонстрират използването на post_comb:

#include <stdlib.h>
#include <time.h>
#include "totolib.h"       
int main(void)
{
    int a[6], i, j, x, ok;
    srand(time(NULL));
    for (;;) {
        for (i=0; i < 6; i++) { 
           do {
               x = rand() % 49 + 1;
               ok = 1;
               for (j=0;j<i;j++) 
                   if (a[j] == x) 
                       ok = 0;
           } while (!ok);
           a[i] = x;
        }
        post_comb(a[0], a[1], a[2], a[3], a[4], a[5]); // не подреждаме нищо
    } 
    // Забележете: спокойно можем да ползваме безкраен цикъл, тъй като
    // разчитаме totolib да прекрати програмата след 45-тия опит
    return 0;
}
       
uses totolib;
var a : array [1..6] of integer;
function isok : boolean;
    var i,j : integer;
    begin
        isok := false;
        for j := 2 to 6 do
            for i := 1 to j - 1 do 
                if a[i]=a[j] then exit;
        isok := true;
    end;
         
procedure gen_random;
    var i : integer;
    begin
        for i := 1 to 6 do a[i] := random(49)+1;
    end;
         
begin
    repeat
      repeat gen_random until isok;
      post_comb(a[1], a[2], a[3], a[4], a[5], a[6]);
    until false;
    {
        Забележете: спокойно можем да ползваме безкраен цикъл, тъй като
            разчитаме totolib да прекрати програмата след 45-тия опит
    }
end.

Недейте предава тях: и двете програми ще получат 0 точки.

Ограничения:

Време: 1 сек./тест (поне 10 теста).

Забележка:

Последната пусната комбинация също се брой. Т.е. ако Вашата програма успее да определи Печелившата комбинация за 45 викания на post_comb, и накрая я викне още веднъж за да предаде решението, ще ви се броят 46 извиквания и следователно - 0 точки.