Selon la demande de Luke et l'ajout de Peter Taylor à ce défi.
introduction
Tout le monde connaît le jeu tic-tac-toe, mais dans ce défi, nous allons introduire un petit twist. Nous n'utiliserons que des croix . La première personne qui place trois croix d'affilée perd. Un fait intéressant est que le nombre maximum de croix avant que quelqu'un ne perde, est égal à 6 :
X X -
X - X
- X X
Cela signifie que pour une carte 3 x 3, le montant maximum est de 6 . Donc, pour N = 3, nous devons produire 6.
Un autre exemple, pour N = 4, ou une carte 4 x 4:
X X - X
X X - X
- - - -
X X - X
Ceci est une solution optimale, vous pouvez voir que le nombre maximum de croix est égal à 9 . Une solution optimale pour une carte 12 x 12 est:
X - X - X - X X - X X -
X X - X X - - - X X - X
- X - X - X X - - - X X
X - - - X X - X X - X -
- X X - - - X - - - - X
X X - X X - X - X X - -
- - X X - X - X X - X X
X - - - - X - - - X X -
- X - X X - X X - - - X
X X - - - X X - X - X -
X - X X - - - X X - X X
- X X - X X - X - X - X
Il en résulte 74 .
La tâche
Votre tâche consiste à calculer les résultats le plus rapidement possible. Je vais exécuter votre code sur le cas de test 13
. Cela sera fait 5 fois, puis la moyenne des temps d'exécution est prise. C'est votre score final. Plus c'est bas, mieux c'est.
Cas de test
N Output
1 1
2 4
3 6
4 9
5 16
6 20
7 26
8 36
9 42
10 52
11 64
12 74
13 86
14 100
15 114
Plus d'informations peuvent être trouvées sur https://oeis.org/A181018 .
Règles
- C'est le code le plus rapide, donc la soumission la plus rapide gagne!
- Vous devez fournir un programme complet .
- Veuillez également indiquer comment je dois exécuter le programme. Je ne connais pas tous les langages de programmation et leur fonctionnement, j'ai donc besoin d'un peu d'aide ici.
- Bien sûr, votre code doit calculer le résultat correct pour chaque scénario de test.
Soumissions:
- feersum (C ++ 11): 28s
- Peter Taylor (Java): 14 min 31 s
Réponses:
C ++ 11, 28s
Cela utilise également une approche de programmation dynamique basée sur des lignes. Il m'a fallu 28 secondes pour exécuter l'argument 13 pour moi. Mon astuce préférée est la
next
fonction qui utilise un peu de dénigrement pour trouver l'arrangement lexicographiquement suivant de la ligne satisfaisant un masque et la règle no-3-in-a-row.Instructions
g++ -std=c++11 -march=native -O3 <filename>.cpp -o <executable name>
<executable name> <n>
la source
Java, 14m 31s
C'est essentiellement le programme que j'ai publié sur OEIS après l'avoir utilisé pour étendre la séquence, c'est donc une bonne référence pour les autres. Je l'ai modifié pour prendre la taille de la carte comme premier argument de ligne de commande.
Enregistrer dans
A181018.java
; compiler en tant quejavac A181018.java
; exécuter commejava A181018 13
. Sur mon ordinateur, l'exécution de cette entrée prend environ 20 minutes. Il vaudrait probablement la peine de le paralléliser.la source
n=16
; J'ai extrapolé que cela prendrait environ un moisn=17
, donc je n'ai pas essayé de l'exécuter pour ça. L'utilisation de la mémoire devenait également une nuisance majeure. (PS J'utilise actuellement 2 de mes 4 cœurs pour un défi de programmation non-PPCG: azspcs.com/Contest/Tetrahedra/Standings )