Cifra de César [RESOLVIDO]

13. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 10/05/2023 - 05:10h

Boa noite!
Após algumas matutadas cheguei no intuito. Segue o código:

x=$({
str=$(echo {a..z})
echo ${str// /}
}) # definir alfabeto {a..z} sem espaço
tr "a-zA-Z" "$(echo ${x:$1:26}${x:0:$1})" <<<${2} # substituir o input como "2" para o final do alfabeto, trocando as ocorrencias da esquerda pra direito


  


14. Re: Cifra de César [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/05/2023 - 21:53h


dilan1998 escreveu:

Boa noite!
Após algumas matutadas cheguei no intuito. Segue o código:

x=$({
str=$(echo {a..z})
echo ${str// /}
}) # definir alfabeto {a..z} sem espaço
tr "a-zA-Z" "$(echo ${x:$1:26}${x:0:$1})" <<<${2} # substituir o input como "2" para o final do alfabeto, trocando as ocorrencias da esquerda pra direito

Boa noite Dilan.
Seguem dicas:
1 - Para "Montar" o alfabeto sem espaços,
faça:
ln=$(printf '%s' {a..z})
--------------------------------------------------------------
2 - Para "Deslocar" o alfabeto,
Use:
d=3;
Onde:
N é o contador Normal
Ltr alfabeto deslocado
Nd 'contador' deslocado
for ((n=0;n<26;n++)) { nd=$(( (n+$d)%26 )); printf "N:%02d Ltr:%s Nd:%02d\n" $n ${ln:$nd:1} $nd;}  

N:00 Ltr:d Nd:03
N:01 Ltr:e Nd:04
N:02 Ltr:f Nd:05
N:03 Ltr:g Nd:06
N:04 Ltr:h Nd:07
N:05 Ltr:i Nd:08
N:06 Ltr:j Nd:09
N:07 Ltr:k Nd:10
N:08 Ltr:l Nd:11
N:09 Ltr:m Nd:12
N:10 Ltr:n Nd:13
N:11 Ltr:o Nd:14
N:12 Ltr:p Nd:15
N:13 Ltr:q Nd:16
N:14 Ltr:r Nd:17
N:15 Ltr:s Nd:18
N:16 Ltr:t Nd:19
N:17 Ltr:u Nd:20
N:18 Ltr:v Nd:21
N:19 Ltr:w Nd:22
N:20 Ltr:x Nd:23
N:21 Ltr:y Nd:24
N:22 Ltr:z Nd:25
N:23 Ltr:a Nd:00
N:24 Ltr:b Nd:01
N:25 Ltr:c Nd:02

Alfabeto deslocado:
ld=$(for ((n=0;n<26;n++)) { nd=$(( (n+$d)%26 )); printf "%s" ${ln:$nd:1};}) 

---------------------------------------------------------------------------------------------------------------
./cifra_03.sh 3 C "#Fica_a_Dica"
---------------
#Ilfd_d_Glfd
---------------
Recomendação:
https://aurelio.net/shell/canivete/
---------------------------------------------------------------------------------------------------------------
______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



15. Re: Cifra de César

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/05/2023 - 02:35h

Você também pode invocar o meu script a partir de redirecionamento de linha de comando.
caesar <<<"Viva o Linux" 


Sobre a medição dos tempos, considere o seguinte:

    • Uma máquina ocupada (por exemplo: com ambiente gráfico aberto, incluindo um navegador web exibindo coisas que gastam muita CPU, tal como a página do Viva o Linux, infelizmente) pode acabar perdendo tempo com outras coisas além do que você está medindo e afetar sua medição.

    • O mesmo vale para outras coisas (por exemplo: crond executando tarefas, dumps do cache de disco, realização de back-ups, verificação da superfície dos discos ou estado de RAID, outros programas em background etc.).

    • Para minimizar o impacto de fatores externos, pode ser conveniente aumentar o número de rodadas. Por exemplo, em vez de apenas 100, considere algo como 10000, ou maior ainda que isso.

    • Cuidado para não medir a própria medição. Quando você faz algo como “time for (( ... )); do comando_externo < arquivo; done”, especialmente para um comando externo de curta duração, boa parte do esforço vai estar no trabalho do próprio shell que, para cada iteração do laço de repetição criado pelo comando for, tem de criar um redirecionamento a partir de um arquivo, criar processo novo (fork()), executar o comando externo (execve()) e depois liberar recursos quando o comando externo acabar de executar. Essa situação pode ser um pouco difícil de contornar quando você usa somente o shell, porque ele não tem uma instrumentação muito boa para esse tipo de medição, e mesmo que você use dados obtidos a partir do diretório /proc do Linux, tais informações não dão uma resolução muito boa.


Eu acabei me empolgando aqui com essa questão e fiz cinco versões do programa cifrador, a fim de comparar desempenho usando interpretadores com recursos diferentes: uma para bash e que também funciona sem modificações no ksh93 e no zsh, uma para o velho sh (ou quase), uma para Perl, uma para Python e uma em C. Fiz também quatro versões de um programa para medir o desempenho dos cifradores, sendo uma para bash, uma para ksh, uma para zsh e uma em C.

Os resultados me surpreenderam um pouco. Eu sabia que os programas em C teriam um overhead menor e, no caso do programa medidor, muito melhor resolução de medida, mas fiquei um consideravelmente decepcionado com o desempenho do Perl em relação aos shells, já que ele implementa nativamente uma função equivalente ao comando tr, que os shells acabam todos tendo de invocar como programa externo, e muito decepcionado com o Python, que, apesar de não ter de invocar nenhum comando externo, perdeu feio até para o sh velho de guerra, que tem de invocar comandos externos até para fazer operações aritméticas e testes lógicos. Também me surpreenderam a inconsistência interna e incompatibilidades gratuitas entre o zsh e os outros shells. Entre os shells, o ksh foi o vencedor inconteste, tanto em desempenho quanto com relação a recursos oferecidos (pelo menos para os testes em questão, não necessariamente para outros usos). É uma pena que ele não seja tão conhecido e divulgado quanto o bash ou o zsh.

Caso tenham interesse, avisem-me, que eu posso postar aqui os programas, os resultados, e algumas análises.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


16. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 24/05/2023 - 02:30h


Bah galera obrigado pelos retornos, acabei sendo vítima do visual e não vi a pagina dois, agradecido e entendido.


17. Re: Cifra de César [RESOLVIDO]

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 24/05/2023 - 02:32h


msoliver escreveu:


dilan1998 escreveu:

Boa noite!
Após algumas matutadas cheguei no intuito. Segue o código:

x=$({
str=$(echo {a..z})
echo ${str// /}
}) # definir alfabeto {a..z} sem espaço
tr "a-zA-Z" "$(echo ${x:$1:26}${x:0:$1})" <<<${2} # substituir o input como "2" para o final do alfabeto, trocando as ocorrencias da esquerda pra direito

Boa noite Dilan.
Seguem dicas:
1 - Para "Montar" o alfabeto sem espaços,
faça:
ln=$(printf '%s' {a..z})
--------------------------------------------------------------
2 - Para "Deslocar" o alfabeto,
Use:
d=3;
Onde:
N é o contador Normal
Ltr alfabeto deslocado
Nd 'contador' deslocado
for ((n=0;n<26;n++)) { nd=$(( (n+$d)%26 )); printf "N:%02d Ltr:%s Nd:%02d\n" $n ${ln:$nd:1} $nd;}  

N:00 Ltr:d Nd:03
N:01 Ltr:e Nd:04
N:02 Ltr:f Nd:05
N:03 Ltr:g Nd:06
N:04 Ltr:h Nd:07
N:05 Ltr:i Nd:08
N:06 Ltr:j Nd:09
N:07 Ltr:k Nd:10
N:08 Ltr:l Nd:11
N:09 Ltr:m Nd:12
N:10 Ltr:n Nd:13
N:11 Ltr:o Nd:14
N:12 Ltr:p Nd:15
N:13 Ltr:q Nd:16
N:14 Ltr:r Nd:17
N:15 Ltr:s Nd:18
N:16 Ltr:t Nd:19
N:17 Ltr:u Nd:20
N:18 Ltr:v Nd:21
N:19 Ltr:w Nd:22
N:20 Ltr:x Nd:23
N:21 Ltr:y Nd:24
N:22 Ltr:z Nd:25
N:23 Ltr:a Nd:00
N:24 Ltr:b Nd:01
N:25 Ltr:c Nd:02

Alfabeto deslocado:
ld=$(for ((n=0;n<26;n++)) { nd=$(( (n+$d)%26 )); printf "%s" ${ln:$nd:1};}) 

---------------------------------------------------------------------------------------------------------------
./cifra_03.sh 3 C "#Fica_a_Dica"
---------------
#Ilfd_d_Glfd
---------------
Recomendação:
https://aurelio.net/shell/canivete/
---------------------------------------------------------------------------------------------------------------
______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________






01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts