Текущий архив: 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