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

Вниз

Не желаете ли задачку?   Найти похожие ветки 

 
McSimm_   (2006-01-03 14:25) [0]

Есть экземпляр класса

type
 TStrangeBuffer = class
 . . .
 public
   property UserLabel: string read GetUserLabel write SetUserLabel;
   procedure ShiftLeft;
   procedure ShiftRight;
end;

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

Задача состоит в том, чтобы написать
function Calc(B: TStrangeBuffer): UnboundedInt;
способную выяснить размер буфера (количество его элементов).
Вы можете свободно использовать свойство UserLabel, беречь исходные данные не нужно. Но не забывайте, что исходные данные могут быть такими же, как и ваши.

Для упрощения задачи, чтобы не отвлекаться на сложности реализации арифметики я позволил себе небольшую фантазию относительно типа возвращаемого значения UnboundedInt (Неограниченное целое :)
Этот тип данных вы можете использовать и для локальных переменных и считать, что для него поддерживаются все арифметические операции.


 
Igorek ©   (2006-01-03 14:37) [1]

Не очень понимаю, как работает класс - его св-ва (хорошо бы примеры).
Короче, почему нельзя написать Result := Length(B.UserLabel) ?


 
McSimm_   (2006-01-03 14:44) [2]

Вкратце ключевые моменты еще раз:
TStrangeBuffer - кольцевой буфер
ShiftLeft,ShiftRight - сдвиг указателя буфера на один элемент влево/вправо
UserLabel - некоторое свойство текущего элемента буфера (чтение/запись)

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


 
umbra ©   (2006-01-03 14:47) [3]

так UserLabel каждого элемента это нечто вроде идентификатора этого элемента? какое отношение он имеет к элементу буфера? и каким может быть этот элемент?


 
Sandman29 ©   (2006-01-03 14:48) [4]

Задачка интересная, в лоб решить не получается. В связи с этим мой ответ: ошибка проектирования, в классе должен быть property ElementCount: UnboundedInt :)


 
McSimm_   (2006-01-03 14:50) [5]

например, чтобы напечатать свойства UserLabel всех элементов буфера:

while true do
begin
 Writeln(B.UserLabel);
 B.ShiftRight;
end;

Однако это будет выполнятся слишком долго, но ведь мы пока не знаем размер массива :)


 
GuAV ©   (2006-01-03 14:51) [6]

function Calc(B: TStrangeBuffer): UnboundedInt;
var
 I: UnboundedInt;
begin
 B.UserLabel := "Begin";
 Result := 0;
 repeat
   Inc(Result);
   for I := 1 to Result do
     B.ShiftRight;
   B.UserLabel := "End";
   for I := 1 to Result do
     B.ShiftLeft;
 until B.UserLabel <> "Begin";
 Assert(B.UserLabel = "End");
end;


 
McSimm_   (2006-01-03 14:51) [7]


> какое отношение он имеет к элементу буфера? и каким может
> быть этот элемент?

Отношение - каждый элемент имеет это свойство
Значения абсолютно произвольные. (строки)


 
umbra ©   (2006-01-03 14:55) [8]

предлагаю ввести своство буфера radius, так, чтобы длина буфера = PI*(r^2) :)


 
McSimm_   (2006-01-03 14:58) [9]


> GuAV ©   (03.01.06 14:51) [6]

Да, это сработает, хоть и не самым быстрым способом (правда в условии этого и не требовалось)

Быстро раскусили :)


 
GuAV ©   (2006-01-03 15:25) [10]

Если существует UnboundedIntToStr можно проверять только те значения, что инициализированы номером первого элемента.
Если существует UnboundedIntToStr и StrToUnboundedInt то можно заполнять элементы нумерами (по несколько подряд), затем проверять, изменился ли первый элемент, и если да то брать количество элементов из его лабела.
Вот только не факт, что операции со строками окажуться быстрее. А без строковых операций решение быстрее я не вижу.


 
McSimm_   (2006-01-03 15:36) [11]


> GuAV ©   (03.01.06 15:25) [10]

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


 
Sandman29 ©   (2006-01-03 15:42) [12]

function Calc(B: TStrangeBuffer): UnboundedInt;
var
I: UnboundedInt;
begin
B.UserLabel := "Begin";
while B.UserLabel = "Begin" do
begin
  // найдем следующий Begin
  Result := 0;
  repeat
    B.ShiftRight;
    inc(Result);
  until B.UserLabel = "Begin";
  // изменим его
  B.UserLabel := "End";
  // проверим, не изменился ли первый Begin
  for I := 1 to Result do
    B.ShiftLeft;
  // если изменился, то произойдет выход из цикла
end;
end;


 
Sandman29 ©   (2006-01-03 15:42) [13]

McSimm_   (03.01.06 15:36) [11]

Это я еще не читал на моемнт изменения алгоритма GuAV.


 
Sandman29 ©   (2006-01-03 15:43) [14]

Вообще, конечно, стоит заменить while на repeat, но я считаю вложенные repeat не слишком читабельными.


 
Sergey Masloff   (2006-01-03 16:17) [15]

Будем инженерами ;-) GUID присвоить лейблу и бежать по кругу. Совпадение GUID ов настолько малореальная вещь что...


 
ZeroDivide ©   (2006-01-03 16:19) [16]


> Sandman29 ©   (03.01.06 14:48) [4]
>
> Задачка интересная, в лоб решить не получается. В связи
> с этим мой ответ: ошибка проектирования, в классе должен
> быть property ElementCount: UnboundedInt :)
>


Действительно ошибка проектирования: такой класс вообще не нужен, есть TStringList.

И если надо значительно изменить его функциональность, то следовало бы начинать писать его так:
type
TStrangeBuffer = class
private
  MyElementList: TStringList;
. . .
public
  property UserLabel: string read GetUserLabel write SetUserLabel;
  procedure ShiftLeft;
  procedure ShiftRight;
end;

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

 property DefaultValues: TStringList ???


 
Sandman29 ©   (2006-01-03 16:24) [17]

Sergey Masloff   (03.01.06 16:17) [15]

Тогда уже лучше так:
S: string;
Randomize;
SetLength(S, 1000000 + Random(100000));
for I := 1 to Length(S) do
 S[I] := Chr(1 + Random(255));
B.UserLabel := S;


 
McSimm_   (2006-01-03 16:45) [18]


> Sandman29 ©   (03.01.06 15:42) [12]

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


> Sergey Masloff   (03.01.06 16:17) [15]
> Совпадение GUID ов настолько малореальная вещь что...

маловероятные вещи от невозможных отличаются только тем, что происходят намного чаще :)))


> ZeroDivide ©   (03.01.06 16:19) [16]
> такой класс вообще не нужен

"И зачем на солнце пятна, если и без них можно обойтиться" (с)


 
ZeroDivide ©   (2006-01-03 16:53) [19]

"видимо еще не все ВИЛАСИПЕДЫ изобретены" (с)


 
MBo ©   (2006-01-03 20:03) [20]

А в варианте с буденновкой и шашкой тов. Ф.Э.Дзержинского случайными числами или гуидами особо не почитеришь ;))


 
McSimm ©   (2006-01-03 20:24) [21]


> MBo ©   (03.01.06 20:03) [20]

А можно подробности?
:)


 
Igorek ©   (2006-01-03 20:34) [22]

http://www.rsdn.ru/article/mag/200301/GUIDEcology.xml


 
McSimm ©   (2006-01-03 22:12) [23]


> Igorek ©   (03.01.06 20:34) [22]

Версия текста: {5DCEB4BA-2DCC-4de3-AB06-EED88875A68F}

:)


 
MBo ©   (2006-01-04 09:42) [24]

>McSimm ©   (03.01.06 20:24) [21]
В пятничных задачах было в таком примерно варианте:
Разведчик проникает на секретный завод, из инвентаря у него имеется шашка и буденновка. Задача - выяснить, сколько предметов находится на круговом конвейере. Конвейер можно продвигать на одно место вправо или влево, на нем могут быть любые предметы, в том числе и аналогичные шашки и шапки.


 
McSimm ©   (2006-01-04 10:53) [25]

спасибо, забавный вариант :)



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

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

Наверх




Память: 0.53 MB
Время: 0.039 c
3-1133244174
gvv
2005-11-29 09:02
2006.01.29
ДБФ+АДО


10-1112846482
Demn
2005-04-07 08:01
2006.01.29
Plugin под IE


15-1136871008
begin...end
2006-01-10 08:30
2006.01.29
С Днём рождения! 10 января


1-1135167580
DVM
2005-12-21 15:19
2006.01.29
Проблема в многопоточном приложении: завершение потоков.


15-1136745588
VirEx
2006-01-08 21:39
2006.01.29
<![CDATA[<