Votre tâche consiste à écrire un programme ou une fonction qui peut remplir un rectangle donné avec des nombres premiers. Le width
et height
du rectangle sera l'entrée. La sortie doit être une liste de height
chaînes composée de width
chiffres et d'espaces. Chaque séquence de chiffres horizontale (de gauche à droite) et verticale (de haut en bas) (délimitée par des bordures d'espace ou de rectangle) de longueur 2 ou plus doit être un nombre premier. Chaque nombre premier ne peut être utilisé qu'une seule fois. Les zéros non significatifs ne sont pas autorisés. Une nouvelle ligne de fin est facultative sur la sortie.
Exemple:
With input (5, 3) a valid output would be:
11 13
7 0
173
which scores 11, 13, 173, 17, 103 for a total of 5 points.
But:
La taille du rectangle pour la notation sera 80, 60
. Chaque nombre premier horizontal ou vertical de longueur 2 ou plus dans le rectangle marque un point. La réponse avec le plus de points gagne. En cas d'égalité, la première réponse l'emportera.
Règles:
- Les failles standard sont interdites.
- Votre programme ne doit pas être conçu pour la
80, 60
taille. Si je soupçonne qu'une réponse est optimisée pour cette taille, je me réserve le droit de modifier la taille du rectangle jusqu'à100, 100
. - Les nombres premiers utilisés doivent être de vrais nombres premiers (non probabilistes ou pseudoprimes). Votre programme peut calculer ou vérifier des nombres au moment de l'exécution, ou les faire coder en dur. La méthode de recherche des nombres premiers n'est pas un élément important du défi.
- Votre réponse doit inclure le texte de sortie et votre code. Si votre programme est trop volumineux, vous pouvez simplement inclure du code d'algorithme de base, avec une petite explication.
Edit: clarifié que de vrais nombres premiers étaient nécessaires. Ajout de la taille maximale du rectangle.
Edit 2: Clarifié quel code doit être publié.
la source
Réponses:
Clingo avec Python,
160016891740 nombres premiersApproche
Je génère un problème de satisfaction de contraintes géant et le résout à l'aide d'un solveur de satisfiabilité de puissance industrielle. Beaucoup de magie a été nécessaire pour rendre les solveurs de satisfiabilité relativement rapides (même si le problème est NP-complet en général), mais heureusement, je n'ai pas à me soucier de cette partie.
Plus précisément, je fixe les positions des chiffres dans un modèle conçu pour un emballage serré de numéros à 4 et 5 chiffres, avec des numéros occasionnels à 2 et 3 chiffres sur la frontière, et j'ajoute des contraintes disant que chaque numéro est un nombre premier distinct. L'emballage actuel utilise une grande partie des nombres premiers à 4 chiffres (854 sur 1061).
Code
Usage
Attention: à 80 × 60, cela prend environ 8 minutes et utilise 3 Go de mémoire. Vous voudrez peut-être commencer avec des tailles plus petites si vous voulez simplement le voir fonctionner.
Sortie (80 × 60, 1740 nombres premiers):
la source
Smalltalk, 1098 nombres premiers
Tout d'abord, belle question difficile - comme en témoigne le manque de réponses non triviales jusqu'à présent.
J'avais une solution pour cuisiner au travail, mais j'ai dû attendre le long week-end pour avoir le temps de le nettoyer un peu. Malgré tout, c'est assez "lourd", alors excusez la longueur de cette réponse - heureusement, ce n'est pas une question de code-golf. Il y a eu beaucoup de petits accrochages en cours de route, mais je suis sûr que c'est sans bug maintenant, bien qu'il y ait beaucoup de place pour l'amélioration et le réglage fin.
La langue
Mon langage de choix pour ce genre de chose est Smalltalk - le débogage supérieur et la capacité de tester au fur et à mesure battent tout ce que je sais. De plus, même les non-codeurs peuvent le lire et comprendre les bases de ce qui se passe. J'ai limité le code ci-dessous à la partie intéressante, parce que je pensais que l'approche et les résultats seraient plus intéressants que le code standard, mais un fichier du code complet est collé ici si quelqu'un veut l'essayer (enregistrez simplement en tant que
*.st
fichier et déposez-le depuis un navigateur de fichiers dans Pharo). J'ai utilisé Pharo 4.0, qui est FOSS et peut être téléchargé sur pharo.org pour Win / Mac / Linux. Aussi heureux de coller le code complet ici, mais j'ai pris la suggestion "devrait inclure le texte de sortie et votre code" - faites-moi savoir si je me trompe.Approche
Donc, ma pensée était, et si vous pouviez commencer au milieu, remplir autant de nombres premiers longs que vous le pouviez dans la boîte, et progresser vers l'extérieur à partir de là? Commençons par un
Box
objet, contenant unmatrix
des caractères, puis utilisons unStuffer
objet pour essayer de le remplir en trouvant le meilleurInsertion
(un autre objet) pour chaque point de la matrice et pour chaque nombre premier (en commençant par les longs). Pharo a belleMatrix
etPoint
classe avec un tas de méthodes utiles (bien que la façon matricielle d'utiliser la notation de rang majeur par rapport à l' aide xy les coordonnées des points peut être un peu déroutant si vous ne faites pas attention).Les étapes de base de mon algorithme sont:
Stuffer
instance pour des dimensions données.Configurable:
Pour la matrice ci-dessous, j'ai utilisé 80x60, des nombres premiers inférieurs à 20 000 (car la longueur combinée de ceux-ci est légèrement inférieure à 10 000 caractères, c'est-à-dire le maximum pour une boîte 100x100 rembourrée, bien qu'invalide), et, après quelques expérimentations, la cote suivante pour l'
each
insertion :où
accidentalPrimes
sont les nombres premiers perpendiculaires créés "accidentellement" lors de l'insertion entre nombres premiers voisins etnumberOfOverlaps
combien de caractères sont écrasés (par exemple lors de l'ajout d'un3
à la fin de l'11
insertion113
). Au départ, je l'avais pondéré davantageaccidentalPrimes
, mais j'ai obtenu quelques autres nombres premiers dans la boîte en le faisant de cette façon - je ne sais pas vraiment pourquoi (n'hésitez pas à tester / modifier).Résultat
Cette matrice contient 1098 nombres premiers, ce qui représente une «charge» d'environ 70%.
Ce sont les nombres premiers (
box primesUsed asSortedCollection printString
):Comme vous pouvez le voir, certains des nombres premiers «accidentels» deviennent assez longs ... 20 chiffres pour le plus long. :-)
Détails
Pour comprendre comment cela fonctionne, voici la sortie des premières étapes - en insérant d'
19997
abord (si vous regardez au milieu de la grande matrice, vous y verrez19997
également), puis en bas de la liste où il y a de l'espace dans le 5x5 box (>
signifie insérer aller à droite,v
signifie descendre; tout ce qui{}
est dedans sont des nombres premiers accidentellement ajoutés:Dans l'insertion immédiatement au-dessus, la zone devient 7x7 et est remplie avec le contenu 5x5 avant la prochaine insertion. Je recalcule également les nombres premiers utilisés à ce stade, car certains sont "libérés" en raison de l'écrasement (a
11
été inséré, puis écrasé par113
).Code
Voici les parties les plus pertinentes du code:
Classe Stuffer
Côté classe
Côté instance
Classe de boîte
Côté instance
Collection
Oh, et j'ai ajouté une méthode du côté instance de
Collection
, juste pour plus de commodité:L'exécuter
Pour exécuter mon code, tout ce que je dois faire est de sélectionner le code suivant dans un espace de travail ("terrain de jeu" dans Pharo) ou dans n'importe quel volet de texte, et "le faire" dans le menu contextuel:
Le reste du code est relativement ennuyeux.
Comme je l'ai dit, il y a place à amélioration, mais à 80x60, chaque exécution prend plus de 3 minutes sur ma machine. De toute évidence, la performance n'a pas été ma préoccupation, mais il y a BEAUCOUP de nombres premiers qui volent autour. Cela a certainement été un défi intéressant. :-)
la source
Javascript, marque 659
Presque certainement sous-optimal.
Résultats pour 30x30:
Et pour le boîtier 60x60:
la source