LINUX.ORG.RU

Man or boy 2к25: Ваш статически типизированный ЯП полноценен?

 


0

4

Когда то Кнут придумал тест для ALGOL реализаций, и он известен под именем «Man or boy test». Но там просто локальные функции, не особо интересно.

Предоставляю вам версию для проверки языка программирования, на то, достоен ли он существовать в 21 веке!

Для начала нарушу это правило (у Python динамическая типизация), и покажу Python версию:

def print_sum(x):
  def make(acc):
    def f(y):
      print("acc(%d) + %d" % (acc, y))
      return make (acc + y)
    return f
  return make(x)

print_sum(10)(20)(30)(40)
Вывод
acc(10) + 20
acc(30) + 30
acc(60) + 40

Предлагаю попробовать повторить пример на вашем любимом статически типизированном языке, и поделиться им в комментариях.

Мое повторение на OCaml с rectypes:

let print_sum x =
  let rec f acc = fun y ->
    printf "acc(%d) + %d\n" acc y;
    f (acc + y)
  in 
  f x
  
let () = ignore (print_sum 10 20 30 40)
Типы он вывел сам, но можно и указать вручную:
type t = int -> t 

let print_sum (x : int) : t =
  let rec f (acc : int) : t = fun (y : int) : t ->
    printf "acc(%d) + %d\n" acc y;
    f (acc + y)
  in 
  f x
  
let () = ignore (print_sum 10 20 30 40)

Языки которые смогли реализовать тест на лямбдах/функциях, их система типов и ее записи позволяет строить рекурсивные по возврату лямбды и функции:

Языки у которых получилось, но замыкания были выраженны через структуры, потому что они так представленны в самом языке, это облегачает построение рекурсивных по возврату типов, потому что рекурсии в структурах есть везде:

Языки у которых пока не получилось без дополнительных средств типа классов/структур для обхода проблем с типами:

  • Rust (использование trait)
  • C (некорректная реализация)
  • Zig (использование классов)
  • D (использование делегатов)

Не являсь полностью статически типизированным языком, через свою систему типов смогли выразить пример

★★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 21)
Ответ на: комментарий от Iron_Bug

функция - это просто адрес в памяти

Получается что 0x666 это функция. Просто адрес в памяти, а код зачем? Тем более в чем проблема вернуть адрес из памяти?

аргументы передаются через стек

А то, зачем регистры вообще нужны? Лучше через память постоянно все аргументы гонять. В чем смысл того что ты пишешь? Это не соответствует реальности и никак не связанно с моим постом.

это всё существовало сто лет назад

Это заход на полноту по Тьюрингу, но непонятно зачем тут все эти адреса и стеки.

ты по-русски смысл своей задачи можешь написать?

Какой задачи? Где ты задачу нашла? Я тут придумал проверку, которая находит изъяны в системе типизации языка, во многих языках невозможно построить рекурсивный тип функции которая возвращает саму себя.

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от Obezyan

Ну тогда сначала начать задавать вопросы, ручка это ручка? камень это камень? Вода это вода?

Если три раза подряд это только «ХЗ» это джаваскриптер, и теперь мы знаем что что «ХЗ» это ложь. Если ответит «Фиг его знает» три раза, значит «Фиг знает его» это ложь.

Теперь мы знаем что такое ложь, следующие вопросы должны быть только лживы, если ответы будут менятся то это гошник, а если будут противоположны лжи то плюсовик, последний будет понятно кто методом исключения, так как первых двух мы знаем.


Не так

Сначала вопросы идёт вода это вода? Если три раза ответ один от первого фиксируем его (но пока не знаем что оно значит), затем вопросы вида, вода это камень? Далее ответы будут либо полностью противоположные, но одинаковые, либо будут меняться, если противоположные то всё мы знаем какие вопросы ложные а какие правдивые, гошника методом исключения, если меняттся то это гошник, и в зависимости от соотношения к ложным и правдивым вопросам разойдутся плюсовик и джаваскриптер, так как ответчто есть что между «фиг знает» и «хз» заложен в наших вопросах и ответы будут всегда инвертированны логичности ответа у одного из.

Спалит всё именно что чёткая противопроложность ответов плюсовика и джаваскриптера. Пусть на разные вопросы, но на одинаково заложенный в них смысл, ложности или правдивости утверждения в вопросе.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 7)
Ответ на: комментарий от anonymous

Лямбда может быть по разному реализованна, в любом случае функция это чанк в памяти, если этот чанк как у gcc nested function Лежит на стеке, то внутри лямбду дёрнуть можно, а во вне выдать нельзя.

Если она в хопе как у некоторых, то её можно выдать во вне, её копия при вызове просто будет укладываться на стек и дёргаться, а после обрадно закидываться в хоп.

Или как в lua любая функция это вообще тип высшего порядка, функцию можно по значению отдать, это тупо исполняемый чанк, буквально просто набор байт, хоть по интернету функцию пересылай и с таким можно уже делать вообще всё что угодно. Хоть каллбеки, хоть лямбды замыкания что угодно.

А может оно просто синтаксическое быть, ты у себя пишешь

x = 2
a -> { x=+x return a } ()

А на деле это внутри

void * p= NULL;
void *(*a)(void)__tmp196841684()
{
   x+=x;
   return p; 
}

void * a()
{
    return __tmp196841684();
}

p = a
(blabla)p();

А потом всё это (ну типа такого) компиляется уже =)
Что накладывает свои ограничения.

Так что лямбды и прочие замыкания не волшебные и какие то самостоятельные штуки, в конечном итоге все они просто каллбеки, просто путь до непосредственно вызова у них разный и грязь скрыта под синтаксическим сахаром. И мы про статику, как сказал выше в динамике с высшим порядком любая карусель может быть, в статике, происходят неявные вещи просто.

Вот иронбуг про это, мне кажется. Плюсы вон вообще просто всё раскручивают подобное как расвручивают циклы в линейный ассембелер, несколько раз вставляя печать, хотя вызов у неё в коде один.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Да это понятно, что все в итоге сводится к инструкциям процессора.

Вот иронбуг про это, мне кажется.

Не знаю, сложилось впечатление, что у нее уже необратимая профессиональная деформация программиста, си головного мозга.

Это как физик шизанулся бы и стал ворчать: что вы тут мне рассказываете про красоту горного пейзажа. Контраст, яркие краски, цвета какие-то насыщенные. Идиоты. Придумали себе модные словечки, а ведь все это лишь давным-давно известные лектромагнитные волны.

anonymous
()
Ответ на: комментарий от Obezyan

Ааа, я думал по 3 на каждого. Сбила фраза «один и тот же вопрос…». Тогда я уже знаю что независимо от моих вопросов я услышу только

или

  • «Фиг знает» «Фиг Знает» «ХЗ»

или

  • «ХЗ» «ХЗ» «Фиг знает»

Порядок может быть иной, но это кажется не важно. Среди двух одинаковых ответов точно либо

или

  • гошник и плюсовик

или

  • гошник и дважаскриптер

последний в остатке, но я не знаю пока как отделить от гошника. Как только отделим всё станет ясно.

Как отделить не знаю

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от anonymous

что у нее уже необратимая профессиональная деформация программиста, си головного мозга.

Она смотрит на программы не на уровне синтаксических конструкций, а на уровне итогового исполнения. А там вариантов не много всего два и ещё два подварианта, просто на стеке дёрг, выгрузка на стек исполняемого чанка из кучи, всё. Сами лямбды могут быть раскручены в линейный код, там вообще вызовов нет никаких просто как цикл раскручено, это значит что можно тоже самое и без лямбд написать, так как рекурсия если будет то хвостовая. А если нет, то добро пожаловать где там свет в конце тунеля, ну граница стека при которой будет «есть пробитие!»

Про то где функции это типы высшего порядка я вообще молчу. Там вообще можно на компьютере А её запустить, она сама себя по значению через интерент пошлёт на компьютер Б и там продолжит исполнение. Но это обычно динамические языки, хотя в теории можно такое провернуть и со статическим языком.

Короче зря вы ругаетесь, низкоуровневые вещи как были так и остались, хоть на чём ты там пиши, внизу у них жопа одинаковая на вид. Важно и как оно пишется и как исполняется, а не что-то по отдельности, просто тебе важнее как пишется, а ей как исполняется. Разные сферы деятельности, и разные центры внимания, но без друг дружку вам никак =) Так что иди обнимафки с ирогбуг и чайепитие :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Можно все 3 вопроса задать одному, можно каждому по одному и тд. Суть в том что один и тот же вопрос нельзя задавать разным людям. Одному и тому же человеку можно хоть все 3 раза один и тот же вопрос задать.

Obezyan
()
Ответ на: комментарий от alysnix

Тут все любят делать вид что они что-то понимают в программировании. Вот я и привёл задачку на абстракции и булеву логику которые есть в любом языке и которыми должен владеть любой синьор.

Вот это мы и выясняем, чего вы все стоите на самом деле. Можете гуглить, мучать нейронки и тд, это не поможет.

Чтобы выиграть кубок Обезьяна нужно уметь думать.

Obezyan
()
Ответ на: комментарий от Obezyan

Чтобы выиграть кубок Обезьяна…

сеньоры и синьориты отличаются от прочих тем, что .уйней не занимаются и резистентны к манипуляциям. и это пожалуй их лучшее качество.

карочи - оставьте себе этот кубок и по нему ходите бесплатно в зоопарк.

alysnix ★★★
()
Ответ на: комментарий от anonymous

Функтором плюсисты называют объект класса с реализованным operator(), т.е. который можно вызывать как функцию.

К настоящим функторам это, конечно же, отношения не имеет. Так, плюсовый костыль.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Obezyan

Да блин, такое надо в правила явно вписывать.

Хорошо, тогда

Задаю вопрос случайному человеку «true == true»

Допустим ответ «ХЗ»

Задаю второй вопрос следующему «true != true»

Допустим ответ «ХЗ»

Третьему вопрос не я не буду задавать, я знаю что он не может ответить ничего кроме «Фиг знает», он не может это не ответить или он гошник.

Теперь я снова первому задаю вопрос. «1+1 = 2»

Если он мне ответит «ХЗ» то это плюсовик и ХЗ у него значит да.
Джаваскриптер отвечал тоже «ХЗ» ранее, он отвечал да, но он его да это лож.
Последний на которого мы даже не смотрели и ничего у него не спрашивали гошник.

Тоже самое будет если вместо «ХЗ» будет «Фиг знает»


Если первый раз ответ будет «ХЗ» а второй ответ у следующего будет «Фиг знает», то я спрошу третьего, тот же третий вопрос что выше.

Если третий ответит «ХЗ» то он джаваскриптер, первый плюсовик, а второй гошник, так как ответы плюсовика и дважасриптера одинаковые, но разные по логике ответа инверсия у них, а гошник просто гошник.


Но есть в этой игре нерешаемый вариант, по моему.

  • Спрашиваем первого 1 == 1 отвечает ХЗ (мы не знаем но это дважасриптер он сказал нет, но солгал)
  • Спрашиваем второго 1 != 1 отвечает ХЗ (мы не знаем но это плюсовик, он сказал нет, и так и есть)
  • Спрашиваем остаток 1+1==2 отвечает ХЗ (мы не знаем но это гошник он иметт права ответить случайно)

То всё приплыли. Короче, либо я решил, либо я дебил, всё равно больше никто не играет, колись. А я спать :) Ну или пытай меня завтра.


UDP: Перечитал своё сообщение, я дебил, даже удалять не буду, пора спать.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Да блин, такое надо в правила явно вписывать.

Оно и написано, просто более емко чем следовало. Думал и так понятно, задачка-то простая.

Перечитал своё сообщение, я дебил, даже удалять не буду, пора спать.

Нет, не дебил. Вы начали размышлять и строить гипотезы, так и нужно.

Также вы нащупали стену в которую уперлись, так и должно быть. Отсюда и начинается то что отличает синьора от миддла.

Obezyan
()
Ответ на: комментарий от LINUX-ORG-RU

Случайность она такая. Сценарий ответов гошника может быть случайно такой, что его не отличить от js или от cpp не то что за 3 ответа, но и более длинные последовательности. Так что задача бессмысленная и не стоит тратить на нее время.

Psilocybe ★★★★★
()
Ответ на: комментарий от Obezyan

Ответ: задача не имеет решения.

Доказательство:

Действительно, пусть (x,y,z) это ответы плюсовика, жсника и гошника на набор из трёх вопросов.

Любому алгоритму, классифицирующему программистов, соответствует функция, которая, получив на вход перестановку значений (x,y,z), возвращает номер перестановки. Поскольку алгоритм классифицирует программитов во всех возможных случаях, эта функция является сюръективной.

Всего существует 3! = 6 возможных перестановок трёх элементов.

Поскольку ответы гошника случайны, для любого набора вопросов можно выбрать ответ z так, чтобы он совпадал с x. Без потери общности положим, что x = 1.

Пусть y = 1. Тогда существует единственное значение, которое можно получить перестановкой значений (x,y,z): (1, 1, 1). Поскольку 1 меньше 6, рассматриваемая функция не является сюръекцией. Противоречие.

Пусть y = 0. Тогда существует 3 возможных значения, которые можно получить перестановкой значений (x,y,z). Поскольку 3 меньше 6, рассматриваемая функция не является сюръекцией. Противоречие.

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от quantum-troll

Задача имеет стройное логичное решение. Если все кто хочет попробуют решить её не справятся я напишу решение.

Про факториал верно, про рассмотренные игреки тоже. Вы убедились что она решается не в лоб.

Obezyan
()
Ответ на: комментарий от Obezyan

Задача имеет стройное логичное решение.

Я только что доказал, что не имеет. Прошу либо предоставить решение, чтобы я мог найти в нём ошибку, либо указать на ошибку в моём доказательстве.

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от quantum-troll

Я только что строго доказал, что не имеет.

Нет, не строго.

Прошу либо предоставить решение, чтобы я мог найти в нём ошибку, либо указать на ошибку в моём доказательстве.

Хорошо, дам подсказку - вы рассмотрели не все виды игреков. Я неоднократно писал что это задача на понимание абстракций, а вы её ещё не начали применять толком.

Obezyan
()
Ответ на: комментарий от Obezyan

Хорошо, дам подсказку - вы рассмотрели не все виды игреков.

То есть жсер может отвечать не только «Фиг его знает» или «ХЗ»? Это противоречит условию задачи.

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Перед сном, встал посцать и во время этого пришла мысль, перечитал ещё раз задание, я же тоже сотрудник получается, и я могу и так знать кто из их кто, это мои вопросы должны и их ответы должны выдать кто из них кто, а не я сам.

Я соберу их троих посмотрю на гошника и спрошу себя «он гошник»? Я отвечу себе «ХЗ» теперь «ХЗ» это «ДА», затем я спрошу гошника уйти и отвернусь, за моей спиной двое они могут встать как хотят, я не знаю кто где стоит.

Я спрошу тот кто слева за моей спиной, ответь на вопрос «true == true»

  • если я услышу в ответ «ХЗ» то это плюсовик, так как я задал определил своим же ответом что «ХЗ» это да, а плюсовик никогда не врёт, я скажу ты плюсовик, а справа дважаскриптер

  • если я услышу в ответ «Фиг знает» то это джаваскриптер, так как он всегда врёт, я скажу ты дважаскриптер, а остался плюсовик.

Так чтоль? :D Пока это единственное гарантированное, хоть формулу пиши. Я просто ради поэзии сцену описал.

Итого мне надо только два вопроса, первый самому себе для определения что значит ответ, и убирания гошника, второй вопрос любому оставшемуся, его ответ гарантировано его выдаст, третий будет просто в остатке.

Но мне кажется я натянул сову на глобус, да? Очень уже просто и красиво выходит.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от hateyoufeel

К настоящим функторам это, конечно же, отношения не имеет. Так, плюсовый костыль.

главное в математике - не перепутать функтор со сфинктером.

короче - в плюсах функтор есть «функциональный объект» а не нечто математическое, которое вы там все время путаете.

alysnix ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

я могу и так знать кто из их кто

И зачем тогда тебе задавать им какие-то вопросы, нарезал задач и за работу, товарищи.

Меня тут смущает присутствие случайной величины в виде гошника, который непременно обосрёт нам весь детерминизьм %)

Nervous ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

у вас три неизвестных и три вопроса-уравнения, вспоминаем линейную алгебру, составляем правильно вопросы и решаем систему линейных уравнений из трех штук.

alysnix ★★★
()
Ответ на: комментарий от anonymous

сложилось впечатление, что у нее уже необратимая профессиональная деформация программиста, си головного мозга.

Классический сишник – ничего кроме сишки не знает, опыта за пределами сишки нет, но своё веское имеет обо всем на свете и считает всех дебилами. Раньше на лоре таких много было, сейчас вымирающий вид. Так что не слишком обижайте жука, а то кто будет нас веселить своей железобетонной глупостью.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

я же тоже сотрудник получается, и я могу и так знать кто из их кто

Ты-то вряд ли, ты же новый тимлид. А вот они сами наверняка знают, кто из них кто, и это (теоретически) позволяет нам задавать более информативные вопросы.

Nervous ★★★★★
()
Ответ на: комментарий от Obezyan

Но я сам виду проблему в своём доказательстве — высказывание про существовние функции. Судя по всему, я неправильно смоделировал условие задачи.

Заодно у меня есть идея, как её смоделировать. Программисты знают друг о друге, так что вопрос это функция из перестановок в бул. Любому опросу соответствует бинарное дерево глубиной 3 (в опроснике могут быть более трёх вопросов, но при этом в каждом случае будут заданы ровно три). Ну и так далее.

Дальше я могу, как программист, перебрать модели в поисках решения, но мне лень это делать.

quantum-troll ★★★★★
()
Ответ на: комментарий от unC0Rr

На nightly можно так:

#![feature(unboxed_closures)]
#![feature(fn_traits)]

struct S(Box<dyn FnOnce(i32) -> S>);

impl FnOnce<(i32,)> for S {
    type Output = S;

    extern "rust-call" fn call_once(self, arg: (i32,)) -> S {
        self.0(arg.0)
    }
}

fn print_sum(x: i32) -> S {
    fn make(acc: i32) -> S {
        let f = move |y| -> S {
            println!("acc({} + {})", acc, y);
            make(acc + y)
        };
        S(Box::new(f))
    }
    make(x)
}

fn main() {
    print_sum(10)(20)(30)(40);
}

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2024&gist=29efa996b7a5b919f08558c753067abd

unC0Rr ★★★★★
()

Delphi (в FPC тоже возможно работает, но в стабильном релизе еще нет лямбд а из транка мне лень собирать)

program Project2;

{$APPTYPE CONSOLE}

type
  TAdder = reference to function(i: Integer): TAdder;

function Make(acc : Integer): TAdder;
begin
  Result :=  function (y : Integer): TAdder begin
    writeln('acc(',acc,') + ',y);
    Result := make(acc+y);
  end
end;

function PrintSum(x : Integer) : TAdder;
begin
  Result := Make(x);
end;

begin
  PrintSum(10)(20)(30)(40);
end.
kipar_2024
()
Ответ на: комментарий от Nervous

да, он конечно усложняет всё. По идее, можно приравнять его к js-нику (или сишнику) если спрашивать «если ты спросишь второго, чтоб он спросил третьего про Х, то есть ли хоть какие-то шансы на положительный ответ» (кроме случая когда гошник первый). Ну и если мы спалим гошника за два вопроса то третьего хватит чтобы узнать кто есть кто. Но целиком схемы у меня пока нет.

kipar_2024
()
Ответ на: комментарий от Obezyan

Всё, я решил. Вопросы получаются довольно громоздкими, но к счастью спрашиваю я программистов (а не стражников, как заведено в таких задачах), так что думаю они справятся.

Леммы.

  1. Неопределенность «фиг знает»\ХЗ мы нейтрализуем оборачивая каждый вопрос в «если ХЗ означает «нет», то ответь на Х, а если ХЗ это «да» то ответь на !Х». Памятуя о придирках которые я встретил на другом форуме с похожей задачей, сформулирую сразу как вопрос: "Верно ли, что истинность Х равна истинности утверждения «ХЗ означает «нет»?». Также можно сформулировать это как «ответь на X xor (ХЗ означает «да»)» или «Х? Инвертируй ответ если ХЗ означает да.»

  2. Конструкция «Если бы я попросил тебя попросить второго, чтобы он втайне от тебя спросил третьего Х, а потом спросил бы его и передал мне ответ, и при этом случилось бы так что гошник в этой цепочке вопросов соврал бы, то ответ был бы…» позволяет получить правдивый ответ на вопрос всегда кроме случая когда мы спрашиваем гошника (в этом случае ответ будет бесполезным).

  3. Первый вопрос позволяет нам разбить 6 возможных раскладов на 2 группы по 4 (2 расклада где мы спросили гошника войдут в обе группы т.к. он может ответить что угодно, а 2 других мы можем выбрать подобрав правильный вопрос). Разобьем так чтобы в каждой группе мы точно знали одного не-гошника (т.е. при ответе «да» негошник был вторым, а при ответе «нет» негошник был третьим). Тогда спросив негошника мы получим полезный ответ и разобьем группу на 2 группы по 2 расклада, ну и третьим вопросом определим расклад.

Поехали: поставим их в ряд чтобы не путаться и назовем для себя «левый», «средний» и «правый».

Вопрос 1 задаем левому. «Если бы я попросил тебя попросить среднего, чтобы он втайне от тебя спросил правого о том, гошник ли правый, а потом спросил бы его об ответе и передал мне ответ, и при этом случилось бы так что гошник в этой цепочке соврал соврал бы, то какой был бы ответ? Инвертируй ответ если ХЗ означает да.»

Если он отвечает Фиг его знает, значит мы можем быть уверены что средний негошник, а если отвечает ХЗ, значит правый - негошник.

Вопрос 2. Спросим выявленного негошника «Если бы я попросил тебя попросить второго, чтобы он втайне от тебя спросил третьего о том, сишник ли ты, а потом спросил бы его об ответе и передал мне ответ, и при этом случилось бы так что гошник в этой цепочке соврал бы, то какой был бы ответ? Инвертируй ответ если ХЗ означает да.»

Если он отвечает Фиг его знает, значит мы можем быть уверены что он сишник, а если отвечает ХЗ, значит он - js-макака.

Ну и наконец вопрос 3: Спросим его же: «Если бы я попросил тебя попросить второго, чтобы он втайне от тебя спросил третьего о том, гошник ли левый, а потом спросил бы его об ответе и передал мне ответ, и при этом случилось бы так что гошник в этой цепочке соврал бы, то какой был бы ответ? Инвертируй ответ если ХЗ означает да.»

Если он отвечает Фиг его знает, значит мы можем быть уверены что левый гошник, а если отвечает ХЗ, значит левый негошник и мы в любом случае определили всех трех.

(два последних вопроса можно упростить т.к. мы уже знаем часть информации, и можно обойтись без конструкции из леммы 2, но раз уж на первый вопрос они смогли ответить то не все ли равно).

kipar_2024
()
Последнее исправление: kipar_2024 (всего исправлений: 2)
Ответ на: комментарий от kipar_2024

Вы с котом на верном пути.

Раз у нас 6 состояний и 3 вопроса, то нам нужно как-то упаковать информацию о двух сотрудниках в один вопрос, о том кого спрашиваем и о том о ком его спрашиваем. Они ведь знают кто есть кто, стоят напротив вас и лыбятся.

@Psilocybe не осилил. Сдался и наставил клоунов :) записываем его в миддлы.

Obezyan
()
Ответ на: комментарий от kipar_2024

чтобы он втайне от тебя спросил правого о том, гошник ли правый, а потом спросил бы его об ответе и передал мне ответ,

  1. Перефразируйте, а то логика теряется.

  2. Зачем спрашивать тайно?

  3. Попробуйте упростить, зачем Если бы я попросил тебя попросить второго, чтобы он втайне от тебя спросил третьего Х если можно напрямую спросить у первого о втором при условии что первый это X, а его ответ такой-то.

Вы все ближе и ближе, направление размышлений верное.

Obezyan
()
Ответ на: комментарий от Obezyan

Мне нужно чтобы ответ на Х (Х это вопрос а не имя программиста) прошел две инверсии (первую потому что макака соврет, а вторую потому что я попросил рассмотреть случай когда гошник соврет). Если второй будет спрашивать третьего открыто, то первый сам же услышит ответ и инверсий будет не две (допустим первый сишник второй макака, макака спросит, гошник соврет, а у макаки возможности соврать не будет - сишник услышит ответ и честно скажет мне ложный ответ).

Не вижу смысла упрощать если это и так работает.

kipar_2024
()
Последнее исправление: kipar_2024 (всего исправлений: 1)
Ответ на: комментарий от kipar_2024

Дам совсем уж откровенную подсказку, но у меня задача не завалить или поучать, а посмотреть кто как думает.

Попробуйте перевести свою логику в вид:

Программист X, если я спрошу у тебя: «Программист Y — это гошник?», ты ответишь мне «Фиг знает»?

Obezyan
()
Ответ на: комментарий от kipar_2024

Если он отвечает Фиг его знает, значит мы можем быть уверены

Я об это обломался, если первый гошник (держим это в голове), то на выводы из первого ответа сделать нельзя никакие, если задать любой второй вопрос, то может оказаться что там гошник, и он сломает любое предыдущее предположение, задав третий вопрос, первому второму или третьему, ты второй раз можешь попасться на гошника, который снова тебе сломает всё.

Гошник может например всегда результатировать ХЗ ХЗ ХЗ или ФЗ ФЗ ФЗ и на любом этапе проверки, отменить все предыдущие умозаключения. В зависимости от кто он по счёту. Иначе говоря иначе говоря в любой логике будет точка опоры Х и если там будет гошник он может ложноположительно подствердить логическую цепочку, тем самым её сломав.

Есть вопросы где вложена вероятность ответа большая для одного из вариантов ответов у меня готово на половину, но я не знаю как гарантированно завершить, вот прям почти почти, но перебирая все варианты либо гошник ломает логическую цепочку либо мой ответ верен лишь в большиснтве случаев но всегда пока есть один вариант рассклада при котором гошник ломаеет всё.

Хотя попозже перечитаю может я твоё решение не понял, у меня по другому, но тоже более сложный вопрос чем раньше, смысл в увеличении вероятности (вынуждаю) одного из ответов. В зависимости от первого ответа должно быть минимум 2 варианта следующих вопросов, а если есть третий то там будет минимум 4 вопроса, но нужно свести к 1.

Повторяюсь, возможно я просто не понял твоего решения. Надо внимательно проверить. Но пока чисто в голове если первый гошник, то всё, все дальнейшие выводы сломаны, ну типа.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Obezyan

У меня первый вопрос «Первый ответь, второй всегда отвечает на вопрос ХЗ если ответ на него ХЗ» но дальше затык =)

Дам совсем уж откровенную подсказку

Если решение не одно, а несколько, то зря, всю малину портит. Ничего не говори. Хватит :D

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

В зависимости от первого ответа следующие два мы будем задавать либо второму либо третьему, поэтому если мы первым вопросом попали на гошника то он нам конечно ничего полезного не сказал, но другие два вопроса мы будем задавать точно негошникам и они нам помогут всё разрулить.

kipar_2024
()
Ответ на: комментарий от kipar_2024

Не вижу смысла упрощать если это и так работает.

Не работает, они отвечают только фиг знает и хз. Они не спрашивают друг друга. Те ошибка вот тут: чтобы он втайне от тебя спросил правого.

Но вы почти решили задачу, внимательно читайте последние подсказки.

Obezyan
()
Ответ на: комментарий от Obezyan

Ладно, тогда так:

Вопрос 1: Программист 1, если я спрошу у тебя: «Программист 3 — это гошник? == Программист 1 — это сишник?", ты ответишь мне «Фиг знает»?

Если отвечает ФЗ - второй негошник, если ХЗ - третий негошник. Остальные вопросы задаем негошнику:

Вопрос 2: если я спрошу у тебя: «1 == 1?", ты ответишь мне «Фиг знает»? (фз - он сишник, хз - он макака)

Вопрос 3: если я спрошу у тебя: «Программист 1 гошник? == ты сишник?", ты ответишь мне «Фиг знает»? (фз - 1 гошник, хз - 2 не гошник а сишник\макака)


kipar_2024
()
Последнее исправление: kipar_2024 (всего исправлений: 4)
Ответ на: комментарий от kipar_2024

Браво. Кубок Обезьяна уходит вам.

Ваш уровень - техлид, возможно выше. Вас можно спокойно брать даже на проект с языком или задачами которые вам не сильно известны или вы раньше над ними не работали. Вы точно разберётесь в разумные сроки и справитесь с задачей.

Все остальные, кто столкнувшись со стеной смог подняться над схваткой, окинуть поле боя прищуренным глазом и начать ковырять вопрос, пытаться по-разному конструировать его - вы все синьоры с достойным уровнем компетенции и будете украшением любой команды разработчиков.

Жаль только что остальные не поверили в себя и не попробовали свои силы.

Obezyan
()
Ответ на: комментарий от Obezyan

Задам один глупый вопрос. Может быть, он вас рассмешит - не страшно. А техлиду не надо быть еще и гуманитарием, хотя бы, немножко? А то, мистер Обезьян, твой вопрос был слишком сложный и даже заумный где-то

anonymous
()