Мова програмування не була вказана. З include'ів я зробив висновок, що має бути C.
Ці значення можна користати як інформацію про результат порівняння.
// comparison_result.h
#ifndef COMPARISON_RESULT_H
#define COMPARISON_RESULT_H
typedef enum {
Less = -1,
Equals = 0,
Greater = +1
} comparison_result;
#endif
Ця функція приймає функцію (аргумент) і повертає функцію (результат). Функція-аргумент генерує int, який зберігається для майбутніх порівнянь. Функція-реультат дозволяє порівняти збережене значення з тим, яке передав користувач, скільки завгодно разів.
// container.h
#ifndef CONTAINER_H
#define CONTAINER_H
#include "comparison_result.h"
comparison_result (*container(int (*const generator)(void)))(int const);
#endif
В такий спосіб я намагався зховати сам int і дати користувачу тільки container для порівняння.
// container.c
#include "comparison_result.h"
#include "container.h"
static int storedValue = 0;
comparison_result compare(int const l, int const r) {
return l > r ? Greater : l < r ? Less : Equals;
}
comparison_result compare_stored_value_with(int const value) {
return compare(storedValue, value);
}
comparison_result (*container(int (*const generator)(void)))(int const) {
storedValue = generator();
return compare_stored_value_with;
}
Приклад користання. Містить функцію, яка псевдовипадково генерує число, і функцію, яка знаходить це число (без доступу до самого числа).
// main.c
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "comparison_result.h"
#include "container.h"
int get_random_value(void);
int find_value(comparison_result (*const)(int const));
int main() {
comparison_result (*c)(int const) = container(get_random_value);
int value = find_value(c);
printf_s("%i\r\n", value);
return 0;
}
// Return integer from range [0, 127]
int get_random_value(void) {
srand(time(0));
int value = rand();
value ^= value >> 0x08; // optional
value ^= value >> 0x10; // optional
value &= (-1 << 7) ^ -1;
return value;
}
// Return positive integer mined from container
int find_value(comparison_result (*const container)(int const)) {
int bit = 0x80;
int value = 0;
comparison_result r;
do {
r = container(value | bit);
if(r != Less) value |= bit;
bit >>= 1;
} while(bit > 0 && r != Equals);
return value;
}
На практиці користувати це майже не можливо, бо користувач захоче мати більше ніж 1 container, а static int тут тільки 1.
Пропонуйте свої варіанти. Особливо цікаво чи існує елегантне рішення цієї задачі мовою C.