pwseo Posted April 27, 2012 at 02:25 PM Report #451784 Posted April 27, 2012 at 02:25 PM 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 😛 ). 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 😛
thoga31 Posted April 27, 2012 at 04:23 PM Report #451803 Posted April 27, 2012 at 04:23 PM Um desafio para inciados e enferrujados, oh @pedro-kun 😛 Vou-me dedicar ao desafio nos entretantos 🙂 Knowledge is free!
passarito Posted April 28, 2012 at 08:52 AM Report #451888 Posted April 28, 2012 at 08:52 AM 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.
pwseo Posted April 28, 2012 at 10:52 AM Author Report #451896 Posted April 28, 2012 at 10:52 AM 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 😛 Se quiseres aventurar-te, força 😛
thoga31 Posted April 28, 2012 at 10:16 PM Report #451976 Posted April 28, 2012 at 10:16 PM 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% 😄 ). Resta referir que utilizei um processo recursivo. Vejam à vontade, acho que está uma ideia interessante para se fazer a versão final. 😄 {$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!
pwseo Posted April 28, 2012 at 11:56 PM Author Report #451998 Posted April 28, 2012 at 11:56 PM 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)
thoga31 Posted April 29, 2012 at 03:54 PM Report #452051 Posted April 29, 2012 at 03:54 PM 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. 😄 {$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!
thoga31 Posted April 29, 2012 at 04:11 PM Report #452055 Posted April 29, 2012 at 04:11 PM Aproveito para deixar o código no Ideone com exemplo in/out: http://ideone.com/0Hjgq 😄 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!
thoga31 Posted April 29, 2012 at 09:30 PM Report #452136 Posted April 29, 2012 at 09:30 PM Entao, mais ninguém dá a ver os seus dotes de Pascal? Queria ver soluções diferentes (e, decerto, "mais melhores") 😄 Knowledge is free!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now