interpretando cada palavra como um numero usando a convencao explicada acima), notamos que existem 117 numeros bonitos distintos.E no Texto B, quantos numeros bonitos distintos existem?Resposta: No Texto B, ha numeros bonitos distintos (atencao!).Resolucao da provinha de programacao - Google Developer Day Brasil 2011Agora vamos para a parte divertida, vamos resolver a provinha. Como adotei o PL/SQL para resolucao do problema, sera necessario criar algumas tabelas, sequencias, e um pacote com procedimentos e funcoes. Tudo isso sera criado no decorrer da provinha.Para comecar vamos criar a tabela PERGAMINHOS, sera nossa principal tabela, nela vamos armazenar as respostas das questoes.CREATE TABLE PERGAMINHOS ( PERGAMINHO_ID NUMBER NOT NULL, NOME VARCHAR2(8) NOT NULL, PERGAMINHO VARCHAR2(4000) NOT NULL, PREPOSICAO NUMBER, VERBO NUMBER, VERBO_PRIMEIRA_PESSOA NUMBER, LISTA_VOCABULARIO VARCHAR2(4000), NUMERO_BONITO_DISTINTO NUMBER);Criando a chave primaria PK_PERGAMINHOS:ALTER TABLE PERGAMINHOS ADD CONSTRAINT PK_PERGAMINHOS PRIMARY KEY(PERGAMINHO_ID);Criando a sequencia PERGAMINHOS_SEQ:CREATE SEQUENCE PERGAMINHOS_SEQMINVALUE 1MAXVALUE 99999999START WITH 1INCREMENT BY 1CACHE 20;Analisando as 3 primeiras questoes, a solucao e aplicar Expressao Regular, mas para isso, temos uma pequena dificuldade inicial, as palavras dos textos estao em uma unica linha, e separados por espacos, desta forma, nada adianta Expressao Regular. Vamos trabalhar um pouco com as informacoes para facilitar a vida. Tudo que precisamos e ter cada palavra em uma linha, mantendo a ordem das palavras para o caso de juntar as palavras de volta. Com cada palavra em uma linha, e so montar a Expressao Regular e utilizar REGEXP_LIKE pra fazer a consulta e retornar a contagem de palavras.Criando a tabela PALAVRAS que ira armazenar as palavras dos PERGAMINHOS:CREATE TABLE PALAVRAS ( PALAVRA_ID NUMBER NOT NULL, PERGAMINHO_ID NUMBER NOT NULL, ORDEM NUMBER NOT NULL, PALAVRA VARCHAR2(8) NOT NULL);Criando a chave primaria PK_PALAVRAS:ALTER TABLE PALAVRAS ADD CONSTRAINT PK_PALAVRAS PRIMARY KEY(PALAVRA_ID);Criando a chave estrangeira FK_PALAVRAS_PERGAMINHOS:ALTER TABLE PALAVRAS ADD CONSTRAINT FK_PALAVRAS_PERGAMINHOS FOREIGN KEY(PERGAMINHO_ID) REFERENCES PERGAMINHOS(PERGAMINHO_ID);Criando a sequencia PALAVRAS_SEQ:CREATE SEQUENCE PALAVRAS_SEQMINVALUE 1MAXVALUE 99999999START WITH 1INCREMENT BY 1CACHE 20;Voltando com a ideia de ter cada palavra em uma linha, para isso temos que selecionar o pergaminho, contar o numero de palavras que tem no pergaminho, percorrer um laco que ira caminhar de palavra em palavra, e inserir cada palavra na tabela PALAVRAS. Antes de implementar o procedimento PERGAMINHO_TO_PALAVRAS, vamos implementar a funcao COUNT_PALAVRAS:FUNCTION COUNT_PALAVRAS(P_PERGAMINHO VARCHAR2, P_SEPARADOR VARCHAR2) RETURN NUMBER IS L_TOTAL_PALAVRAS NUMBER; L_EXPRESSAO_REGULAR VARCHAR2(4);BEGIN L_EXPRESSAO_REGULAR := '[^' || P_SEPARADOR || ']'; EXECUTE IMMEDIATE 'SELECT LENGTH(REGEXP_REPLACE(:1,:2,NULL))+1 FROM DUAL' INTO L_TOTAL_PALAVRAS USING P_PERGAMINHO, L_EXPRESSAO_REGULAR; RETURN L_TOTAL_PALAVRAS; EXCEPTION WHEN OTHERS THEN BEGIN DBMS_OUTPUT.PUT_LINE(SQLERRM); END;END;A funcao COUNT_PALAVRAS utiliza Expressao Regular, a mesma funciona da seguinte forma. A Expressao Regular utilizada neste caso e [^ ], que e uma lista negada do caracter espaco, ou seja, ele casa qualquer caracter diferente de espaco. Espaco no caso, e o separador que e passado pelo parametro da funcao. REGEXP_REPLACE percorre o pergaminho, substituindo caracteres diferentes de espaco por NULL, ou seja, apaga o caracter, sobrando apenas os espacos, em seguida a funcao LENGTH retorna a quantidade de espacos. O numero de palavras e igual ao numero de espaco (separador) mais um.Segue a implementacao do procedimento PERGAMINHO_TO_PALAVRAS:PROCEDURE PERGAMINHO_TO_PALAVRAS(P_PERGAMINHO_ID NUMBER) IS L_PERGAMINHO VARCHAR2(4000); L_TOTAL_PALAVRAS NUMBER; L_PALAVRA VARCHAR2(4000); L_INICIO NUMBER;BEGIN EXECUTE IMMEDIATE