Conforme o pedido de Luke e a adição de Peter Taylor a esse desafio.
Introdução
Todo mundo conhece o jogo da velha, mas neste desafio, vamos apresentar uma pequena reviravolta. Nós vamos apenas usar cruzes . A primeira pessoa que coloca três cruzamentos consecutivos perde. Um fato interessante é que a quantidade máxima de cruzamentos antes que alguém perca é igual a 6 :
X X -
X - X
- X X
Isso significa que, para uma placa 3 x 3, o valor máximo é 6 . Portanto, para N = 3, precisamos gerar 6.
Outro exemplo, para N = 4, ou uma placa 4 x 4:
X X - X
X X - X
- - - -
X X - X
Esta é uma solução ideal, você pode ver que a quantidade máxima de cruzamentos é igual a 9 . Uma solução ideal para uma placa 12 x 12 é:
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
Isso resulta em 74 .
A tarefa
Sua tarefa é calcular os resultados o mais rápido possível. Vou executar seu código no caso de teste 13
. Isso será feito 5 vezes e, em seguida, a média é obtida dos tempos de execução. Essa é a sua pontuação final. Quanto mais baixo, melhor.
Casos de teste
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
Mais informações podem ser encontradas em https://oeis.org/A181018 .
Regras
- Esse é o código mais rápido , então a submissão mais rápida vence!
- Você deve fornecer um programa completo .
- Forneça também como eu tenho que executar o programa. Não conheço todas as linguagens de programação e como elas funcionam, por isso preciso de um pouco de ajuda aqui.
- Obviamente, seu código precisa calcular o resultado correto para cada caso de teste.
Submissões:
- feersum (C ++ 11): 28s
- Peter Taylor (Java): 14m 31s
Respostas:
C ++ 11, 28s
Isso também usa uma abordagem de programação dinâmica baseada em linhas. Foram necessários 28 segundos para executar o argumento 13 para mim. Meu truque favorito é a
next
função que usa algumas falhas para encontrar o arranjo lexicograficamente da próxima linha que satisfaça uma máscara e a regra de não-3-em-uma-linha.Instruções
g++ -std=c++11 -march=native -O3 <filename>.cpp -o <executable name>
<executable name> <n>
fonte
Java, 14m 31s
Este é essencialmente o programa que eu publiquei no OEIS depois de usá-lo para estender a sequência, por isso é uma boa referência para outras pessoas vencerem. Ajustei o tamanho do quadro como o primeiro argumento da linha de comando.
Salvar em
A181018.java
; compilar comojavac A181018.java
; correr comojava A181018 13
. No meu computador, são necessários cerca de 20 minutos para executar essa entrada. Provavelmente valeria a pena paralelizar isso.fonte
n=16
; Extrapolei que levaria cerca de um mês porn=17
isso não tentei executá-lo por isso. O uso da memória também estava se tornando um grande incômodo. (PS Eu estou usando atualmente 2 dos meus 4 núcleos para um desafio de programação não-PPCG: azspcs.com/Contest/Tetrahedra/Standings )