Jump to content
pwseo

[Desafio] Escrita de sms

Recommended Posts

pwseo

Olá pessoas,

Inspirado por este desafio do Codejam vinha propor-vos um semelhante (essencialmente para os iniciados em Pascal).

O programa deverá ler input do teclado e traduzir cada linha à medida que estas forem introduzidas pelo utilizador (com limite de 160 caracteres :P ).

Quem quiser melhorar o programa poderá adicionar a possibilidade de introduzir o ponto final (1), exclamação (11), interrogação (111), e além disso uma função para trocar entre maiúsculas e minúsculas (#). Assim sendo, o programa começaria em maiúsculas mas mudaria automaticamente para minúsculas na 2ª letra da frase. Após um ponto final o programa muda para maiúscula até ao 2º caractere que não seja um espaço.

Espero que achem piada :P

Share this post


Link to post
Share on other sites
thoga31

Um desafio para inciados e enferrujados, oh @pedro-kun :P

Vou-me dedicar ao desafio nos entretantos :)


Knowledge is free!

Share this post


Link to post
Share on other sites
passarito

Não consegui perceber bem...

Introduzimos o texto que queremos e o programa devolve a sequência numérica a ser introduzida no telemóvel ou ao contrário?

É que o 1º caso ainda lá vou, se for o 2º... também se faz, mas dá muito mais trabalho por causa da pausa para a passagem à próxima letra.

Share this post


Link to post
Share on other sites
pwseo

Sim, o objectivo é que o programa devolva a sequência de teclas pressionadas para introduzir a mensagem especificada pelo utilizador, tal como mencionado no enunciado do Codejam.

Para quem quiser aventurar-se (pois o enunciado original é simples), introduzi as modificações acima referidas (maiúsculas e minúsculas, ponto, interrogação, exclamação). No entanto, mesmo isto é trivial, excepto a parte das maiúsculas e minúsculas.

Mas já agora, o 2º caso também tem a sua piada :P Se quiseres aventurar-te, força :P

Share this post


Link to post
Share on other sites
thoga31

Eu fiz a versão de simular o teclado do telemóvel - vamos clicando no 1..9 e ele vai mudando as letras. Ainda tenho falhas no sistema, principalmente nas maiúsculas. Mas a essência está lá.

O código não está comentado e ainda pode ter "restos" dos meus testes. Tem um indicador de maiúsculas (que seria útil se o sistema estivesse a 100% :D ).

Resta referir que utilizei um processo recursivo.

Vejam à vontade, acho que está uma ideia interessante para se fazer a versão final. :D

{$MODE Delphi}
PROGRAM sms;
USES crt, dos;

TYPE TKeyCounter = 1..5;
     TPosX = 1..80;
     TPosY = 1..25;
     TCursorPosition = RECORD
                       X : TPosX;
                       Y : TPosY;
     END;

VAR Option : char;
    UpperCase : boolean;
    SMSText : string[160];


CONST RedirectOptions : set of char = [#13, #27];
      PhoneKeys : set of char = ['0'..'9', '#', ' '];
      StrEmpty : string = '';
      PhoneKeyboard : array['1'..'9', 1..5] of char =
         (('.',',','!','?','1'), ('a','b','c','2',' '),
          ('d','e','f','3',' '), ('g','h','i','4',' '),
          ('j','k','l','5',' '), ('m','n','o','6',' '),
          ('p','q','r','s','7'), ('t','u','v','8',' '),
          ('w','x','y','z','9'));
      IndicatorsPosition : TCursorPosition = (X:60; Y:1);
      SMSTextPosition : TCursorPosition = (X:1; Y:6);
      Bool2Case : array[boolean] of string = ('    ', 'CAPS');


PROCEDURE ReadPhoneKey(var Key : char; Count : TKeyCounter; UpStatus : boolean; CPos : TCursorPosition);
var TimeElapsed : integer;
    TemporaryKey : char;
const MaximumTime = 1000;
      Tick = 10;

begin
     if (CPos.X-1 = 1) then UpStatus := true;
     if (CPos.X-1 >= 2) then UpStatus := UpperCase;
     TimeElapsed := 0;

     GotoXY(IndicatorsPosition.X, IndicatorsPosition.Y);
     Write(Bool2Case[upStatus]);
     GotoXY(CPos.X, CPos.Y);

     repeat
           delay(10);
           TimeElapsed := TimeElapsed + Tick;

           if KeyPressed then begin
              TemporaryKey := ReadKey;
           end;
     until (TemporaryKey in PhoneKeys) or (TimeElapsed >= MaximumTime);

     if (TimeElapsed >= MaximumTime) then begin
        ReadPhoneKey(Key, Count, UpStatus, CPos);
     end else begin
         case TemporaryKey of
              '#' : begin
                      UpStatus := not UpStatus;
                      GotoXY(IndicatorsPosition.X, IndicatorsPosition.Y);
                      Write(Bool2Case[upStatus]);
                      GotoXY(CPos.X, CPos.Y);
                      ReadPhoneKey(Key, Count, UpStatus, CPos);
                    end;
              '0' : Key := TemporaryKey;
         else begin
              if (TemporaryKey = Key) and not(char(Key) = ' ') then begin
                 CPos.X := CPos.X - 1;
                 GotoXY(CPos.X, CPos.Y);
                 if UpStatus then Write(UpCase(PhoneKeyboard[char(Key), Count]))
                             else Write(PhoneKeyboard[char(Key), Count]);

                 if (Count = 5) then Count := 1
                 else begin
                      if (Count = 4) then begin
                         if (char(Key) in ['7','9']) then inc(Count)
                         else Count := 1;
                      end else inc(Count);
                 end;
              end else begin
                  Key := TemporaryKey;
                  Count := 1;
                  if not(char(Key) = ' ') then begin
                     if UpStatus then Write(UpCase(PhoneKeyboard[char(Key), Count]))
                                 else Write(PhoneKeyboard[char(Key), Count])
                  end else Write(' ');
              end;

              CPos.X := CPos.X + 1;

              if (SMSText[length(SMSText)-2] + SMSText[length(SMSText)-1] = '. ') then
                 ReadPhoneKey(Key, Count, true, CPos)
              else ReadPhoneKey(Key, Count, UpperCase, CPos);
         end; end;
     end;
end;


BEGIN
repeat
      ClrScr;
      WriteLn('1 .,?   2 ABC   3 DEF');
      WriteLn('4 GHI   5 JKL   6 MNO');
      WriteLn('7 PQRS  8 TUV   9 WXYZ');
      WriteLn('# Up/Down Case  0 End');
      WriteLn('Introduza a sua SMS:');

      UpperCase := false;
      Option:=' ';
      SMSText := StrEmpty;
      ReadPhoneKey(Option, 1, true, SMSTextPosition);
      WriteLn; WriteLn;
      Write('FIM - ',SMSText);

      repeat
            Option := ReadKey;
      until (Option in RedirectOptions);
until (Option = #27);
END.


Knowledge is free!

Share this post


Link to post
Share on other sites
pwseo

Espera lá! Isto é muito à frente!

No entanto, o que eu tinha em mente era algo como está no enunciado do Codejam, ou seja, tu introduzes a mensagem no programa (ex.: "mensagem fixe") e ele devolve-te a sequência de teclas que deves introduzir no telemóvel.

O que tu fizeste foi simular o próprio teclado (está muito porreiro, mesmo assim)

(quando tinha visto o teu código, vi por alto, não pensei que estivesses a fazer isto. Sou distraído lool)

Share this post


Link to post
Share on other sites
thoga31

No entanto, o que eu tinha em mente era algo como está no enunciado do Codejam, ou seja, tu introduzes a mensagem no programa (ex.: "mensagem fixe") e ele devolve-te a sequência de teclas que deves introduzir no telemóvel.

Muito mais simples, então. Vai uma versão de 10 minutos? Até to embelezo com a opção de separador ou não. :D

{$MODE Delphi}
PROGRAM sms3;

VAR SMSText : String[160];

FUNCTION Text2Keys(const T : string[160]; const WithSeparator : boolean) : string;
const Char2Phone : array['A'..'Z'] of string = ('2', '22', '222', '3', '33', '333', '4', '44', '444', '5', '55', '555', '6', '66', '666', '7', '77', '777', '7777', '8', '88', '888', '9', '99', '999', '9999');
var i : integer;
    R : string;
begin
     R := '';
     for i:=1 to length(T) do begin
         if (UpCase(T[i]) in ['A'..'Z']) then begin
            if (T[i] in ['A'..'Z']) then R := R + '#';
            R := R + Char2Phone[upCase(T[i])]
         end else begin
             case T[i] of
                  '0'..'9' : R := R + '$' + T[i];
                  '.' : R := R + '1';
                  ',' : R := R + '11';
                  '!' : R := R + '111';
                  '?' : R := R + '1111';
                  ' ' : R := R + ' ';
             else R := R + '[?]';
             end;
         end;
         if WithSeparator and not(i = length(T)) then R := R + ';';
     end;
     Result := R;
end;

BEGIN
     WriteLn('Texto da SMS?');
     ReadLn(SMSText);
     WriteLn('Sequencia de tecla do telemovel:');
     WriteLn(Text2Keys(SMSText, true));
     ReadLn; // pausa
END.


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Aproveito para deixar o código no Ideone com exemplo in/out: http://ideone.com/0Hjgq :D

Input:
Mensagem de exemplo, com testes de números, 123, e de MaiUsCulAs.

Output:
#6;33;66;7777;2;4;33;6; ;3;33; ;33;99;33;6;7;555;666;11; ;222;666;6; ;8;33;7777;8;33;7777; ;3;33; ;66;[?];[?];6;33;777;666;7777;11; ;$1;$2;$3;11; ;33; ;3;33; ;#6;2;444;#88;7777;#222;88;555;#2;7777;1


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Entao, mais ninguém dá a ver os seus dotes de Pascal? Queria ver soluções diferentes (e, decerto, "mais melhores") :D


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.