A edição 312 do Weekly Challenge com Perl chegou, trazendo desafios de programação que combinam lógica e criatividade. Prepare-se para testar suas habilidades com problemas que vão desde a otimização do tempo em uma máquina de escrever circular até a análise da distribuição de bolas coloridas em caixas. Se você gosta de desafios, continue lendo para descobrir como resolver essas tarefas de forma eficiente e elegante.
## Desafio de Programação: Edição 312 do Weekly Challenge com Perl
O Weekly Challenge está de volta com a edição 312, inspirada no código de área 312 de Chicago. Deixe-se envolver na resolução de problemas de programação que exigem tanto raciocínio lógico quanto conhecimento em Perl. Vamos explorar os desafios propostos e as soluções criativas apresentadas.
## Tarefa 1: Tempo Mínimo
O primeiro desafio propõe a seguinte situação: imagine uma máquina de escrever com as letras de ‘a’ a ‘z’ dispostas em círculo. Digitar uma letra leva 1 segundo, e mover o ponteiro para a próxima letra também leva 1 segundo, seja no sentido horário ou anti-horário. O objetivo é descobrir o tempo mínimo necessário para digitar uma determinada palavra, começando sempre com o ponteiro na letra ‘a’.
Para resolver este problema, é preciso considerar que o tempo total será a soma do tempo gasto para digitar cada letra (que é igual ao número de letras na palavra) e o tempo gasto para mover o ponteiro entre as letras. A chave está em calcular a menor distância entre as letras no círculo, utilizando aritmética modular para garantir que o movimento seja sempre o mais eficiente possível.
A solução em Perl apresentada envolve transformar a string em uma lista de posições das letras, calcular as diferenças entre essas posições e somar as menores distâncias para obter o tempo total. Sem usar loops ou variáveis de índice, o código se torna conciso e menos propenso a erros.
### O Plano
Cada letra digitada consome um segundo, então o tempo mínimo será sempre o tamanho da string. A este valor, adicionamos o tempo para mover de uma letra à outra, começando com o dedo sobre a letra ‘a’. Mover-se ao redor do círculo envolve aritmética modular, e é crucial verificar ambas as direções para escolher o caminho mais curto.
### O Código
A solução em Perl envolve:
* Transformar a string em uma lista de caracteres.
* Converter os caracteres em índices entre 0 e 25.
* Inserir 0 no início da lista para representar a posição inicial do dedo sobre a letra ‘a’.
* Utilizar a função slide do módulo List::MoreUtils para calcular as diferenças entre as posições dos caracteres.
“`perl
sub minTime($str) {
# Lista de posições do ponteiro, começando em A
my @ptr = (0, map { ord($_) – ord(“a”) } split(//, $str));
# Array das menores diferenças entre as posições
my @d = slide { min(($a – $b) % 26, ($b – $a) % 26) } @ptr;
# Um segundo por caractere na string, mais o tempo para mover
my $t = length($str) + sum0(@d);
return $t;
}
“`
## Tarefa 2: Bolas e Caixas
O segundo desafio envolve bolas de três cores diferentes (vermelho, azul e verde) distribuídas em 10 caixas numeradas de 0 a 9. O objetivo é determinar quantas caixas contêm bolas de todas as três cores.
Para resolver este problema, é necessário analisar uma string que descreve a localização de cada bola e criar uma representação das bolas em cada caixa. Uma abordagem possível é usar um array de 10 strings, onde cada string representa o conteúdo de uma caixa. Outra opção é usar um array de tabelas de consulta (hash), onde cada caixa possui um hash que conta o número de bolas de cada cor.
Após categorizar as bolas por caixa, é possível verificar quantas caixas contêm pelo menos uma bola de cada cor. Isso pode ser feito usando expressões regulares ou funções de índice para verificar a presença das cores em cada caixa.
### O Plano
Precisamos dividir a string de entrada e criar uma representação das bolas nas caixas. Podemos fazer isso de duas maneiras:
1. Um array de 10 strings, uma para cada caixa, onde as letras G, B ou R da entrada são adicionadas à sua respectiva caixa.
2. Um array de 10 tabelas de consulta (hash), onde cada caixa tem um pequeno hash que conta o número de bolas G, B ou R.
Com as bolas categorizadas por caixa, verificamos quantas caixas contêm pelo menos uma de cada cor (G, B e R). Em uma string, isso pode ser feito com uma expressão regular ou uma função index simples. No hash, procuraríamos por contagens maiores que zero.
### O Código com Expressões Regulares
A solução com expressões regulares envolve inicializar um array de 10 caixas vazias e, em seguida, percorrer a string de entrada, distribuindo as bolas em suas respectivas caixas. Finalmente, utiliza-se a função grep com uma expressão regular para contar as caixas que contêm todas as três cores.
“`perl
sub ballBox($str) {
my @box = (“”) x 10;
for my ($color, $b) (split(//, $str)) {
$box[$b] .= $color;
}
return scalar grep { /B/ && /G/ && /R/ } @box;
}
“`
### O Código sem Expressões Regulares
Alternativamente, podemos resolver o problema sem usar expressões regulares, utilizando a função index para verificar a presença de cada cor em cada caixa.
“`perl
sub ballBox_idx($str) {
my @box = (“”) x 10;
for my ($color, $b) (split(//, $str)) {
$box[$b] .= $color;
}
return scalar grep { index($_, “G”) >= 0 && index($_, “B”) >= 0 && index($_, “R”) >= 0 } @box;
}
“`
### O Código com um Hash
Uma terceira abordagem é utilizar um hash para contar as ocorrências de cada cor em cada caixa. Isso pode ser feito da seguinte forma:
“`perl
sub ballBox_hash($str) {
my @box;
for my ($color, $b) (split(//, $str)) {
$box[$b]{$color}++;
}
return scalar grep { $_->{G} && $_->{B} && $_->{R} } @box;
}
“`
## Análise de Desempenho
Para comparar o desempenho das diferentes abordagens, foi criado um teste de benchmark que gera uma string aleatória e executa 50.000 iterações de cada variação.
Os resultados mostraram que o uso de funções de string simples (sem expressões regulares) é ligeiramente mais rápido do que o uso de tabelas de hash e expressões regulares, pelo menos para dados distribuídos aleatoriamente com um número moderado de bolas.
É importante notar que o desempenho pode variar dependendo da distribuição dos dados, como caixas quase vazias ou um grande número de bolas de uma única cor. Portanto, é recomendável realizar testes adicionais com diferentes distribuições de dados para otimizar a solução para um caso de uso específico.
Para quem busca otimizar ainda mais o dia a dia, vale a pena conhecer como diferentes tipos de IA podem revolucionar o dia a dia da sua agência.
Este conteúdo foi auxiliado por Inteligência Artificiado, mas escrito e revisado por um humano.