20 лет назад я был сильно близорук -7 vs -14. Врачи того времени не могли подобрать правильные очки, которые я бы брал в кинотеатр. Чудо спасло меня. Я стал одним из первых пациентов московского центра глазной хирургии ЭКСИМЕР, где в 1999 году мне сделали операцию по коррекции зрения с использованием лазерной технологии ЛАСИК. Каждый глаз стоил чуть более 1000 долларов. После операции я забыл про очки и стал счастливым человеком.
И оставался счастлив, как вдруг зрение начало портиться. В 2013 году я стал плохо видеть шайбу, к 2015 — футбольный мяч (я играю в футбол и хоккей 6 раз в неделю) и наконец я перестал встречать некрасивых женщин. В мозгу вырисовывался вопрос — что, опять?

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

Разумеется, я вновь выбрал ЭКСИМЕР, но не московский, а поближе нижегородский.

Мне сделали операцию в пятницу 13-ого. 350 евро за глаз. Как и 17 лет назад, я стал временно дальнозорким; дело в том что после операции ближнее зрение возвращается в обычный режим не сразу. Отеки и туманы могут исчезнуть за 2 дня, а могут и за месяц — все зависит от индивидуума, которому порезали глаза.

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

Одна из таких головоломок неожиданно надолго застряла в голове. Это ребус про фальшивую монету. Напомню условие задачи —
Дано 12 монет и весы разновесы. Известно, что одна из монет фальшивая, то есть либо легче, либо тяжелее прочих.
Как найти фальшивую монету при помощи трех взвешиваний?


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

И я решил написать простое приложение под iOS, моделируя условия задачи. Программировать вслепую — это квест. Как и писать эту статью. Но я справился благодаря двум клавишам CMD и +. В данный момент времени я могу распознать текст на 27- дюймовом мониторе, если на экране вмещается не более 18-20 строк. Нечетко. С клавиатурой также непросто — пальцы помнят, но довольно часто сбиваются с привычных позиций. Сами клавиши я, вообще говоря, не вижу, но Ж от i отличаю.

Было довольно много смешных и трагикомичных моментов, Вы и сами можете догадаться; но важно, что я смог отвлечься от сумеречного состояния души.

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

Несколько слов про жизненный цикл разработки. Изначально я сделал один оригинальный уровень, повторяющий условия задачи. Вдоволь нарешавшись, добавил уровни с 2-мя, 3-мя, 4-мя и так далее, 11-ти монетами. Даже дошкольники научились решать упрощенные задачи.

Я подумал, что неплохо бы добавить уровни, в которых можно решить задачу с вероятностью не менее 0.5 и добавил еще 5 уровней с 13,14,15,16,17-ю монетами. Быстро пройдя новые рубежи, я добавил бесконечное число уровней в рамках 5 бит и успокоился. Да успокойся ты!

Специально для читателей Хабра игра бесплатна и переведена на русский язык.
Фальшивовомонетчик

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

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

Надеюсь, скоро увидимся!
Поделиться с друзьями
-->

Комментарии (70)


  1. Shultc
    17.05.2016 11:40
    +2

    Возникает вопрос: а почему у весов-разновесов только три взвешивания? Что их ограничивает? Возможно, это аркадные весы-разновесы, в которые нужно бросить монету, чтобы они взвешивали? =)
    Можно добавить, на весы прорезь для монет, и сделать, что одно взвешивание стоит 4 монеты (копейки?). А первое взвешивание бесплатно. Так мы оправдаем искусственное ограничение задачи, оставив те же три взвешивания!

    P.S. Тоже дальнозоркий. Задачу решил в уме, но с трудом. Спасибо!


    1. GarryC
      17.05.2016 12:14

      Если Вы вспомните троичную систему счисления (троичную уравновешеную), то решается в уме без малейших затруднений.


      1. Shultc
        17.05.2016 12:38
        +2

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

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


      1. TerraV
        17.05.2016 13:10

        совершенно верно. любое число монет. необходимо N взвешиваний для числа монет


        1. TerraV
          17.05.2016 13:20
          -1

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

          Необходимо N взвешиваний для монет 3 в степени N. Т.е. для 9 монет достаточно 2, от 10 до 27 достаточно 3 и т.д.


          1. Shultc
            17.05.2016 13:33
            +1

            Мне кажется, что это подходит только в случае, если известно, тяжелее или легче фальшивая монета. Не могли бы вы показать своё решение? Разумеется, спрятав его под спойлер.


            1. TerraV
              17.05.2016 13:37

              да, я к сожалению проглядел что неизвестно тяжелее или легче монета. В случае неопределенности как писал Ckpyt ниже, максимальное число монет для однозначной идентификации взвешиванием (3^N)/2


              1. vndtta
                19.05.2016 09:30
                +1

                не правда ваша
                в таком случае при N=3 получится 13 монет
                покажите способ определения фальшивой монеты за 3 взвешивания для 13 монет


                1. TerraV
                  19.05.2016 20:35
                  -1

                  Пожалуйста:
                  Взвешиваем 4 + 4.

                  Вариант А, весы равновесны: имеем 8 нормальных монет и 1 фальшивую в куче из 5. Взвешиваем 3 нормальные монеты и 3 монеты из кучи с фальшивой. А1 — весы равновесны — имеем 11 нормальных монет и 2 фальшивые. Взвешивание нормальной и любой из оставшихся позволяет определить фальшивую. А2. Весы имеют отклонение. В группе из 3 монет из фальшивой кучи 1 фальшивая и мы знаем тяжелее или легче она. Взвешиваем 1 + 1 из фальшивой кучи, определяем фальшивую однозначно.
                  Конец варианта А.

                  Вариант Б, весы показали перевес. Имеем 5 нормальных монет (те которые не взвешивали), 4 Л/Н (легкие или нормальные) и 4 Т/Н (тяжелые или нормальные). Следим за движениями рук: взвешиваем 3 Л/Н + 1 Т/Н на одной чаше весов и 3 Н + 1 Л/Н на другой чаше весов. Т.е. мы поменяли по 1 монете с разных чаш и 3 Т/Н заменили на строго Н. Имеем 3 варианта:
                  Б1 — чаши имеют тот же перевес что был в предыдущем взвешивании. Значит мы взвешивали 3 Л/Н + Н и 4 Н. выбрать из 3 монет одну фальшивую зная что она легче не представляет труда. взвешиваем любые 2 монеты из тройки, та что легче, та фальшивая. если вес одинаковый, то фальшивая третья.
                  Б2 — чаши равновесны. Т.к. при взвешивании 3 Т/Н были заменены на Н, фальшивая монета тяжелее и находится по аналогии Б1.
                  Б3 — чаши имеют другой перевес. значит одна из монет которую мы поменяли на чашах фальшивая. Мы не можем однозначно определить легче она или тяжелее. Взвешиваем одну из двух с любой нормальной и либо весы равны и фальшивая третья, либо весы не равны но мы знаем нормальную монету.


                  1. PapaBubaDiop
                    20.05.2016 09:20

                    ?


                  1. PapaBubaDiop
                    20.05.2016 09:29

                    В самом деле — и 13 монет решается однозначно за 3 взвешивания.


          1. PapaBubaDiop
            17.05.2016 13:34
            +2

            Это вы погорячились. Пусть 9 монет — какое первое взвешивание?


            1. rafuck
              17.05.2016 13:40
              +1

              Можно еще проще. Пусть монеты три. Какое взвешивание?


              1. PapaBubaDiop
                17.05.2016 14:10
                +7

                Еще проще — две монеты. Тут полное фиаско.


    1. wataru
      17.05.2016 12:14

      Ограничение чисто математическое. Гораздо логичнее другая постановка той же задачи — найти фальшивую монету за наименьшее количество взвешиваний (в худшем случае). Путем не сложной логической цепочки можно додуматься, что меньше, чем за 3 взвешивания это сделать точно не получится (каждое взвешивание может дать 3 различных исхода. 2 взвешивание даст 9 различных исходов, чего не хватит для определения одной из 12 монет).


  1. Ckpyt
    17.05.2016 12:45

    Хм… максимальное число монет для взвешиваний = (3^n)/2, где 3 — система счислений, n — число взвешиваний, 2 — число вероятностей веса монеты. Т.е. игра на 14 монет при 3-х взвешиваний имеет логичное решение, если заранее известно, что монета тяжелее или легче.


  1. ganqqwerty
    17.05.2016 12:46
    +9

    А зачем тут эксимер?


  1. GennPen
    17.05.2016 13:10

    «Разумеется, в статье есть математическая умышленная ошибка,»
    Ну, это очевидно же, что: «Как и 17 лет назад,» =)


  1. CrazyNiger
    17.05.2016 13:11
    -4

    Мне вот всегда было интересно, что трудного в этой задачи? Особенно для программистов, если они знакомы с теорией информации.
    И кстати, за три взвешивания можно гарантировано вычислить фальшивую монету из пачки до 27 монет.


    1. FeferIvan
      17.05.2016 13:15
      +3

      Только если ты знаешь заранее легче или тяжелее фальшивая монета.


  1. T-362
    17.05.2016 13:11
    +1

    Четыре дна после повторной(!) операции — и нагружать зрение работой на компьютере… Не бережете вы себя!
    По своему опыту — от фемтоласика отходил неделю стараясь не нагружать зрение вообще.


    1. PapaBubaDiop
      17.05.2016 13:28
      +1

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

      Что касается умышленной ошибки - она здесь
      Вариант игры с двумя монетами не имеет решения ни за какое количество взвешиваний.


      1. T-362
        17.05.2016 15:04
        +2

        Буду ждать статью. Особенно хорошо будет упомянуть различия ласика и фемтоласика, а еще добавить полезный совет — не смотреть на ютубе как выглядит операция — со стороны это гораздо страшнее выглядит чем «от первого лица».

        Безумная идея — сделать для окулуса игру показывающую как собственно это все видится, со всеми положенным затемнениями, мутностями и спецэффектами.


  1. vmoskalev
    17.05.2016 13:11

    Добрый день

    Не могу не поделится ссылкой.


    1. Sirion
      17.05.2016 13:21
      +27

      Кажется, смогли.


      1. vmoskalev
        18.05.2016 11:28
        +1

        к сожалению да ((
        В предпросмотре ссылка выглядела нормально, а в комменте нет ((

        https://habrahabr.ru/post/243461/


  1. habr_1ce
    17.05.2016 13:11
    -1

    Одно из двух:
    Вес фальшивки дб определён
    Взвешиваний дб больше


  1. CynepHy6
    17.05.2016 13:11

    5 + 5 + 2 = 12
    2 + 2 + 1 = 5
    1 + 1 = 2
    это же школьная задача. если повезет — два взвешивания


    1. Shultc
      17.05.2016 13:30
      +2

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


  1. syslinux
    17.05.2016 13:11
    +1

    Спасибо интересно, если будет время хотелось бы увидеть под Android.


  1. Sirion
    17.05.2016 13:20
    +4

    20 лет назад я был сильно близорук -7 vs -14

    Я дико извиняюсь, но почему «vs»? У вас глаза дрались между собой? Или это общепринятое сокращение при указании зрения на оба глаза?


    1. PapaBubaDiop
      17.05.2016 13:31
      +11

      Простое сокращение, v- влево, s — справа. Скоро станет стандартом.


  1. Bokhan
    17.05.2016 14:15
    -2

    Крайне просто решается задача. Итак, 12 монет, весом в известную(?) сторону отличается только одна, 3 раза можно взвесить.
    1. 6 / 6 — отсекаем сразу половину
    2. 3 / 3 — отсекаем половину от оставшегося
    3. 1 / 1 — либо одна перевесит, либо фальшивую не взвесили; в любом случае, решение однозначно найдено

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


    1. Shultc
      17.05.2016 14:25
      +2

      то есть либо легче, либо тяжелее прочих.

      Ох уж эта непонятность, да?.. Мне кажется вы просто не старались понять. Как и большинство здесь отписавшихся.


    1. lolhunter
      17.05.2016 14:31
      -1

      Если известно тяжелее или легче — задача решается минимум 2-3 способами. Если взвешивать по 4 в большинстве решений будет 2 шага. Если принять условия топикстартера "Известно, что одна из монет фальшивая, то есть либо легче, либо тяжелее прочих." — задача однозначно не решается за 3 шага во всех случаях хотя бы потому, что финальным шагом надо будет взвесить фальшивую монету относительно нормальной.


      1. lolhunter
        17.05.2016 14:35
        +2

        Таки задача решается, если немного подумать с бумажкой)


      1. Shultc
        17.05.2016 14:35
        +3

        Решается она в три шага.


    1. anmipo
      17.05.2016 14:38
      +2

      Любая сложная задача имеет простое, легкое для понимания неправильное решение. © Артур Блох

      В условиях сказано вполне однозначно: «либо легче, либо тяжелее прочих».

      Вариант решения
      Шаг 1. Три монеты на одной чашке, три монеты на другой.
      Шаг 2. Оставшиеся шесть монет снова делим на две тройки и взвешиваем их.

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

      Шаг 3. Из найденной тройки откладываем одну монету в сторонку, оставшиеся две сравниваем на весах. Поскольку мы уже знаем характеристики фальшивой монеты (тяжелее/легче), по весам её легко определить. Если взвешенные монеты весят одинаково, то фальшивая монета — та, что в сторонке.


      1. Shultc
        17.05.2016 14:41
        +2

        Как вы узнаете, тяжелее фальшивая монета или легче после шага 2?
        Вот есть у вас результат первых двух взвешиваний:

        • Две чаши весов в равновесии
        • Правая чаша весов ниже левой

        Как вы из этого сможете сделать вывод, должна ли фальшивая монета быть тяжелее или легче?


        1. anmipo
          17.05.2016 14:58

          Мда, действительно. Спасибо.


      1. habr_1ce
        17.05.2016 14:47
        +1

        Как можно узнать на какой чаше весов фальшивка на шаге 2(1)?


    1. xrun2k
      17.05.2016 14:39

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


  1. xrun2k
    17.05.2016 14:54

    Считаю что решения за три действия точно нет. Плюс товарищ vikodin из этой статьи это подтверждает.
    log3(12)+1 с округлением в большую сторону дает 4.


    1. Ckpyt
      17.05.2016 18:01

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


  1. PapaBubaDiop
    17.05.2016 14:55
    +2

    Вспомнил, у меня же есть видео!


    1. Shultc
      17.05.2016 14:57

      Ну спрячьте под спойлер! Меня тут уже пару часов ломает, чтобы решение не рассказать, и люди сами решали. А вы взяли и… Эх вы…


      1. PapaBubaDiop
        17.05.2016 15:11

        Прости меня, но все-таки видео само не запустится? Оно не хуже спойлера…


        1. Shultc
          17.05.2016 15:15

          Согласен. Но и текст «сам не читается». Смысл в том, что видя спойлер, ты сначала читаешь его название, к примеру «Осторожно, решение!». Видео же можно запустить и не зная, что там решение (вы, кстати, об этом и не написали). В результате хабравчанен может включить ваше видео лишь для того, чтобы посмотреть на то, как работает ваше приложение, а получит решение, которое возможно и не хотел пока видеть.


        1. xrun2k
          17.05.2016 15:18

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


          1. PapaBubaDiop
            17.05.2016 15:21
            +1

            Не торопитесь, у Вас есть информация с первого взвешивания — она и пригодится в этом случае — главное, правильно положить монеты на правую и левую чашки!


            1. xrun2k
              17.05.2016 15:32

              Итого у нас есть три неизвестные монеты и 9 известных. Обозначим как 1-2-3, известные как Х.
              Возьмем взвешивание ХХ1 и ХХ2.
              1. Если оно равно, то фальшивая монета 3. Но если не равны, то опять таки незнание о весе не даёт нам понимание 1 или 2 фальшивая без дополнительного взвешивания, типа ХХХ и ХХ1.
              2. Если не равно, то см. пункт 1.
              Мешать монеты по типу Х12 и ХХ3, тоже смысла нет ибо имея худший вариант получим не знание 1 или 2.

              Я может заблуждаюсь где-то, просьба прислать в личку решение, если оно всё-таки есть.


              1. PapaBubaDiop
                17.05.2016 15:52

                Решение
                В третьем взвешивании положите левую монету на ПРАВУЮ чашку весов и одну из прав монет к ней рядом. На левую — две настоящие; Рассмотрите ТРИ варианта взвешивания — и сравните с ПЕРВЫМ взвешиванием. Если чашки разновесны, но знак поменялся, решение очевидно. Перекинутая монета фальшива. Если не поменялся — ответ еще очевиднее. А если равенство, совсем еще вообще очевиднее.


    1. Ckpyt
      17.05.2016 17:40
      +1

      Как-то со звездочками туговато :-) Маловато дают даже за верное решение :-)


  1. Denai
    17.05.2016 15:52
    +1

    Это перевод, реклама ЭКСИМЕР или автор во время написания поста прозрел?


    1. PapaBubaDiop
      17.05.2016 15:55

      Это отзыв, среди нашего брата много очкариков, им важна любая информация. По поводу эксимера — в 1999 году у него не было конкурентов в Москве и результат — 14 лет хорошего зрения после операции я считаю успешным. А вот с нижегородским офисом все гораздо сложнее и мой совет — не пользуйтесь провинцией. Впрочем, возможно я неправ — мое мнение может измениться через месяц.

      Прозрею — все расскажу: ух.


      1. Denai
        17.05.2016 15:56

        т.е. вы мой комментарий не видите и отвечаете наугад?


        1. PapaBubaDiop
          17.05.2016 15:58

          Комментарий Ваш я хорошо увеличил и вижу (догадываюсь); а вот имя не вижу — другой фонт-шрифт, плохо масштабируется.


          1. Denai
            17.05.2016 16:02

            Хм… тогда строчка про «никуда не присылайте» неуместна. А какое у вас сейчас зрение?


            1. PapaBubaDiop
              18.05.2016 10:16

              Сегодня чуть лучше- я распознал Ваш ник. Мое зрение невозможно опередить количественно — полная анизотропия до схода отеков внутри глаза.


              1. Denai
                18.05.2016 13:14

                А это вообще не вредно напрягать зрение в такой период? Вы не пробовали скринридеры (не уверен в названии) и аналогичые приблуды для браузера, которые зачитывают нужный текст?


                1. PapaBubaDiop
                  18.05.2016 13:24

                  Доктор наложил единственное ограничение — запрет на сауну в течении 2 недель; Секс, алкоголь, наркотики, пауэрлифтинг — все можно.


                  1. Shultc
                    18.05.2016 13:41
                    +1

                    … но не в сауне…


  1. gearbox
    17.05.2016 18:56
    +2

    >Все замечания по ошибкам в статье никуда не присылайте.
    Патентовать не будете, это же уже в public domain? Можно использовать?


  1. sultee
    19.05.2016 02:08

    Что ж вы по-модному, голосовым вводом не набрали статью и код!


  1. Grace_Aredel
    19.05.2016 09:32

    Как-то была я в одной фирме на собеседовании на позицию тестировщика. После стандартного вопроса про взвешивание бильярдных что ли шаров за минимальное количество заходов. А потом мне задали такую задачку: «Есть грубо говоря 100 коробок с компьютерными мышками, по 100 мышек в коробке. Но одна коробка содержит в себе бракованные мышки. за одно взвешивание надо обнаружить, какая именно.»
    Я с ней самостоятельно не справилась, предложенное собеседующим решение меня не устроило, и вообще все внутри меня бунтовало против этой идиотской задачи.))


    1. rafuck
      20.05.2016 11:04

      1) Известно ли, тяжелее или легче?
      2) Известно ли, насколько?
      3) По-прежнему весы Фемиды или те, которые позволяют узнать вес?
      4) Если весы Фемиды, то есть ли в наличии гирьки?

      Т.е. примерно понятно, как решать, но хотелось бы полную формулировку.


      1. Grace_Aredel
        20.05.2016 11:14

        1 и 2 — легче, на 1 грамм, то есть вес бракованных мышек составляет 99 грамм за каждую. Весы не Фемиды, а обычные грузовые с одной платформой.


        1. rafuck
          20.05.2016 11:15

          Ну, тогда просто же все.


          1. rafuck
            20.05.2016 11:21

            А, не. Вес мышки еще нужен… Или без него? Тогда хм…


            1. rafuck
              20.05.2016 11:30

              Нет, не нужен вес мышки…
              Кто разговаривает сам с собой? Я?! Нет, я сам с собой не разговариваю!
              Простите.