2009-08-11 7 views
1

Je travaille sur le projet Euler Problem 4, et la nécessité de trouver le palindrome du produit de 2 numéros à 3 chiffres, alors je suis venu avec:Palindromes en Haskell

palindrome = [ x*y | x <- [100..999], y <- [100..999], reverse [x*y] == [x*y]] 

Pourquoi pas ce travail et comment puis-je le faire fonctionner? Je suppose que je dois d'une manière ou d'une autre obtenir la réponse dans une liste pour qu'elle soit inversée et vérifiée s'il s'agit d'un palindrome.

Répondre

9

Cette partie

reverse [x*y] == [x*y] 

est faux. [x*y] est une liste avec un seul élément: le résultat de x*y. L'inverse est la même liste ...

Ce que vous voulez est le nombre avec ses chiffres inversés. Vous avez besoin d'une liste avec les chiffres du numéro. Un truc simple à faire est de convertir le nombre en sa représentation sous forme de chaîne (rappelez-vous que type String = [Char]). Pour ce faire, vous pouvez utiliser show, au lieu de [ ]:

palindrome = [ x*y | x <- [100..999], y <- [100..999], reverse (show (x*y)) == show (x*y)] 
+0

BTW: ce code me dit que la réponse est 906609. –

+0

Mais je voulais le calculer! Merci quand même –

+0

Désolé si je vous ai gâché la joie de courir le code et de regarder le résultat pour trouver la réponse. Oh ... ce sentiment flou chaud ... Ce n'était pas mon intention :) –

2

Vous ne souhaitez pas appliquer la fonction inverse à une liste contenant un seul nombre. Vous devez appliquer la fonction inverse à la représentation sous forme de chaîne de ce nombre.

Essayez d'utiliser la fonction "show".

Aussi, si vous avez assez de force pour éviter de regarder et ruiner tout l'objet du projet Euler, vous pouvez regarder ceci:

http://www.haskell.org/haskellwiki/Euler_problems