Есть три автомата, которые умеют отвечать на любой вопрос, на который можно ответить "Да" или "Нет". Естественно все множество возможных ответов исчерпывается двумя вариантами: "Да", "Нет". Один из них всегда говорит правду, один всегда лжет, а оставшийся отвечает произвольным образом. Необходимо задать 3 вопроса и выяснить, кто есть кто.
Здравствуйте, gloomy rocker, Вы писали:
GR>Есть три автомата, которые умеют отвечать на любой вопрос, на который можно ответить "Да" или "Нет". Естественно все множество возможных ответов исчерпывается двумя вариантами: "Да", "Нет". Один из них всегда говорит правду, один всегда лжет, а оставшийся отвечает произвольным образом. Необходимо задать 3 вопроса и выяснить, кто есть кто.
1 вопрос: Ответит ли 1-ый автомат на вопрос правдиво ?
2 вопрос: Ответит ли 2-ой автомат на вопрос правдиво ?
3 вопрос: Ответит ли 3-ий автомат на вопрос правдиво ?
Повисшие — те, которые говорят всегда правду и неправду, с ними разобраться элементарно.
Оставшийся в живых — случайный
Здравствуйте gloomy rocker, Вы писали:
GR>Есть три автомата, которые умеют отвечать на любой вопрос, на который можно ответить "Да" или "Нет". Естественно все множество возможных ответов исчерпывается двумя вариантами: "Да", "Нет". Один из них всегда говорит правду, один всегда лжет, а оставшийся отвечает произвольным образом. Необходимо задать 3 вопроса и выяснить, кто есть кто.
Задача не коректна ибо тот который отвечает произвольно может три раза солгать или три раза сказать правду.
... << RSDN@Home 1.0 alpha 12 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте bnk, Вы писали:
bnk>Повисшие — те, которые говорят всегда правду и неправду, с ними разобраться элементарно. bnk>Оставшийся в живых — случайный
Вопрос кто есть кто. Вот попробуй сказать кто есть кто из висящих.
... << RSDN@Home 1.0 alpha 12 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, bnk, Вы писали:
bnk>1 вопрос: Ответит ли 1-ый автомат на вопрос правдиво ? bnk>2 вопрос: Ответит ли 2-ой автомат на вопрос правдиво ? bnk>3 вопрос: Ответит ли 3-ий автомат на вопрос правдиво ?
bnk>Повисшие — те, которые говорят всегда правду и неправду, с ними разобраться элементарно. bnk>Оставшийся в живых — случайный
Каждый вопрос адресуется одному из трех автоматов, а не всем сразу.
Если я чего-то не понял, поясните, который из вопросов какому из автоматов задается.
Здравствуйте, WolfHound, Вы писали:
WH>Задача не коректна ибо тот который отвечает произвольно может три раза солгать или три раза сказать правду.
Задача абсолютно корректна даже в этом случае. Решение я знаю, но не скажу, ибо так будет не интересно. Решение основано на обычной логике (Булевской), так что думайте.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте bnk, Вы писали:
bnk>>Повисшие — те, которые говорят всегда правду и неправду, с ними разобраться элементарно. bnk>>Оставшийся в живых — случайный WH>Вопрос кто есть кто. Вот попробуй сказать кто есть кто из висящих.
Здравствуйте, gloomy rocker, Вы писали:
GR>Здравствуйте, WolfHound, Вы писали:
WH>>Задача не коректна ибо тот который отвечает произвольно может три раза солгать или три раза сказать правду.
GR>Задача абсолютно корректна даже в этом случае. Решение я знаю, но не скажу, ибо так будет не интересно. Решение основано на обычной логике (Булевской), так что думайте.
Чего-то мне так не кажется. Без "завешиваний" по-моему, не обойтись.
Ведь тот, который отвечает произвольно, может ответить на все 3 вопроса так же как и любой из первых двух,
и тогда он неотличим
Может предлагается довольствоваться вероятностью ?
Или под "произвольно" понимается что он отвечает по очереди "Да" и "Нет" ?
идея такая: первым вопросом определяем, какой автомат точно не является случайным. Вторым определяем, какой это именно автомат: врущий или правдивый. А третим — кто есть who из оставшихся автоматов. Хитростей тут две: 1) алгоритм адаптивный, т.е. заранее не известно у кого и что будем спрашивать во 2-й и 3-й раз. 2) вопросы задаем только 2-м автоматам (последние 2 — одному и тому же автомату).
Здравствуйте, Atilla, Вы писали:
A> if(ASK(0, a[1]>a[2]))// #1
Предположим, что 1 автомат всегда говорит правду.
Значит, на самом деле он он не знает априори значение выражения a[1]>a[2]
(он знает это только потому что находится в одной программе с остальными
и массив уже проинициализирован ).
Следовательно, при таком вопросе первый автомат повисает.
A>идея такая: первым вопросом определяем, какой автомат точно не является случайным. Вторым определяем, какой это именно автомат: врущий или правдивый. А третим — кто есть who из оставшихся автоматов. Хитростей тут две: 1) алгоритм адаптивный, т.е. заранее не известно у кого и что будем спрашивать во 2-й и 3-й раз. 2) вопросы задаем только 2-м автоматам (последние 2 — одному и тому же автомату).
Идея абсолютно правильная!!!
Я покапался в программе и понял, что реализация идеи тоже правильная.
Спрашиваем первого: ты дипломат?.
Да — первый либо дипломат либо лжец.
Спрашиваем второго: ты сейчас ответишь также правдиво, как предыдущий?
Да — первый дипломат
Спрашиваем второго: первый дипломат?
Да — второй рыцарь, третий лжец
Нет — второй лжец, третий рыцарь
Нет — первый лжец
Спрашиваем первого: второй дипломат?
Да — второй рыцарь, третий дипломат
Нет — второй дипломат, третий рыцарь
Нет — первый либо дипломат либо рыцарь
Спрашиваем второго: ты сейчас ответишь также правдиво, как предыдущий?
Да — первый рыцарь
Спрашиваем первого: второй дипломат?
Да — второй дипломат, третий лжец.
Нет — второй лжец, третий дипломат.
Нет — первый дипломат
Спрашиваем второго: первый дипломат?
Да — второй рыцарь, третий лжец
Нет — второй лжец, третий рыцарь
Спрашиваем первого: ты дипломат?.
Да - первый либо дипломат либо лжец.
Спрашиваем второго: ты сейчас ответишь также правдиво, как предыдущий?
Да - первый дипломат
Спрашиваем второго: первый дипломат?
Да - второй рыцарь, третий лжец
Нет - второй лжец, третий рыцарь
Нет - первый лжец
Спрашиваем первого: второй дипломат?
Да - второй рыцарь, третий дипломат
Нет - второй дипломат, третий рыцарь
Нет - первый либо дипломат либо рыцарь
Спрашиваем второго: ты сейчас ответишь также правдиво, как предыдущий?
Да - первый рыцарь
Спрашиваем первого: второй дипломат?
Да - второй дипломат, третий лжец.
Нет - второй лжец, третий дипломат.
Нет - первый дипломат
Спрашиваем второго: первый дипломат?
Да - второй рыцарь, третий лжец
Нет - второй лжец, третий рыцарь
P>Спрашиваем первого: ты дипломат?.
P> Да - первый либо дипломат либо лжец.
P> Спрашиваем второго: ты сейчас ответишь также правдиво, как предыдущий?
P> Да - первый дипломат
P>
Неправильно.
Первый — лжец — на первый вопрос ответил Да (Лжет, что он дипломат)
Второй — дипломат — на второй вопрос ответил Да ( Случайным образом )
GR>Зачем такие сложности с 1000 испытаний ? GR>Такой код эффективнее.
ан-нет. Этот тест будет неверным, т.к. crufty отвечает случайным образом.
GR>Идея абсолютно правильная!!! GR>Я покапался в программе и понял, что реализация идеи тоже правильная.
Здравствуйте, UgN, Вы писали:
UgN>Лень в программе копаться.
UgN>Можно ли кратенько суть, как одним вопросом, узнать какой автомат точно не является случайным?
а этот вопрос задается первому: "Второй автомат правдивее третьего?". В случаях A[0] или A[2] ответ будет "да", в случаях A[1] или A[3] — "нет", в остальных — неопределен. Значит, если ответ "да", то 3-й автомат не случайный, а если "нет" — то второй. Считается, что honest правдивее crafty, который правдивее liar.