Prova PHP Core

Descrição


Cada vez mais os processos seletivos estão utilizando resolução de problemas para analisar o nível de compreensão dos conceitos de programação. Para simular esse processo será exigido a entrega de no mínimo três dos algoritmos descritos a seguir.

Detalhe, as questões já estão disponíveis no arquivo code.zip, por exemplo, a QUESTÃO 1 está relacionado ao arquivo src/Date/Format.php que pode ser executado via composer pelo comando:

$ php vendor/bin/kahlan --spec=spec/Date/Format.spec.php

Ou usando php pelo comando:

$ php print/Date/Format.print.php

Mas antes lembre-se de habilitar as configurações do composer.json:

$ composer install
$ composer dump-autoload -o

QUESTÕES


QUESTÃO 1 - No arquivo src/Date/Format.php, desenvolva a função Format::long que recebe uma data no formato “dd/mm/aaaa” e escreva a data por extenso. O separador é a barra (/) da data. Por exemplo, para a entrada “22/04/1983” deve ser escrito “22 de abril de 1983” (Exemplo 1.1):

Exemplo 1.1:

var_dump(Format::long("22/04/1983")); //=> "22 de abril de 1983"

QUESTÃO 2 - No arquivo src/Grammar/Grammar.php, a função Grammar::spelling ao receber uma String deverá transformar seu conteúdo para que as letras sejam separadas por hífen (-) e em maiúsculas. Veja o resultado dos Exemplos 2.1 e 2.2:

Exemplo 2.1:

var_dump(spelling("programador")); //=> 'P-R-O-G-R-A-M-A-D-O-R'

Exemplo 2.2:

var_dump(spelling("o dia está chuvoso")); //=> 'O-D-I-A-E-S-T-Á-C-H-U-V-O-S-O'

QUESTÃO 3 - No arquivo src/SockMerchant/SockMerchant.php, crie a função SockMerchant::sockMerchant que recebe um conjunto de meias identificadas por números e deve retornar quantos pares do mesmo tipo é possível montar (Fonte: Sock merchant - Hackerrank). Veja o resultado dos Exemplos _3.1_ e _3.2_:

Exemplo 3.1:

$arr = [1, 2, 1, 2, 1, 3, 2];
var_dump(SockMerchant::sockMerchant($arr)); //=> 2

ou seja, existem 3 tipos de meias {1, 2, 3} que ao se agrupar em pares é possível formar 1 par do tipo de meia 1, e 1 do 2, o que totaliza 2 pares. Conforme é possível ver nos elementos destacados {1, 2, 1, 2, 1, 3, 2}.

Exemplo 3.2:

$arr = [10, 20, 20, 10, 10, 30, 50, 10, 20];
var_dump(SockMerchant::sockMerchant($arr)); //=> 3

ou seja, existem 4 tipos de meias {10, 20, 30, 50} que ao se agrupar em pares é possível formar 2 pares do tipo de meia 10, e 1 do 20, o que totaliza 3 pares. Conforme é possível ver nos elementos destacados {10, 20, 20, 10, 10, 30, 50, 10, 20}.

QUESTÃO 4 - No arquivo src/Vector/ArrayUtil.php, resolva os seguintes problemas:

a) - Crie a função ArrayUtil::rotLeft(d) que rotaciona os elementos de um array a em d saltos (Fonte: Arrays: Left Rotation - Hackerrank). Veja o resultado dos Exemplos 4.a.1 e 4.a.2:

Exemplo 4.a.1:

$arrayUtil = new ArrayUtil([1, 2, 3, 4, 5]);
var_dump($arrayUtil->rotLeft(4)); //=> [ 5, 1, 2, 3, 4 ]

ou seja, é realizado 4 rotacionamentos:

[1, 2, 3, 4, 5]
[2, 3, 4, 5, 1] (1º salto: o elemento 1 foi para o final do array)
[3, 4, 5, 1, 2] (2º salto: o elemento 2 foi para o final do array)
[4, 5, 1, 2, 3] (3º salto: o elemento 3 foi para o final do array)
[5, 1, 2, 3, 4] (4º salto: o elemento 4 foi para o final do array)

Exemplo 4.a.2:

$arrayUtil = new ArrayUtil([41, 73, 89, 7, 10, 1, 59, 58, 84, 77, 77, 97, 58, 1, 86, 58, 26, 10, 86, 51]);
var_dump($arrayUtil->rotLeft(10));
//=> [ 77, 97, 58, 1, 86, 58, 26, 10, 86, 51, 41, 73, 89, 7, 10, 1, 59, 58, 84, 77 ]

b) - Crie a função ArrayUtil::stats() que recebe um array arr e retorna a proporção de elementos maior, igual e menor que zero. Uma vez obtido o valor number da proporção use number_format($number, 6) para retornar uma precisão de 6 casas decimais (Fonte: Plus Minus - Hackerrank). Veja o resultado do Exemplo 4.b.1:

Exemplo 4.b.1:

$arrayUtil = new ArrayUtil([-4, 3, -9, 0, 4, 1]);
var_dump($arrayUtil->stats()); //=> ['0.500000', '0.333333', '0.166667']

ou seja, os elementos maior, igual e menor que zero são respectivamente {3, 4, 1}, {0} e {-4, -9}. Na proporção representam os valores 3/6, 1/6 e 2/6 que resultam, na precisão de 6, em 0.500000, 0.333333, 0.166667.

c) - Crie a função ArrayUtil::miniMaxSum() que sempre recebe um array arr de tamanho 5 e retorna o valor mínimo e máximo da soma de 4 elementos de arr. (Fonte: Mini-Max Sum - Hackerrank). Veja o resultado do Exemplo 4.c.1:

Exemplo 4.c.1:

$arrayUtil = new ArrayUtil([1, 2, 3, 4, 5]);
var_dump($arrayUtil->miniMaxSum()); //=> [ 10, 14 ]

ou seja, os 4 menores elementos de arr são [1, 2, 3, 4] e os 4 maiores são [2, 3, 4, 5], logo suas respectivas somas serão 10 e 14

d) - Crie a função ArrayUtil::highestFrequency() para detectar o elemento de maior frequência de arr. (Fonte: Migratory Birds - Hackerrank). Veja o resultado do Exemplo 4.d.1:

Exemplo 4.d.1:

$arrayUtil = new ArrayUtil([1, 4,  4, 4, 5, 3]);
var_dump($arrayUtil->highestFrequency()); //=> 4

ou seja, o array possui os elementos {1, 3, 4, 5} com as frequências de {1, 1, 3, 1}, logo percebe-se que o elemento 4 possui a maior frequência.

QUESTÃO 5 - No arquivo src/String/StringUtil.php, resolva os seguintes problemas:

a) - Crie a função StringUtil::repeatedString(s, n) que recebe a string s e tenta repeti-la várias vezes até ficar com um tamanho de n, e seu retorno deve trazer a quantidade de vezes que aparece a letra a (Fonte: Repeated String - Hackerrank). Veja o resultado dos Exemplos 5.a.1 e 5.a.2:

Exemplo 1:

var_dump(StringUtil::repeatedString("aba", 10)); //=> 7

ou seja, se a string aba for repetida 4 vezes ela ficará abaabaabaaba, mas para ficar com um tamanho de 10 será necessário remover algumas letras no final, gerando a string abaabaabaa. Ao contabilizar a ocorrência da letra a o resultado será 7.

Exemplo 2:

var_dump(StringUtil::repeatedString("a", 1000000000000)); //=> 1000000000000

b) - Crie a função StringUtil::mirrorSequence(a, b) que retorna a sequência linear de a até b, e em seguida, a sequência será espelhada (Fonte: Mirror Sequence - URI Online Judge). Veja o resultado dos Exemplos 5.b.1 e 5.b.2:

Exemplo 5.b.1:

var_dump(StringUtil::mirrorSequence(1, 5)); //=> '1234554321'

ou seja, a sequência de 1 até 5 é 12345, e seu reflexo é 54321, juntando os dois valores obtem-se o valor 1234554321.

Exemplo 5.b.2:

var_dump(StringUtil::mirrorSequence(10, 13)); //=> '1011121331211101'

c) - Crie a função StringUtil::zeroMeansZero(a, b) que retonra a soma dos valores a e b sem o dígito 0 caso exista (Fonte: Zero means Zero - URI Online Judge). Veja o resultado dos Exemplos 5.c.1 e 5.c.2:

Exemplo 5.c.1:

var_dump(zeroMeansZero(7, 8)); //=> 15

ou seja, a soma de 7 mais 8 é igual a 15, logo o retorno será 15 pois não existe o dígito 0.

Exemplo 5.c.2:

var_dump(StringUtil::zeroMeansZero(15, 5)); //=> 2

ou seja, a soma de 15 mais 5 é igual a 20, logo o retorno será 2 pois será removido o dígito 0.

d) - Crie a função StringUtil::numberOfLeds(number) que recebe um número e retorno o total de LEDs necessário para exibi-lo. Lembrando que conforme a Figura 1 exibe, cada número exige uma quantidade de LEDs específica, por exemplo, o dígito 1 precisa de 2 LEDs, o 2 de 5, e assim sucessivamente (Fonte: Led - URI Online Judge).

Figura 1 - Representação dos números em LED
Representação dos números em LED
(Fonte: Led - URI Online Judge)

Veja os Exemplos 5.d.1 e 5.d.2:

Exemplo 5.d.1:

var_dump(StringUtil::numberOfLeds("115380")); //=> 27

ou seja, o número 115380 é formado pelos dígitos {1, 1, 5, 3, 8, 0} e exige respectivamente a seguinte quantia de LEDs {2, 2, 5, 5, 7, 6}, que resulta em um total de 27 LEDs.

Exemplo 5.d.2:

var_dump(StringUtil::numberOfLeds("2819311")); //=> 29




Alternativa de resposta: