может и боян, но ф тему

phobos

Новичок
может и боян, но ф тему

Буратине дали три яблока.
Два он съел.
Сколько яблок осталось у Буратины?
Думаете одно?
Нифига.
Никто же не знает сколько у него уже было яблок до этого
Мораль - обнуляйте переменные
 

MaGIc2laNTern

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

Krisha

pain in the neck
Начнем с того, что во-первых, не определено, что есть "Буратине", во-вторых не определено, что есть "яблоко", более того, с понятием "дали" тоже проблемы...

Давайте не будем "миксовать" элементарные операции с логикой и анализом :)

-~{}~ 17.09.05 02:27:

про понятие "съел" я вообще боюсь говорить :)
 

Popoff

popoff.donetsk.ua
с осмотрением всех вариантов
далеко не всех %)

Не оговорено, например, что между операциями "дали", "съел" и "подсчет остатка" ничего с яблоками не происходит. А ведь запросто может прийти кто-то и дать еще яблок, например, после того, как он съел два. Или отобрать их. В таком случае мы не можем сказать, какой будет остаток даже в случае, если мы знаем начальное значение.

Не оговорено так же, могут ли появиться клоны буратин. А ведь запросто может появиться несколько одинаковых, не различимых между собой буратин. Будут ли яблоки у них общие или у каждого свои? Если буратины не различимы, то яблоки могут быть только общие, поскольку даже для того, что бы дать яблоки "любому случайному" буратине, нужно этого случайного буратину каким-то образом выбрать из общей массы буратин.

Замечание насчет неопределенности операций "дали" и "съел" - это очень важное замечание. Одно дело, если это атомарные операции. Совсем другое дело, если буратино ест яблоки в несколько этапов. Например, так:
1) вытащил все яблоки из кормана. тут есть два варианта. 1) после выполнения этой операции в кормане не остается ни одного яблока и 2) если в кормане хранится записка с цифрой, которая обозначает количество яблок, то эта записка не меняется -- количество остается неизменным.
2) выбрал из них два
3) положил остаток в корман. как правило, после операции "положил" старое значение заменяется на новое.

Аналогично можно было бы определить операцию "дали".

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

Например, у буратино в кормане 10 яблок. Он хочет съесть два яблока. Он вытаскивает все яблоки из кормана. В кормане остается ноль яблок (по первому варианту операции "вытащил"). В этот момент появляется клон и тоже хочет съесть два яблока. Поскольку в кормане нет яблок, тот этот клон остается без яблок, хотя если он догадается подождать, когда первый буратино положит остаток в корман, то он сможет съесть свои два яблока.

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

Например, если у нас только один буратино, у него в кормане десять яблок, он выбирает их (согласно нашей операции в кормане отается десять), отсчитывает свои два яблока и остаток - восемь яблок - кладет обратно в корман, заменяя цифру 10 цифрой восемь. Как только появляется клон - картина резко меняется. Первый выбрал 10 яблок, и пока первый отсчитывал свои два, второй тоже выбрал 10 яблок. Первый положил в корман остаток - 8 яблок. И второй тоже положил в корман остаток - 8 яблок. В итоге в кормане осталось 8 яблок, хотя сначала было десять, два буратино съели по два яблока и при этом никакие яблоки извне не поступали.

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

Например, у буратино в кормане 10 яблок. Он хочет съесть два яблока. По нашему алгоритму он вытаскивает эти десять яблок из кормана и в кормане (по первому варианту операции "вытащил") остается ноль яблок. Тут приходит клон и тоже хочет съесть два яблока. Он видит, что в кормане ноль яблок и ест два яблока в долг. Первый буратино отсчитал свои два яблока и положил оставшиеся восемь в корман. После этого второй буратино отсчитал свои два яблока из вытащенных нуля яблок и получившийся остаток - минус два яблока - кладет в корман. В итоге в кормане минус два яблока, хотя только два буратины съели по два яблока, изначально было десять и никакие яблоки больше никуда не передавались -- яблоки исчезли в неизвестном направлении.

Допустим, в этом примере было не 10, а 1048576 яблок и буратино хотел съесть 9876 яблок. Посчитать, сколько будет 1048576-9876 несколько сложнее, чем 0-9876, поэтому первый буратино замешкался, подсчитывая остаток, и пока первый подсчитывал свой остаток, второй быстро посчитал и положил -9876 яблок в корман. После этого первый досчитал остаток и положил 1038700 в корман. В итоге количество яблок в кормане уменьшилось только на 9876, хотя в сумме двумя буратинами было съедено 9876*2=19752 яблока -- 9876 яблок взялось из ниоткуда.

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

З.Ы. И не нужно мне говорить, что обычно операция поедания яблок буратинами - это атомарная операция. Это только некоторые определенные, довольно редко встречающиеся, специально для этого предназначенные типы буратин не разбивают процесс поедания яблок на этапы.

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

Popoff

popoff.donetsk.ua
В примере, когда буратино не может есть яблоки в долг, он должен уметь ждать, когда клон положит остаток в корман. Если не ждать, то буратино останется голодным, даже если яблоки есть в достаточном количестве. Не так-то просто отличить, что в кормане ноль яблок из-за того, что эти яблоки находятся на руках у одного из клонов или из-за того, что яблок просто нет.
 

Кром

Новичок
С клонами уже явный перебор. Это что, под впечатлением от фильма "Остров"? :)
 

Popoff

popoff.donetsk.ua
Не смотрел этот фильм :)
Почему же перебор? Не перебор :) Сплошь и рядом ходят толпы одинаковых неразличимых между собой буратин. Обращаются к моему сайту и едят яблоки из одного и того же файла. И при этом так и нарвят есть яблоки одновременно сразу понескольку. Задача вполне обычная. :) Я вообще даже затруднюсь объяснить буратинам, что они должны яблоки есть по очереди - ведь для этого каждый следующий буратино должен знать, а ест ли кто-нибудь яблоки сейчас.
 

Кром

Новичок
>Я вообще даже затруднюсь объяснить буратинам, что они должны яблоки есть по очереди

Для такого случая есть в базе май-ес-кью-ел поле аутоинкремент. Оно тебе всех буратин посчитает в лучшем виде. :)
 

Popoff

popoff.donetsk.ua
ну и что мне это дает? это с точки зрения буратин они одинаковые. а с точки зрения яблок, поедаемых буратинами - все буратины разные: яблоки знают, что они находятся у этого, а не у другого буратины. очередь, в которой стоят буратины, сама по себе вносит вполне конкретные различия: этот буратино пришел первым, тот - вторым; в своих примерах именно на эти различия я и опирался. но от того, что мы знаем, кто каким пришел, задача определения того, ждать ли буратине, когда предыдущий доест яблоки и положит остаток в корман или уходить голодным, потому что в кормане нет яблок - не становится проще.

-~{}~ 18.09.05 18:02:

как сообщить второму буратине, что перед ним в очереди есть другие буратины?

-~{}~ 18.09.05 18:17:

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

-~{}~ 18.09.05 18:26:

из-за буратин-хакеров автоинкремент нам не подходит: зная один любой идентификатор (например, свой), можно легко угадать идентификаторы нескольких других буратин :)
 

camka

не самка
корман = кАрман
буратино-хакер = лже-буратино или лжератино
 

Popoff

popoff.donetsk.ua
корман = кАрман
да, спасибо :) я сомневался насчет этого слова, но поленился посмотреть в словарь :)

лжератино - это тот, который лжет. тогда буратино что делает? бурит? %) или будит? или просто будет? или, может, бубнит?
 

Sizz

Новичок
и даже если буратино яблоки съедает, они все равно остаются у него :)
 

Popoff

popoff.donetsk.ua
да, кстати, мне вчера на это указали. если нет других буратин, никто не дает и не забирает яблоки и они ниоткуда не берутся и никуда не исчезают, "съел одно яблоко" - это означает, что "в кормане уменьшится на одно яблоко", то в таком случае съеденые яблоки все равно остаются у буратины. просто они теперь не в кармане, а в желудке :)

тот, кто ест яблоки - яблотино, хакер - хакетино :)
 

camka

не самка
тарантино - буратино, который презирает объезд препятствий
 

IBSN

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

Voffka

Guest
не менее (тк мы незнаем ск их было) 3 тк буратино деревняый и не есть )
 

baev

‹°°¬•
Команда форума
тк буратино деревняый и не есть
RTFM!

...тьфу! В смысле -- изучайте первоисточники!

День тянулся и тянулся. В животе у Буратино тоже было скучновато. Он закрыл глаза и вдруг увидел жареную курицу на тарелке. Живо открыл глаза, -- курица на тарелке исчезла. Он опять закрыл глаза, -- увидел тарелку с манной кашей пополам с малиновым вареньем. Открыл глаза, -- нет тарелки с манной кашей пополам с малиновым вареньем. Тогда Буратино догадался, что ему ужасно хочется есть.
-- Вот до чего доводит баловство! -- проворчал папа Карло, поднимая с пола Буратино. Посмотрел, все ли у него цело. Посадил его на колени, вынул из кармана луковку, очистил. -- На, ешь!.. Буратино вонзил голодные зубы в луковицу и съел ее, хрустя и причмокивая.
(http://ns2.webgo.ru/Pisateli/Rus_Pisateli/Sbornik_pis/Buratino.htm)
 
Сверху