Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.447 c
2-1136744151
Opred
2006-01-08 21:15
2006.01.29
Множества


2-1137248183
M_Alex
2006-01-14 17:16
2006.01.29
массив


15-1136414909
Uncle Archi
2006-01-05 01:48
2006.01.29
Тахометр


2-1136978003
Алексей Петухов
2006-01-11 14:13
2006.01.29
OLE automation


5-1123825304
DimaBr
2005-08-12 09:41
2006.01.29
Время ожидания в дизайнере





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский