Ce défi est inspiré de cette application . Les cas de test sont empruntés à cette application.
Il s'agit d'un défi de code le plus rapide , où l'objectif est de résoudre les cas de test les plus importants en un minimum de temps. Certains scénarios de test plus petits sont fournis, afin que les utilisateurs puissent tester leurs algorithmes plus rapidement.
Vous recevrez une grille d'entrée carrée, de dimensions n par n où 9 <= n <= 12 . Cette grille sera divisée en n zones, où les cellules de chaque zone ont des identifiants uniques (je vais utiliser des lettres minuscules de al dans le texte ici, mais vous pouvez choisir ce que vous voulez, par exemple des entiers 1-12 ) .
L'entrée peut ressembler à ceci (format d'entrée facultatif):
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
Ou, plus facile à visualiser:
Défi:
Vous devez placer 2 * n arbres dans ce parc, selon les règles suivantes:
- Il doit y avoir exactement 2 arbres par colonne et 2 arbres par ligne
- Toutes les zones doivent avoir exactement 2 arbres.
- Aucun arbre ne peut être adjacent à un autre arbre, verticalement, horizontalement ou en diagonale
La solution à la disposition ci-dessus est:
Remarque: il n'y a qu'une seule solution pour chaque puzzle
Règles supplémentaires:
- Les formats d'entrée et de sortie sont facultatifs
- La sortie pourrait par exemple être une liste d'indices, une grille avec 1/0 indiquant s'il y a un arbre à cette position, ou une version modifiée de l'entrée où les arbres sont indiqués
- Le temps d'exécution doit être déterministe
- Le programme doit se terminer avec 1 minute sur l'ordinateur de @ isaacg
- Spécifications: 4 processeurs, processeur i5-4300U à 1,9 GHz, 7,5 G de RAM.
- Dans le cas où votre programme ne peut pas résoudre les deux plus grands cas de test en une minute chacun, alors le temps pour le deuxième plus grand ( n = 11 ) sera votre score. Vous perdrez contre une solution qui résout le plus gros cas.
Cas de test:
Je pourrais modifier cette liste si les soumissions semblent être personnalisées pour s'adapter à ces cas de test.
12 par 12 :
--- Input ---
aaaaabccccdd
aaaaabccccdd
aaaaabbbbddd
eeeafffgbghh
eeaafffgbghh
eefffffggghh
eeefijffghhh
iieiijjjjkhh
iiiiijjjjkhk
lljjjjjjjkkk
llllllkkkkkk
llllllkkkkkk
--- Solution ---
aaaaabcccCdD
aaaaaBcCccdd
aAaaabbbbdDd
eeeaffFgBghh
eeAaFffgbghh
eefffffGgGhh
EeefijffghhH
iiEiIjjjjkhh
IiiiijjjjkHk
lljJjJjjjkkk
lLllllkkKkkk
lllLllKkkkkk
11 par 11 :
--- Input ---
aaaaaaabbcc
adddabbbbcc
edddbbbbbbc
eddddbbbbbb
effffggghhh
effffgghhii
eefffjjhhii
eeeejjjhhii
eeejjjjkiii
jjjjjjkkiii
jjjjjkkkiii
--- Solution ---
aaAaaaabbCc
adddAbBbbcc
eDddbbbbbbC
eddDdBbbbbb
effffggGhHh
eFfffGghhii
eefFfjjhHii
EeeejjjhhiI
eeEjjjjKiii
JjjjJjkkiii
jjjjjkKkIii
10 par 10
--- Input ---
aaaaabccdd
aeaabbbccd
aeaabfbgcd
eeeaafggcd
eeeaafghcd
eeeiifghcd
ieiiigghcd
iiijighhcd
jjjjighhcd
jjjggghhdd
--- Solution ---
aaAaabccdD
aeaaBbBccd
aEaabfbgcD
eeeaaFgGcd
eEeAafghcd
eeeiiFghCd
IeiIigghcd
iiijigHhCd
JjJjighhcd
jjjgGghHdd
9 par 9
--- Input ---
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
--- Solution ---
aAbBbbbcc
adddbbBcC
adEeEcccc
AdddefgCc
hhhDiFggg
hDddifffG
hhhiIfFfg
HiHiifffg
iiiiiIgGg
--- Input ---
aaabbbccc
aaaabbccc
aaaddbcce
ffddddcce
ffffddeee
fgffdheee
fggfhhhee
iggggheee
iiigggggg
--- Solution ---
aaAbBbccc
AaaabbcCc
aaaDdBcce
fFddddcCe
fffFdDeee
fGffdheeE
fggfHhHee
IggggheeE
iiIgggGgg
la source
There shall be exactly 2 trees per column, and 2 trees per row
donc une force brute est probablement impossible.Réponses:
JavaScript (ES6), 271 octets
Prend l'entrée comme un tableau de tableaux de caractères. Renvoie un tableau de masques de bits (entiers) décrivant la position des arbres sur chaque ligne, où le bit le moins significatif est la position la plus à gauche.
Formaté et commenté
Cas de test
Cet extrait de code comprend une fonction supplémentaire pour afficher les résultats dans un format plus lisible. Il est trop lent pour résoudre le dernier cas de test.
Durée d'exécution prévue: ~ 5 secondes.
Afficher l'extrait de code
la source
C, temps officiel: 5 ms pour 12x12
Compilé avec GCC 7 en utilisant les drapeaux
-O3
et-fopenmp
. Devrait avoir des résultats similaires sur n'importe quelle version de GCC avec OpenMP installé.Les formats d'entrée et de sortie sont ceux indiqués dans la question.
Sur ma machine, cela prend
0,009s0,008s0,005s pour l'exemple 12x12 et0,022s0,020s0,019s pour exécuter tous les exemples. Sur la machine de référence, isaacg signale 5 ms pour l'exemple 12x12 en utilisant la version originale (non filetée) du code.Usage:
Juste un simple solveur de force brute, travaillant sur une ligne à la fois. Il fonctionne à une bonne vitesse en reconnaissant précocement les situations impossibles (par exemple, aucune cellule de région restante, mais moins de 2 arbres dans la région).
La première mise à jour améliore les accès au cache en rapprochant les données associées en mémoire et rend les calculs des arbres restants dans le segment légèrement plus intelligents (tient désormais compte du fait que les arbres ne peuvent pas être adjacents). Il extrait également la boucle la plus externe afin que moins de cas spéciaux soient nécessaires dans la partie la plus chaude de l'algorithme.
La deuxième mise à jour fait fonctionner la boucle la plus externe en parallèle sur les processeurs disponibles (en utilisant OpenMP), ce qui donne une augmentation de vitesse linéaire. Ceci n'est activé que pour n> = 11, car le surcoût des threads de frai l'emporte sur les avantages pour les grilles plus petites.
la source
Java (OpenJDK 8) , Timing officiel: 1.2s sur 12x12
modifier: ne plus coder le golf
Essayez-le en ligne!
La liaison TIO est destinée au cas de test 12x12. TIO signale 2.429s pour l'exécution.
Prend un tableau d'entiers comme entrée et modifie le tableau pour qu'il contienne 1s pour les arbres et 0s pour les non-arbres.
Cela fonctionne pour tous les cas de test. Le plus grand boîtier de test fonctionne sur ma machine en moins d'une seconde, bien que j'ai une machine assez puissante
Code de test pour le 12x12, peut être modifié pour d'autres
Produit ceci sur ma machine:
la source
Clingo , ≈ 7 ms pour 12 × 12, 116 octets
(Les retours à la ligne sont facultatifs et ne sont pas comptés.)
Exécutez avec
clingo plant.lp - -c n=<n>
où<n>
est la taille de la grille. Le format d'entrée est une liste d'c(X,Y,Z).
états pour chaque cellule (X
,Y
) coloréeZ
, avec 1 ≤X
,Y
,Z
≤n
, séparés par des espaces en option. La sortie inclutt(X,Y)
pour chaque arbre en (X
,Y
).Le temps n'a pas beaucoup de sens car il ne s'agit que du temps de démarrage, alors considérez cela comme un vote pour des cas de test plus importants.
Démo
Pour faciliter le traitement du format d'entrée / sortie, voici les programmes Python à convertir depuis et vers le format donné dans le défi.
Contribution
Production
la source