De l'encre noire foncée a éclaboussé toute votre feuille blanche de papier d'imprimante! La solution évidente consiste à plier le papier de façon à ce que les parties en noir et blanc se rencontrent et deviennent grises lorsque l'encre se diffuse. Ensuite, dépliez et repliez jusqu'à ce que votre papier soit tout aussi gris.
Trouver la meilleure façon de faire ces plis est votre tâche dans ce défi de codage. Ce Pastebin contient quatre grilles de tailles et de zéros différentes. Chaque grille représente un morceau de papier éclaboussé d'encre que vous devez virer au gris. Les zéros sont du papier et ceux de l'encre.
Dans ces grilles, seuls les plis horizontaux et verticaux le long des espaces entre les lignes et les colonnes sont valides. Lorsqu'un pli est effectué, les paires de valeurs qui se chevauchent sont moyennées. Les plis sont effectués un à la fois et toujours dépliés. Les plis ne modifient que la distribution de l'encre, pas la taille du papier.
Rn désigne le pliage du bord gauche de la grille vers la droite, en commençant après la nième colonne. Dn désigne le pliage du bord supérieur de la grille vers le bas, en commençant après la nième rangée. (n est indexé 1)
Exemple
Compte tenu de cette grille
0 1 1 1
0 0 0 0
0 0 0 0
un pli D1 signifie "plier toute la rangée supérieure vers le bas puis déplier".
0 0.5 0.5 0.5
0 0.5 0.5 0.5
0 0 0 0
Ensuite, un R2 produira
0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
0 0 0 0
et un autre R2 ne changera rien.
Objectif
Votre objectif est d'écrire un algorithme qui trouve la meilleure séquence de pliage à dispersion d'encre pour chacune des quatre grilles en utilisant exactement 8 plis à chaque fois. Les plis peuvent être n'importe quelle combinaison de Rs ou Ds.
Notation
Le score de votre soumission est la somme de vos scores pour chaque grille. Le score d'une grille est la somme des différences absolues entre chacune de ses valeurs et sa moyenne (sa somme divisée par sa surface). Des scores plus bas sont meilleurs. Un score de 0 est parfait, mais est probablement impossible en seulement 8 plis.
Vous devez signaler vos quatre séquences de pliage en 8 étapes avec votre code dans votre réponse. C'est ainsi que nous pouvons vérifier que votre algorithme fonctionne vraiment.
Veuillez les mettre sous cette forme:
20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8
Voici un script Python qui calculera vos scores en fonction de vos séquences de pliage.
Naturellement, vous ne devez pas copier la soumission de séquence de quelqu'un d'autre. Les séquences de chaque grille appartiennent uniquement à la personne qui les a créées en premier.
Clarifications
Idéalement, votre algorithme fonctionnera bien sur n'importe quelle grille, bien que vous puissiez l'adapter à celles-ci.
Vous devez soumettre votre code avec votre séquence. Pour gagner, vous avez besoin du plus petit ensemble de séquences de pliage en 8 étapes qui n'a pas encore été publié, ainsi que d'un algorithme qui résiste à l'examen du public. Expliquez votre code, ne le masquez pas.
La grille ne doit jamais contenir de nombres négatifs.
Des échappatoires standard s'appliquent.
la source
Réponses:
Python
Essaie de manière exhaustive différentes combinaisons de plis pour les premiers plis, puis fait le reste des plis en utilisant une approche gourmande.
L'approche exhaustive est limitée dans une plage raisonnable de plis au centre, de sorte qu'elle ne prendra pas éternellement, sans ignorer trop de plis possibles pour donner un bon minimum.
Ran en utilisant pypy sur mon macbook air.
Réponses:
Les sorties:
Score total: 7,91125 + 16,34375 + 42,13 + 32,30875 = 98,69375
Code:
la source
C, 16,344 (4 minutes 33 secondes)
Meilleurs coups trouvés jusqu'à présent: D6, D13, R19, D9, D11, R21, D10, R20
Utilise un mélange de Monte Carlo et d'escalade. Pourrait être exécuté beaucoup plus rapidement, j'en suis sûr.
la source