Текущий архив: 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.51 MB
Время: 0.024 c