Пример, иллюстрирующий использование интервального типа и манипуляции над множествами

Задача

Компьютер задумывает четырехзначное число, не содержащее двух одинаковых цифр. Вы набираете свое число, и компьютер сообщает количество быков (точно угаданных цифр) и количество коров (цифр, которые есть в задуманном числе, но на другом месте). Например, пусть задуманное число 5734, а вы набрали 0755. Результат будет 1 бык и 2 коровы. Игра продолжается до тех пор, пока вы не получите четыре быка.

Решение

 

type
    playtype = '0'..'9';
    seedtype = 0..65535;
    scoretype = 0..4;
 
var
    pool, target: set of playtype;
    a, b, c, d: playtype;
    seed: seedtype;
    bulls, cows: scoretype;
 
function random: real;
    begin
        random := seed / 65536;
        seed := (25173 * seed + 13849) mod 65536;
    end;
 
function unique: playtype;
    var ch: char;
    begin
        repeat
            ch := chr(trunc(10 * random) + ord('0'));
        until ch in pool;
        unique := ch;
        pool := pool - [ch];
        target := target + [ch];
    end;
 
procedure try(thisone: char);
    var ch: char;
    begin
        read(ch);
        if ch in target then
            if ch = thisone then
                bulls := succ(bulls)
            else
                cows := succ(cows)
    end;
 
begin
    write('Загадайте случайное число, ');
    writeln('затем отгадывайте');
    readln(seed);
    pool := ['0'..'9'];
    target := [];
    a := unique; b := unique; c := unique; d := unique;
    repeat
        bulls := 0; cows := 0;
        try(a); try(b); try(c); try(d);
        writeln('Быков: ', bulls:1, '; коров: ', cows:1);
        readln
    until bulls = 4;
 
readln
end.

 

Примечания: 

Пользовательская функция random возвращает случайное число в интервале 0.0 <= random < 1.0.
Функция unique перемещает случайную цифру из pool в target.
Функция try читает следующую цифру и, если необходимо, увеличивает число быков или коров.

 

Тема

Процедуры, функции, рекурсии

Уровень

Сложные задачи