Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > АБРАКАДАБРА


Автор: Aleche 9.12.2004, 19:57
Привет,ребята!!!! Есть очень интересная задача! Есть какие-нибудь версии решения?
ЗАДАЧА:
Последовательность из латинских букв строитсся следующим образом.На первом шаге она пуста.На каждом последующем шаге она удваивается,после чего к ней слева дописывается очередная буква латинского алфавита .Пример построения:

Пстая последовательность:
ШАГ 1 a
ШАГ2 baa
ШАГ3 cbaabaa
...................
Задача сотоит в том ,чтобы по заданному числу n определить символ ,который стоит на n-ом месте в послндовательности,получившейся после 26 шага!!!!!!!!!!!!!!!!!!!!!!!!!(ПРОСЬБА ОПИСАТЬ ПРОДЕЛАННЫЕ ВАМИ ОПЕРАЦИИ)

Автор: Pakshin A. S. 9.12.2004, 20:21
Что-то очень знакомо... smile
Я же писал... не работает что ли... smile

Автор: Akina 9.12.2004, 20:26
Гораздо проще создавать алгоритм, если считать не от начала, а от конца строки... все становится совершенно тривиально... N(i)=2*N(i-1)

Автор: Aleche 10.12.2004, 20:41
НЕ РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Автор: Pakshin A. S. 10.12.2004, 20:43
Я так и думал, если про моё... smile

Автор: Elfin 13.12.2004, 00:16
а в чем собсна проблема?
Код

program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var str: string; n: integer; c: char;

begin
str:='';
for C:='a' to 'z' do
str:=c+str+str;; //в конце цикла мы найдем результат 26-го шага
readln(n);
writeln(str[n]); //выведем н-ный символ строки
readln;
 { TODO -oUser -cConsole Main : Insert code here }
end.

Автор: Pakshin A. S. 13.12.2004, 13:12
Ага... они строки не проходили... smile Так все могут!
Добавлено @ 13:13
А 255 символов хватит? Т. к. паскаль... smile

Автор: Pakshin A. S. 13.12.2004, 15:51
Вот, пример решения (не тестил, не оптимизировал):
Код

const
dv: array [1..15] of char = ('d','c','b','a','a','b','a','a','c','b','a','a','b','a','a');
nm=37;

type
TM = array [1..nm] of char;
TTp = (t_dv, t_mas);

procedure Create(tp: TTp; c: Char; var l: integer; var m: TM);
var
i,j:integer;
begin
l:=0;
j:=1;
if tp = t_mas
 then
  for i:=ord(c) downto ord('e') do
   begin
    m[j]:=chr(i);
    inc(j);
   end;
for i:=j to j+15 do
 m[i]:=dv[i-j+1];
l:=j-1;
end;

var
m:Tm;
l:integer;
n:integer;
c:char;
b:boolean;
begin
readln(n);
if n = 1
 then
  begin
   writeln('z');
   readln;
  end
 else
  begin
   n:=n-1;
   Create(t_mas, 'y', l, m);
   b:=l >= n;
   if b
    then
     begin
      writeln(m[n]);
      readln;
      Exit;
     end
    else
     n:=n - l;
   for c:='e' to 'y' do
    begin
     Create(t_dv, 'a', l, m);
     b:=l >= n;
     if b
      then
       begin
        writeln(m[n]);
        readln;
        exit;
       end
      else
       n:=n - l;
     Create(t_mas, c, l, m);
     b:=l >= n;
     if b
      then
       begin
        writeln(m[n]);
        readln;
        exit;
       end
      else
       n:=n-l;
    end;
   for c:='x' downto 'e' do
    begin
     Create(t_dv, 'a', l, m);
     b:=l >= n;
     if b
      then
       begin
        writeln(m[n]);
        readln;
        exit;
       end
      else
       n:=n - l;
     Create(t_mas, c, l, m);
     b:=l >= n;
     if b
      then
       begin
        writeln(m[n]);
        readln;
        exit;
       end
      else
       n:=n-l;
    end;
  end;
end.

Автор: Aleche 18.12.2004, 18:46
Привет!!!!!!!!!!! Жаль, что ты,Pakshin A.S. ,не тестил программу!!!!Решение,наверное, интересное,но что-то длинное.
А Я НАКОНЕЦ-ТО ПРИДУМАЛА РЕШЕНИЕ . РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!
ВОТ ПРОГРАММА:
program symbol;
const
maxn=26;
var
a:array[1..maxn]of longint;
k,n:longint;
begin
readln(n);
a[1]:=1;
for i:=1 to maxn-1 do
begin
a[i+1]:=1+2*a[i];
writeln(a[i]);
end;
writeln(a[maxn]);
for k:=26 downto1 do{цикл для посл-ти}
begin
if n=1 then write(chr('a')+k-1);break end
else begin
if n>a[k-1]+1 then n:=n-1-a[k-1] else n:=n-1;
end;
end;
end.

Автор: Pakshin A. S. 18.12.2004, 19:29
Ни фига себе!!! Сама придумала?! smile
Добавлено @ 19:32
М
 
Гы-гы... выложи нормальный вариант, а то в этом куча ошибок!!!
+ Пользуйся тегами [code=delphi][/code]

Добавлено @ 19:37
Вот... подправил...
Код

const
maxn=26;
var
 a:array[1..maxn]of longint;
 k,n:longint;
 i:integer;
begin
 readln(n);
 a[1]:=1;
 for i:=1 to maxn-1 do
   a[i+1]:=1+2*a[i];
 for k:=26 downto 1 do
  begin
   if n=1
    then
     begin
      write(chr(ord('a') + k - 1));
      break
    end
   else
    if n>a[k-1]+1
     then
      n:=n-1-a[k-1]
     else n:=n-1;
  end;
end.


Поясни алгоритм... smile

Автор: Aleche 19.12.2004, 17:15
НУ ,ВО-ПЕРВЫХ, ПРИВЕТ ,С УВАЖЕНИЕМ , Пакшин Андрей Сергеевич!!!!!!!!!!!!! ВО-ВТОРЫХ,ПРОГРАММА РАБОТАЕТ И ОШИБОК НЕТ,СТРАННО,КАК ТЫ МОГ НЕ ЗАМЕТИТЬ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Кстати,нехорошо заниматься плагиатством!!!!!!!Ну да ладно,алгоритм следующий:
1) сначала генирирую длину последовательности на каждом шаге;
2)начиная с последнего шага,проверяю является-ли введенный номер пользователем 1,если да,то выведется нужная буква алфавита,если нет,то продолжаю поиск следующим образом:n:=(n-1)moda[k-1]<=>n:=n-1-a[k-1]+1;т.к .,если ты заметил посл-ть симметрична ,исключая n=1. ; smile

Автор: Pakshin A. S. 19.12.2004, 21:10
Ни фига себе! Сама додумалась!!! Поздравляю... зауважал... smile
P. S. Я плагиатством не занимаюсь, а просто подправляю код, выложенный на форуме...

Автор: mvdr 3.2.2005, 03:49
Код

var mas=array[a,b,c,...,x] of string;
    mas1=array[el1,el2,...el27] of string;
    i,n:integer;
    simbol,stroka:string;
begin
mas1[1]:='';
for i:=1 to 26 do
mas1[i+1]:= mas[i] + mas1[i];
stroka:=mas[27];
simbol:=copy(stroka,n,1);
end;

Автор: Pakshin A. S. 3.2.2005, 11:00
Этот код понятный, но они еще не проходили строковый тип, поэтому она не мога его использовать... smile

Автор: Marriage 3.2.2005, 13:22
ОЛимпиада ???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)