9
votes

Pourquoi Clojure ne me laissa-t-elle pas définir des nombres rembourrés zéro?

J'essaie de lier la grille suivante à un symbole

(def grid [08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
           49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
           81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
           52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
           22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
           24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
           32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
           67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
           24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
           21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
           78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
           16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
           86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
           19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
           04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
           88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
           04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
           20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
           20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
           01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48])


3 commentaires

Suggérer des solutions de contournement dépendra de ce que vous essayez finalement de faire (c'est-à-dire au-delà du rembourrage avec des zéros).


J'essaie simplement de résoudre un problème de projet Euler, et je ne veux pas formater manuellement cette grande grille méchante. Je m'en fiche si les zéros sont préservés en interne ou non, je veux juste coller cette ventouse dans un fichier ou un def, puis pour pouvoir travailler avec elle comme un vecteur régulier d'entiers.


Les virgules sont des espaces, de sorte que vous pourriez les utiliser pour remplacer les zéros: (grid-string-string "\\ S0" ",") Éditer: Duh, ou juste les remplacer par des espaces ... j'ai besoin de plus de café.


5 Réponses :


11
votes

Les zéros principaux impliquent un nombre octal, de sorte que 08 n'est pas valide. De nombreuses langues de programmation utilisent cette convention, commençant par c.


1 commentaires

Oui, cela semble complètement archaïque. Peut-être laissé-pad avec des espaces?



4
votes

Les numéros avec un 0 précédent sont lus comme si ils sont là où dans la base 8, tout charcter ne fonctionne pas entre 0 et 7 ne fonctionnera pas. Pour résoudre ce problème, vous pouvez appendez 10R08 à l'explicitement Spécifiez la base.

user> 10r08
8
user> 08
; Evaluation aborted.


2 commentaires

Une macro ne peut rien faire sur les exceptions de lecture, car les macros sont élargis après la fin du lecteur de son travail. Par exemple. Après (défmacro foo [x] nil) , (foo 123) évalue vers nil , mais (foo 08) jette une exception d'exception (une drôle d'exception «à deux niveaux», en fait, illustrant bien les fonctionnements récursifs du lecteur).


Cela semble atteindre beaucoup de temps; Je me demande pourquoi la Convention est de supposer une base beaucoup moins commune.



7
votes

ALERTE SPOILER:

Puisque vous résolvez un problème de projet Euler, vous ne voudrez peut-être pas la lire, même si ce n'est que sur la "Comment lire dans les données?" Une partie de celle-ci ...


La raison pour laquelle cela se produit est comme expliqué dans les autres réponses. La solution correcte serait d'intégrer l'entrée dans votre code sous forme de chaîne - avec des chevrefeaux! - et utilisez quelque chose comme ce qui suit: xxx

Ceci devrait produire un vecteur de vos numéros. Pour un vecteur à deux dimensions, vous pouvez remplacer le mapcat avec une carte régulière et mettez un supplémentaire (carte VEC) avant la finale < Code> VEC .

Si vous préférez mettre l'entrée dans un fichier séparé et que vous avez clojure, lisez-la à partir de là, remplacez la chaîne et < / em> (. Split # "\ n") avec un appel à ligne-SEQ sur un lecteur sur votre fichier.x


4 commentaires

J'ai quelques problèmes à l'aide de la méthode - >> : exception dans le fil "Main" Java.lang.Exception: impossible de résoudre le symbole: - >> Dans ce contexte (11.clj : 25)


Je ne pense pas que le - >> existait jusqu'à la clojure 1.1. Vous pouvez utiliser une ancienne version de Clojure.


Ouais, j'utilise Clojure 1.0.0 via les référentiels Ubuntu


Est-ce que le (goutte partielle est vide?) Strip Whitespace? Je ne peux pas comprendre ce que c'est censé faire.



2
votes

expressions régulières supprimera les zéros de premier plan xxx

la phrase de regex se décompose comme suit: xxx

une expression plus générale est xxx

qui fait la même chose, mais dans la partie "ou" ou ", il utilise des aspirations de lunettes de vue positive et des assertions à la recherche pour rechercher une séquence d'un ou plusieurs zéros précédés et suivis d'une blancheur.

avec le principal zéros dépouillé (carte lecture-chaîne (re-SEQ ....)) fonctionne juste bien


0 commentaires

0
votes

Comme il ne fallut que 3 minutes environ pour supprimer tous les plus grands zéros, je vais juste coller le vecteur ci-dessus avec les zéros supprimés au cas où quelqu'un d'autre souhaite copier / coller le problème d'Euler. XXX / p>


0 commentaires