2010-06-15 28 views
3

J'ai résolu 84 des problèmes du projet Euler, principalement dans Haskell. Je vais maintenant revenir et d'essayer de résoudre en J certains de ceux que je déjà dans Haskell résolu, comme un exercice d'apprentissage J.Pourquoi n'ai-je pas la bonne réponse pour Euler 56 dans J?

Actuellement, je suis en train de résoudre Problem 56. Permettez-moi de souligner que je sais déjà quelle est la bonne réponse est, puisque je l'ai déjà résolu dans Haskell. C'est un problème très facile et trivial. Je ne donnerai pas la réponse ici.

Voici ma solution dans J:

digits =: ("."0)@":"0 
eachDigit =: adverb : '[email protected]:digits"0' NB. I use this so often I made it an adverb. 
cartesian =: adverb : '((#~ #) u ($~ *:@#))' 
>./ +/ eachDigit x:^cartesian >: i. 99 

Cela produit un nombre inférieur au résultat souhaité. En d'autres termes, c'est faux d'une manière ou d'une autre. N'importe quel J-ers sait pourquoi? Je suis déconcerté, car c'est assez simple et totalement brutal.

Répondre

3

La raison est que vous appliquez une précision prolongée (x:) trop tard dans la partie. Passez à la précision étendue la première chose que vous faites (par exemple i. x: 99) et votre devrait être tout ensemble.

Une autre remarque concernant votre cartesian. Vous voudrez peut-être jeter un oeil à J intégré "table" adverb (/):

^/~ >: i.5 
1 1 1 1 1 
2 4 8 16 32 
3 9 27 81 243 
4 16 64 256 1024 
5 25 125 625 3125 

    , ^/~ >: i.3 
1 1 1 2 4 8 3 9 27 
+0

Qui l'a fixé! Il a également corrigé quelques autres problèmes de Project Euler sur lesquels je travaillais. J'étudie l'adverbe de la table pour le moment. –

+0

Je viens de me rendre compte que je connaissais déjà l'adverbe de la table, mais je ne me suis pas rendu compte que vous pouviez l'utiliser pour des opérations cartésiennes. –

+2

Oh! Quand c'est utilisé dyadiquement! J'ai compris. Très agréable! –