thegoodfellas/blogset-br huggingface dataset:
Ha muito tempo eu venho fazendo isso e sei que e errado. E tao sujo e tao baixo o que faco, mas acredite em mim, eu nao queria. Eu nao quero mais fazer isso, mas a vida me obriga. Voces todos me obrigam a faze-lo Por favor, nao me julgue. Nao ajo assim por ser mau carater, nem nada, mas preciso sustentar meus vicios e so agindo desta maneira e que consigo. E um crime e voce merece uma punicao. Eu sei que e o que esta passando pela sua cabeca, mas se serve de consolo, eu ja estou sendo punida. Sou penalizada a cada olhar inquisidor que me e lancado pelo vizinho. Ele sabe o que eu ando fazendo de madrugada, com certeza. Sabe e nao hesita em demonstrar que sabe, mesmo que discretamente, como um segredo so nosso. Um segredo que vira a tona e que ele usara contra mim no tribunal. Assumo meu erro perante toda a Corte, assumo para nao mais ser julgada, para nao mais sair de cabeca baixa nas ruas porque sei que comentam pelas minhas costas. Ladrao, gatuno, larapio... Todos esses adjetivos ja surgiram na minha mente enquanto penso no que estou fazendo. E sei que voces me chamam assim. Fraco, covarde, medroso... Esses me surgem enquanto tento, mas nao consigo, abdicar meus vicios. E sei que voces pensam o mesmo. So quero que saibam que e muito mais facil para quem esta de fora julgar essa situacao. Vicios sao dificeis de largar e simplesmente fingir que nunca existiram. Mas eu vou conseguir, abandonarei todos eles sem dizer adeus. Ja nao aguento mais a humilhacao diaria, ja nao sou capaz de suportar os olhares recriminadores, ja nao aguento mais ter que roubar a internet do vizinho. Postado originalmente em: 11/05/2013. - Oi!- Oi!- O que ce ta fazendo?- Tentando escrever uma historia para a aula de Redacao.- Ta conseguindo?- Nao.- Que droga!- E, droga mesmo.- Quer ajuda?- Quero!- Eba! Vamos la... Era uma vez...- Era uma vez?- E, era uma vez!- Muito cliche.- E dai? Os grandes sucessos sao cliches.- Sao?- Sao.- Ta certo. Era uma vez um rapaz que gostava muito de passear...- De busao!- De busao?- E, de busao. O onibus na cidade dele e confortavel, tem ar-condicionado e os passageiros sao todos bacanas.- Ah, entao ta. Era uma vez um rapaz que gostava muito de passear de onibus. Nao estranhe, na cidade do rapaz os onibus eram todos muito confortaveis, tinham ar-condicionado pra ninguem precisar suportar o calor infernal e todos os passageiros eram muito educados. Em um de seus passeios...- Ao zoologico! Ele adorava animais. Talvez fosse veterinario... Seu bicho preferido era o tigre. E, olha que coincidencia, novos tigres haviam chegado ao zoologico naquela semana.- Eu tambem gosto de tigres, eles sao bonitos. Mas o que aconteceu ao rapaz naquele passeio?- Ele viu uma moca.- Blergh. Ja vai colocar coisa de amorzinho na historia.- Cala a boca e escreve. Era uma vez um rapaz que gostava muito de passear de onibus. Nao estranhe, na cidade do rapaz os onibus eram
todos muito confortaveis, tinham ar-condicionado pra ninguem precisar suportar o calor infernal e todos os passageiros eram muito educados. Em um de seus passeios, decidiu que sua parada seria o zoologico, o rapaz adorava animais. Nao sei, mas acho que ele era veterinario. Seu bicho favorito era o tigre e, naquela semana, uma nova familia de tigres havia chegado para morar no zoologico. Logo que chegara ao lugar avistou uma moca comprando pipoca. Ela nao era simplesmente uma moca, era A moca mais bonita que o rapaz ja vira na vida. Apressou o passo para alcanca-la, mas a mocinha foi mais rapida e desapareceu antes que ele pudesse pedir Uma pipoca salgada, por favor. Deu de ombros e seguiu seu passeio...- E entao um tigre fugiu e fez o maior bafafa no zoologico. Senhoras e criancas correndo de um lado para o outro, os animais se agitaram em suas jaulas...- E ai o rapaz encontra a moca...- Mas nao antes de um tigre tentar engolir a cabeca dela...- So que o rapaz chega bem a tempo e a salva...- E nesta hora o rapaz lhe revela sua identidade secreta...- Ele e o Superman...- Nao, o Superman nao, ele usa cueca por cima da calca.- Ele e o Ciclope!- Nao! Voce nao tem juizo, menina? Ele e o Batman!- Aff, ta certo. Entao quando ele revela para a moca que, na verdade, o pacato rapaz de olhar doce e sorriso timido e o Batman, protetor de Gotham, a mocinha toca-lhe a face e o rapaz e surpreendido: toda a forca abandona seu corpo. E eu sou a Vampira, garanhao...- MEU DEUS DO CEU! Voce esta ficando maluca? - Nao. Por que?- ELE E O BATMAN, MULHER!- E dai? ELA E A VAMPIRA, HOMEM!- Mas o Batman e O BATMAN. - Que chato, voce. - Nao sou chato. Voce que nao sabe escrever uma historia legal.- Eu? - E, voce.- Vou embora. Fica ai voce e o seu Batman. - Ja vai tarde, hunf.
Voce costumava ser tao doce, taovoce. Sinto saudade de quando voce era simples, quando a gente discutia horas equando eu era a primeira (ou a segunda) pessoa com quem desabafava, que contavaseus segredos, suas duvidas. Sinto falta de tanta coisa, mas principalmente defazer parte da sua vida. Queria que tudo fosse como costumava ser. De repente voce acordou e me viucom outros olhos, olhos que a gente nao concordava, que a gente nao seconformava. Esses olhos que ja foram, por tantas vezes, tema das nossasdiscussoes inteligentes pela madrugada. Voce se tornou o que voce achavaerrado, o que te fazia mal. Infelizmente nos nao podemospensar por ninguem e nem salvar a alma de ninguem, mas eu sempre quis tesalvar, principalmente agora, que esta prestes a partir, e sei que no fundovoce sabe que provavelmente vai ser a maior idiotice da sua vida. Te faltaamadurecer e perceber o mundo com seus olhos, e nao com os olhos de quem nao querenxergar. Sinto sua falta, sinto falta decontar tudo sobre mim e saber tudo sobre voce. Nos nem nos conhecemos mais. Queriaque tivesse o mundo em suas maos, e com sua delicadeza e excesso de fofura, o mundoseria um lugar melhor, com certeza.Mas pensamentos retrogrados ementiras afastam tudo de maravilhoso que o mundo pode te proporcionar. Voceesta presa numa caixa ha tao pouco tempo, e foi o suficiente para te mudar daagua para o vinho. Da agua para o vinho... Talvez voce queira provar algumacoisa, talvez voce esteja querendo provocar alguem, ou talvez isso seja umafase, espero que seja, quero acreditar que sim mesmo sabendo que,infelizmente, nao e.Quando eu era mais nova, ouvialguem dizer que existem dois tipos de pessoas no mundo, os inteligentes, queaprendem com suas proprias experiencias, com seus proprios erros, e os sabios,que aprendem com as experiencias dos outros. Sempre pensei que voce fossesabia. Espero, do fundo do meu coracao, que voce seja. Uma maneira simples de verificar se um numero e primo, se baseia na propria definicao:"Um numero n e primo quando seus unicos divisores sao a unidade e o proprio n"Assim, basta que um numero n possua pelo menos um divisor diferente de 1 e dele mesmo para que nao seja primo.A lista de candidatos a divisores e formada por numeros maiores que 1 e menores que n, algo como:lcand n = [2..(n - 1)]Podemos entao construir uma funcao recursiva que verifica se um numero e divisivel por algum elemento de uma lista:tem_divisor n [ ] = Falsetem_divisor n (x:xs) = if (mod n x) == 0 then True else tem_divisor n xsAgora estamos prontos para escrever a funcao que verifica se um numero e primo:primo n = not (tem_divisor n (lcand n))Vejamos alguns exemplos de uso:> primo 35 False (372 reductions, 620 cells)> primo 36 False (116 reductions, 186 cells)> primo 859963392 False (116 reductions, 190 cells)Um rapida reflexao nos levar a perceber que a lista de candidatos tem mais elementos que o necessario. Afinal, nao precisamos buscar divisores nos numeros maiores que a matade de n, certo? Com isso podemos ter uma nova versao.primo' n = not (tem_divisor
lista de candidatos que sao testados.Esta e uma estrategia geral para solucao de problemas, quando desejamos determinar uma lista de elmentos que satisfazem uma determinada propriedade, conhecida como "generate and test", ou "gerar e testar".
Vamos rever aqui a definicao de numeros feios apresentada na postagem anterior, para pontuar alguns aspectos relevantes para a programacao de um modo geral.m2 = [x*2| x <- feios]m3 = [x*3| x <- feios]m5 = [x*5| x <- feios]feios = 1: merge (merge m2 m3) m5Em primeiro lugar, o problema de determinar o i-esimo numero feio foi resolvido a partir de uma generalizacao, ao inves de pensarmos na determinacao de um elemento especifico, abordamos o problema a solucao a partir da definicao do conceito de numeros feios. Esta definicao, e nao parametrica e facilita seu uso em situacoes variadas ao inves de se prestar apenas a determinacao de um dado elemento.A definicao foi estruturada com base na definicao de 4 listas infinitas, usando recursao infinita. Pode-se observar ainda que aqui a definicao como um todo se apoia em uma recursoes mutuas. Para definir os feios precisamos dos numeros gerados pelo produto de cada numero feio por 2, por 3 e por 5. Para definir cada uma dessas listas (m2, m3 e m5) precisamos dos feios. A avaliacao e feita de uma maneira preguicosa (lazzy evaluation), o que significa que a geracao de cada lista avanca de maneira paulatina, ou seja, cada elemento e produzido no momento em que precisamos opera-lo (just on time).Existem varias referencias a determinacao desses numeros, tambem conhecidos como Hamming s Number, devido a Richard Hamming, no contexto de programacao procedural e de analise de algoritmos. A popularizacao deste problema se deve a Edsger Dijkstra. Considere o conceito teorico da aplicacao recorrente de uma funcao g a um determinado valor v, que podemos representar por:(g v)*por exemplo, seja g v = v + 1, entao (g 3)* => 3, 4, 5, 6, 7, 8, 9, 10 ...a aplicacao de g prossegue enquanto o valor resultante de uma aplicacao for um valor valido como entrada de g. Assim, dependendo de g e do valor inicial, a aplicacao recorrente pode ser infinita.O valor v pode ser estruturado. Vamos considerar uma situacao mais complexa.problema: definir uma funcao g que compute o somatorio dos elementos de uma lista xs.podemos definirg xs = (g1 (0, xs) ) *onde g1 (v1, xs) = (v1 + head xs, tail xs)assim, g [1,3,5,7,9] = g1 (0, [1, 3, 5, 7, 9]) *cuja sequencia de computacao seria:(0+1, [3, 5, 7, 9]), (1 + 3, [5, 7, 9]), (4+5, [7, 9]), (9+7, [9]), (16+9, []), (26, ?)Podemos entender o foldl como uma funcao de segunda ordem que tem comportamento semelhante a este conceito teorico acima apresentado.O foldl funciona como a aplicacao recorrente de uma funcao f a um par, onde o primeiro elemento e um valor x qualquer e o segundo uma lista xs. A cada passo, o foldl aplica a funcao f ao valor corrente de x e ao primeiro elemento de xs, para obter um novo valor para x. Sobre xs e aplicada a funcao tail xs.ou seja foldl = ( (f x head xs, tail xs) )*Por exemplo, para determinar o somatorio dos elementos de uma lista xs, podemos escrever:somatorio xs = foldl (+) 0 xsuma
aplicacao desta definicao, a lista [3, 8, 25, 1, 10], geraria as seguintes computacoes:( 0, [3, 8, 25, 1, 10] )( 0 + 3, [8, 25, 1, 10] )( 0 + 3 + 8, [25, 1, 10] )( 0 + 3 + 8 + 25, [1, 10] )( 0 + 3 + 8 + 25 + 1, [10] )( 0 + 3 + 8 + 25 + 1 + 10, [] )(47, ?)Vejamos que nao e necessario que os elementos de xs sejam considerados na computacao.Por exemplo, vejamos uma funcao para descrever uma Progessao Aritmetica, com primeiro termo a1, razao r e n termos.pa a1 r n = foldl f ( r, [a1]) [2..n] where f (r, ys) b = ( r, ys ++ [last ys + r])Para explicitar um pouco mais a expressividade computacional, vejamos a aplicacao de uma funcao f a uma tripla, onde para cada elemento da tripla e definida uma funcao fi.h a1 a2 a3 n = foldl f (a1, a2, a3) [2..n] where f (a1, a2, a3) b = ( f1 a1, f2 a2, f3 a3) f1 x = x + 1 f2 y = y + 2 f3 z = z + 3
1500 feios))859963392(48017 reductions, 60032 cells)bom, parece que esta descricao esta um pouco dificil de entender. :-)que tal essa:> last(take 1500 feios) 859963392 (25534 reductions, 31551 cells)mas essa parece melhor: o feio de ordem 1500 e o elemento de indice 1499 na lista lfeios.> feios!!1499 859963392(28518 reductions, 36032 cells)Nada impede que se tenha uma definicao especifica para determinar o feio de ordem k.feio k = feios!!(k - 1)e que assim possamos pedir a avaliacao:> feio 1500 859963392(90641 reductions, 146337 cells)Podemos voltar a falar sobre desempenho. Relembremos do que tinhamos antes usando "gerar e testar". ordem resultado gerar e testar geracao direta 0 1 (283 reductions, 525 cells) (40 reductions, 60 cells) 10 15 (5582 reductions, 8081 cells) (498 reductions, 776 cells) 100 1.600 (662585 reductions, 962977 cells) (5122 reductions, 7970 cells) 200 16.384 (6168873 reductions, 8984262 cells, 9 garbage collections) (7724 reductions, 11584 cells) 500 944.784 (387151581 reductions, 568449819 cells, 577 garbage collections) (21802 reductions, 3717 cells) 1.499 859 x 10 6 (71025 reductions, 111917 cells) 14.999 123 x 10 18 (285018 reductions, 372993 cells) 30.000 32 x 10 24 (1916481 reductions, 3385960 cells, 5 garbage collections) A diferenca entre o numero de reducoes e a quantidade de celulas utilizadas pelas duas versoes do descricao da funcao nos fornece um bom entendimento da diferenca no desempenho do Interpretador na avaliacao das duas. Vejamos o caso do feio de ordem 500.reducoes : 387.151.581 versus 21.802, um ganho da ordem de 10 4celulas: 568.449.819 versus 3.717 um ganho da ordem de 10 5garbage: 577 versus 0
A nossa proxima versao de numeros feios explora um conceito importante em computacao, a intercalacao (merge) de listas ordenadas, sejam elas finitas ou infinitas.problema: dadas duas listas xs e ys em ordem crescente, desejamos obter uma nova lista zs, ordenada crescente, formada por todos os elementos que compoem as duas listas de entrada.solucao: o importante na solucao que apresentamos aqui, bem conhecida na literatura, e que e uma descricao recursiva com excelente desempenho, o melhor possivel. A avaliacao percorre uma unica vez as listas de entrada, respeitando a ordem dos elementos para produzir a nova lista, automaticamente ordenada. Alem disso, e uma definicao apropriada para listas infinitas dado que nao precisa percorrer as listas de entrada por completo para gerar a solucao.Podemos enunciar a solucao da seguinte maneira.A intercalacao de duas listas xs e ys e igual a:a) se o primeiro elemento de xs e menor que o primeiro elemento de ys, entao a lista resultante e igual ao primeiro elemento de xs seguido da intercalacao do resto de xs com a lista ys;zs = (primeiro de xs) : intercalacao (resto de xs) ysb) se o primeiro elemento de ys e menor que o primeiro elemento de xs, entao a lista resultante e igual ao primeiro elemento de ys seguido da intercalacao do resto de ys com a lista xs;zs = (primeiro de ys) : intercalacao xs (resto de ys) c) se os dois primeiros elementos sao iguais, um deles e abandonadozs = (primeiro de xs) : intercalacao (resto de xs) (resto de ys)E agora vamos a codificacao, onde usamos o conceito de pattern para tornar o codigo mais legivel.merge [] ys=ysmerge xs []=xsmerge (x:xs) (y:ys)| x <> | y <> | x == y=== x:(merge xs (y:ys))y:(merge (x:xs) ys)x:(merge xs ys)E a seguir, dois exemplos de uso. O primeiro com listas finitas e o segundo com listas infinitas. Como se pode observar, para que a computacao seja finita, usamos a funcao take para definir o tamanho que desejamos obter da lista resultante.> merge [0,2..10][1,3..15][0,1,2,3,4,5,6,7,8,9,10,11,13,15](516 reductions, 859 cells)> take 10 (merge [0,2..][1,3..])[0,1,2,3,4,5,6,7,8,9](434 reductions, 666 cells)Mas o que os numeros feios tem a ver com isso?Vamos retomar a determinacao do i-esimo feio, como ja fizemos antes, descrevendo a lista dos numeros feios. A versao anterior usava a abordagem "gerar e testar" e vimos que isto era muito oneroso pois, para obter o feio de ordem 1500 precisavamos processar cerca de 1 bilhao de numeros, dado que o feio desejado e 859.963.392.Cabe perguntar: "ha uma maneira de gerar diretamente os numeros feios".E vejam, a resposta e afirmativa pois, "um numero feio e sempre igual ao produto de um numero feio por um dos 3 fatores (2, 3 ou 5)".Com isso podemos ter algo do tipo feios = [1,2,3,5] : "proximo feio".Resta resolver uma questao, como obter o proximo feio? Por certo a expectativa e a obtencao mais conveniente para o problema dos numeros feios. Mas por enquanto, vamos retardar um pouco este desfecho. Vamos aproveitar a oportunidade para saborear um pouco uma estrategia muito interessante na resolucao de problema. Segundo George Polya, apos resolver
um problema devemos buscar generalizacoes.Me ocorreu portanto explorar esta estrategia a partir da funcao que verifica se um dado numero satisfaz a propriedade de pertencer ao conjunto dos feios. Como vimos isto foi obtido com o apoio de uma outra funcao, reduz x n.feio x = reduz (reduz (reduz x 2) 3) 5 == 1reduz x n = if mod x n == 0 then reduz (div x n) n else xPode-se observar aqui que verficar se x e feito foi realizado por verificar se a composicao da aplicacao de reduz x1 2, seguida de reduz x2 3, seguida de reduz x3 5, produz o valor 1.Podemos generalizar entao a funcao feio x para que possamos verificar se um numero e redutivel por uma lista qualquer de numeros. Vamos chama-la de fprimos.fprimos n [ ] = nfprimos n (x:xs) = if n < x then fprimos n xs else fprimos (reduz n x) xsVejamos alguns exemplos de uso:> fprimos 1000 [2,3,5] 1> fprimos 10009 [2,3,5] 10009> fprimos 100092 [2,3,5] 8341> fprimos 944784 [2,3,5] 1> fprimos 859963392 [2,3,5] 1> fprimos 1048576 [2] 1O ultimo exemplo acima mostra um outro uso, a de verificar se um numero e potencia de um determinado fator primo. No caso, como se sabe, o numero 1.048.576 e a potencia 20 do fator 2.COmo isso, podemos fazer uma nova versao da funcao feio, usando agora a funcao fprimos.feio' x = fprimos x [2,3,5] == 1E aqui temos alguns exemplos de uso.> feio' 859963392 True> feio' 1024 True> feio' 1026 False> feio' 859963392 True> feio' 1985 False> feio 1985 == feio' 1985 TrueNova questoes sobre generalizacao podem surgir, tal como: Como podemos usar a funcao fprimos para verificar se um numero e primo?
Problema 1 : Dada uma lista xs, descreva a sublista de xs formada apenas por numeros pares: pares ls = foldl fp [] lsfp xs y = xs ++ (if mod y 2 == 0 then [y] else []) Uma aplicacao da funcao:Main> pares [6, 5, 3, 512, 9, 308, 124][6,512,308,124] observe que o elemento final e obtido pela construcao de uma lista que usa a lista obtida na interacao anterior e o resultado de operar o elemento da lista de entrada com um um valor interior, neste caso a constante 2.Um trace da execucao:1) foldl fp [ ] [6, 5, 3, 512, 9, 308, 124]2) foldl fp [ 6] [5, 3, 512, 9, 308, 124]3) foldl fp [ 6] [5, 3, 512, 9, 308, 124]4) foldl fp [ 6] [3, 512, 9, 308, 124]5) foldl fp [ 6] [512, 9, 308, 124]6) foldl fp [ 6, 512] [9, 308, 124]7) foldl fp [ 6, 512] [308, 124]8) foldl fp [ 6, 512, 308] [124]9) foldl fp [ 6, 512, 308, 124] [ ]Se aplicarmos a funcao pares a intervalos de numeros inteiros podemos obter a sublista de numeros pares pertencentes ao intervalo.por exemplo,Main> pares [1..10][2,4,6,8,10] Problema 2 :Desejamos obter a sublista de xs formada pelos elementos de xs que sao divisiveis por um dado valor v. divisiveis v ls = foldl fd ( [], v) lsfd (xs,v) y = (xs ++ (if mod v 2 == 0 then [y] else []), v)Main> divisiveis 3 [1..20]([3,6,9,12,15,18], 3) A funcao define um par, com o resultado mesmo e um dado de entrada que foi incorporado.Isto pode ser eleminado se o valor v for passado para a funcao auxiliar atraves do contexto, usando a clausula where Fica assim: divisiveis' v ls = foldl fd [] ls where fd xs y = xs ++ (if mod y v == 0 then [y] else []) e veja o que podemos obter: Main> divisiveis' 3 [1..50][3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48] Uma outra observacao importante. A funcao foldl, opera sobre todos elementos da lista, ainda que nao estejamos interessados, ou seja, nao temos como explicitar que desejamos interromper o processamento da lista ls, informada em foldl f x xs.Vejamos um novo exemplo que ilustra a situacao. Problema 3: Desejamos descobrir o preco de um produto p em uma determinada lista de pares (produto, preco). Ainda que saibamos que cada produto ocorre apenas uma vez na lista, nao temos como descrever esta informacao. Assim, nao temos como dizer diretamente que ao encontrar o produto na lista desejamos interromper a busca e retornar este valor. Da mesma forma, nao temos como guardar este valor diretamente, apesar de podermos incorporar informacao do elemento que e atualizado em um ciclo e que serve de entrada para o proximo. Solucao 1 pegapreco x xs = foldl app (0,x,True) xsapp (r,p,controle) (c,preco) = if controle then if p == c then (preco, p, False) else (r,p,controle) else (r,p,controle) Solucao 2---- solucao sem controle, usando lista-- pegapreco' x xs = foldl app' ([],x) xsapp' (rs,p) (c,preco) = (rs ++ (if p == c then [preco] else []),p)Main> pegapreco' "cafe"
Visitando o site de problemas da Universidad de Valladolid (UVA), encontrei um problema que me chamou atencao por dois aspecto. Inicialmente pelo nome, "Ugly Numbers". Pensei comigo, que propriedades teriam esses numeros para serem chamados de feios? Depois pela simplicidade da descricao. Pensei de novo, o que sera que um problemas tao simples assim tem de atraente?Vejamos a descricao do problema de no. 136 do site da UVA.Ugly NumbersUgly numbers are numbers whose only prime factors are 2, 3 or 5.The sequence: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... shows the first 11 ugly numbers. By convention, 1 is included.Write a program to find and print the 1500'th ugly number.Input OutputThere is no input to this program. Output should consist of a single line as shown below, with replaced by the number computed.Sample outputThe 1500'th ugly number is .Chamou-me ainda atencao o alto numero de submissoes, atualmente 31872, versus o percentual de submissoes aceitas: 25.7%, das quais apenas 69.5% tiveram sucesso. Afinal, a solucao parece simples e direta.O que ocorre na verdade e que a solucao ingenua e muito dispendiosa. Consome bastante tempo.Bom, resolvi explorar um pouco sobre solucoes em Haskell para o problema e vi que ele apresentava a oportunidade de fazermos um tour por algumas facilidades da linguagem.A primeira versao, a bem ingenua, considera que os numeros feios formam uma lista, cujos elementos sao oriundos da lista infinita [1.. ] e que satisfazem a propriedades de terem como unicos fatores primos os numeros 2, 3 e 5.Assim, a primeira providencia e definir a lista de numeros feios:feios = [x | x<-[1..], feio x]a segunda e definir o predicado feio x, feio x = reduz (reduz (reduz x 2) 3) 5 == 1Para tanto precisou-se construir uma funcao auxiliar, reduz x n, cuja finalidade e extrair de um numero x as potencias de um outro dado n.reduz x n = if mod x n == 0 then reduz (div x n) n else xagora, como temos uma lista como todos os feios, se desejamos conhecer o numero feio de ordem 1500, basta pedir ao sistema que determine, usando a operacao de indexacao (!!). O feio de ordem 1500 pode ser descrito por: feios!!1499, certo?Podemos usar para outros feios tambem:> feios!!01(283 reductions, 525 cells)> feios!!1015(5582 reductions, 8081 cells)> feios!!1001600(662585 reductions, 962977 cells)> feios!!20016384(6168873 reductions, 8984262 cells, 9 garbage collections)>feios!!500944784(387151581 reductions, 568449819 cells, 577 garbage collections)Veja que ja comecou a ficar complicado para o ambiente WinHugs. O esforco ja esta grande. Imagine se pedirmos feios!!1499.Bom, disto podemos concluir que nossa solucao ingenua nao e muito boa.Apesar disso, podemos aproveitar os ganhos que tivemos.a) A funcao feio x, pode ser usada para verificar se um dado numero e feio ou nao, independente da funcao feios, o que ilustra bem o estilo da linguagem. Cada funcao pode ser usada independente.> feio 944784True(1765 reductions, 2561 cells)> feio 859963392True(2952 reductions, 4291 cells)este ultimo exemplo, e o feio de ordem 1500. So para verificar se e feio ou nao, ate que o avaliador da conta com facilidade.b) A funcao feios, serve para obter