Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Задачка.   Найти похожие ветки 

 
int64   (2008-07-18 11:22) [0]

Дана структура – типа двунаправленный список. Все, что мы можем делать над ней, перемещать в порядке очереди (по одному) элементы из начала в конец и обратно. Еще мы можем читать / менять элементы только на «концах» списка.  

Подсчитать к-во элементов в списке, используя только переменные:
Buf: Extended; // тип элемента
Result: Integer;
Структура после подсчета должна остаться в первоначальном виде.


 
oldman ©   (2008-07-18 11:29) [1]

совпадающие элементы встречаются?


 
int64   (2008-07-18 11:31) [2]

Любые элементы встречаются, хоть все одинаковые.


 
jack128_   (2008-07-18 11:42) [3]

Может я чего то не понял, но вроде элементарно.

Result := 0;
// Считаем кол-во элементов от текущего положения до конца списка.
while not List.EOF do
begin
 Inc(Result);
 List := List.GetNext;
end;
Buf := Result; // запоминаем результат
// Возвращаемся на исходную позицию
while Result > 0 do
begin
 List := List.GetPred;
 Dec(Result);
end;
Result := Round(Buf); // востонавливаем результат
// Ну и считаем кол-во элеиментов до начала списка..
List := List.GetPred;
while not List.BOF do
begin
 List := List.GetPred;
 Inc(Result);
end;


 
TUser ©   (2008-07-18 11:45) [4]

> jack128_   (18.07.08 11:42) [3]

Ходить по списку нельзя. Доступен только конец и начало.


 
Simpson ©   (2008-07-18 11:45) [5]

oldman ©   (18.07.08 11:29) [1]
А какая разница?
Pred Next есть по ним и двигаться.


 
oldman ©   (2008-07-18 11:47) [6]


> Simpson ©   (18.07.08 11:45) [5]
> oldman ©   (18.07.08 11:29) [1]
> А какая разница?


если совпадающих нет - вертеть по кругу, пока не вернется в исходное, считая количество перестановок.


 
int64   (2008-07-18 11:52) [7]

jack128_   (18.07.08 11:42) [3]
Simpson ©   (18.07.08 11:45) [5]

Нет не поняли.
Вот набросал интерфейс, только через который можно работать со списком:

IQueue = interface(IInterface)
   function GetStart: Extended;
   function GetFinish: Extended;
   procedure SetStart(const Value: Extended);
   procedure SetFinish(const Value: Extended);

   // Переместить по очереди с начала в конец ACount елементов
   procedure MoveFromStart(const ACount: Integer);

  // Переместить по очереди с конца в начало ACount елементов
   procedure MoveFromFinish(const ACount: Integer);

  // Доступ к начальному элементу списка
   property Start: Extended read GetStart write SetStart;

  // Доступ к конечному элементу списка
   property Finish: Extended read GetFinish write SetFinish;
 end;

Напишите функцию:

function Count(Queue: IQueue): Integer;
var
 Buf: Extended;
begin
...
end;


 
Zeqfreed ©   (2008-07-18 12:02) [8]

Что значит "Переместить по очереди с начала в конец ACount елементов"? Циклический сдвиг?


 
Simpson ©   (2008-07-18 12:03) [9]

IQueue = interface(IInterface)
  prev,next:IQueue; // А чего то такого тут быть не может?
  function GetStart: Extended;
  function GetFinish: Extended;
  procedure SetStart(const Value: Extended);
  procedure SetFinish(const Value: Extended);

  // Переместить по очереди с начала в конец ACount елементов
  procedure MoveFromStart(const ACount: Integer);

 // Переместить по очереди с конца в начало ACount елементов
  procedure MoveFromFinish(const ACount: Integer);

 // Доступ к начальному элементу списка
  property Start: Extended read GetStart write SetStart;

 // Доступ к конечному элементу списка
  property Finish: Extended read GetFinish write SetFinish;
end;


 
Zeqfreed ©   (2008-07-18 12:03) [10]

> Подсчитать к-во элементов в списке, используя только переменные:
>
> Buf: Extended; // тип элемента
> Result: Integer;

Вообще больше ничего нельзя использовать? Счетчики циклов / буфера / етц?


 
int64   (2008-07-18 12:06) [11]


> Zeqfreed ©   (18.07.08 12:02) [8]
> Что значит "Переместить по очереди с начала в конец ACount
> елементов"? Циклический сдвиг?

Именно.

Simpson ©   (18.07.08 12:03) [9]

Потому что задача на сообразительнось, смекалку и все такое.


 
pasha_golub ©   (2008-07-18 12:06) [12]

Хрень какая-то. Или планировщик в хламину пьян, либо нам чего-то не договаривают. :)


 
int64   (2008-07-18 12:07) [13]

Zeqfreed ©   (18.07.08 12:03) [10]

Условий достаточно. )


 
pasha_golub ©   (2008-07-18 12:07) [14]


> int64   (18.07.08 12:06) [11]
>
>


> Потому что задача на сообразительнось, смекалку и все такое.

А... Ну я считаю, что любая задача должна иметь под собой предметную основу. Есть у данной задачи таковая?


 
Simpson ©   (2008-07-18 12:08) [15]

int64   (18.07.08 12:06) [11]
Так бы и сказал: -"Не надо быстро и качественно, надо чтобы вы устали!".


 
int64   (2008-07-18 12:11) [16]

pasha_golub ©   (18.07.08 12:07) [14]

Нет. Простая пятничная задача.


 
han_malign ©   (2008-07-18 12:12) [17]


>    // Переместить по очереди с начала в конец ACount елементов
>    procedure MoveFromStart(const ACount: Integer);
>
>   // Переместить по очереди с конца в начало ACount елементов
>    procedure MoveFromFinish(const ACount: Integer);
>

- я правильно понимаю, что это перемещение указателя головы кольцевого списка(Уроборос) на ACount элементов вперед/назад?
Таки - "(по одному)" или ACount?


 
TUser ©   (2008-07-18 12:15) [18]

Каковы ограничения на память?


 
int64   (2008-07-18 12:16) [19]

han_malign ©   (18.07.08 12:12) [17]
ACount раз по одному элементу вперед/назад.


 
TUser ©   (2008-07-18 12:16) [20]

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


 
Zeqfreed ©   (2008-07-18 12:17) [21]

const UNIQUE = -1

function Count(Queue: IQueue): Integer;
var
Buf: Extended;
begin
  Result := 0;

  with Queue do begin
     try
          Buf := Start;
          Start := UNIQUE;
     except on ValueError do Exit

     MoveFromStart(1);
     Result := 1;

     while Start <> UNIQUE do begin
          MoveFromStart(1);          
          Inc(Result);
     end;

     Start := Buf;
  end;
end;


Видимо как-то так имеется в виду?


 
int64   (2008-07-18 12:22) [22]

TUser ©   (18.07.08 12:15) [18]

Да, конечно. То что Count: Integer, к условию не относится. Счтитаем, что ко-во элементов может перевалить за Integer. Т. е. ограничений нет.
Так что, можете поменять везде Integer на Int1024. :)


 
int64   (2008-07-18 12:24) [23]

TUser ©   (18.07.08 12:16) [20]

> В смысле, можно ли завести другую структуру такого же типа,
>  и перекидать элементы в нее?

Нельзя.

Zeqfreed ©   (18.07.08 12:17) [21]

А если все элементы "-1"?


 
Zeqfreed ©   (2008-07-18 12:36) [24]

> int64   (18.07.08 12:24) [23]

Для нахождения уникального значения нужна еще одна переменная вроде. Я совсем не в том направлении или это просто придирки? :)


 
int64   (2008-07-18 12:45) [25]

Zeqfreed ©   (18.07.08 12:36) [24]
Все начинают с мыслей маркировать уникальное значение. Но не знают как.
Так, что направление не то.
Хотя похоже.


 
Zeqfreed ©   (2008-07-18 13:00) [26]

В общем надо будет еще подумать будет. На GCJ было интереснее :)


 
han_malign ©   (2008-07-18 13:30) [27]


> ACount раз по одному элементу вперед/назад

- дык, учитывая что единственый счетчик Result
1. MoveFrom...(Result...)
или все таки
2. while( Result... ) do begin MoveFrom...(1); Result:= Result...; end;


 
int64   (2008-07-18 13:41) [28]

han_malign ©   (18.07.08 13:30) [27]

> > ACount раз по одному элементу вперед/назад
>
> - дык, учитывая что единственый счетчик Result
> 1. MoveFrom...(Result...)
> или все таки
> 2. while( Result... ) do begin MoveFrom...(1); Result:=
> Result...; end;

Эффект одинаковый. Только, в первом случае Result не изменится.


 
too_lamer   (2008-07-18 14:34) [29]


> int64   (18.07.08 11:22)  

задачка имеет решение для любых данных?


 
int64   (2008-07-18 15:00) [30]

too_lamer   (18.07.08 14:34) [29]
Что значит: "для любых данных"?
Если думаете хранить в буфере два значания, не получится.


 
clickmaker ©   (2008-07-18 15:11) [31]

а что будет, если я попытаюсь переместить элементов больше, чем в списке?


 
Zeqfreed ©   (2008-07-18 15:16) [32]

Если не маркировать элементы, то задача решения не имеет. Потому что для пользователя списка с таким интерфейсом списки [0, 0] и [0, 0, 0, 0] будут неотличимы. В какую сторону на сколько не сдвигай и конец и начало будут нулями.


 
McSimm ©   (2008-07-18 15:19) [33]

Что-то вроде - двигать маркируя по какому-то своему правилу, встретив похожее на свое - вернуться назад, отмаркировать еще раз и проверить, вернувшись вперед.

Проще не вижу


 
clickmaker ©   (2008-07-18 15:19) [34]

единственный вариант - сразу зарядить перенос максимального Extended, и в цикле, пока не перестанет валиться с экцепшеном, уменьшать счетчик -)


 
clickmaker ©   (2008-07-18 15:20) [35]

> перенос максимального Extended

то есть максимального ACount


 
McSimm ©   (2008-07-18 15:21) [36]

Вернее так.
Отмаркировать условное начало, двигаться вперед, встретив свою маркировку - вернуться и снять ее, пройти опять вперед, проверить. Если не то - повторять


 
int64   (2008-07-18 15:27) [37]

clickmaker ©   (18.07.08 15:11) [31]
> а что будет, если я попытаюсь переместить элементов больше,
>  чем в списке?

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


 
int64   (2008-07-18 15:31) [38]

McSimm ©   (18.07.08 15:21) [36]

Правильно!!!

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


 
Zeqfreed ©   (2008-07-18 15:35) [39]

Про мухобойку интереснее решать было :)



Страницы: 1 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.015 c
2-1217061684
ванъка
2008-07-26 12:41
2008.09.07
Скорость чтения и обработки из файла


2-1217251593
alex-drob
2008-07-28 17:26
2008.09.07
Выборка из таблицы по дате


2-1217182944
lavgirls
2008-07-27 22:22
2008.09.07
почему в консольном приложении русские буквы выводятся абракадабр


9-1173525818
Домик
2007-03-10 14:23
2008.09.07
Как узнать кол-во занятой видеопамяти?


15-1215946990
Ega23
2008-07-13 15:03
2008.09.07
Первый DMP успешно завершён.