Começando com a sequência ABC
, considere o resultado de anexar repetidamente a última metade de si mesma (usando a metade maior se o comprimento for ímpar).
Temos a progressão:
ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...
Vamos S
representar a sequência (ou sequência) infinita resultante que resulta como esse procedimento é repetido para sempre.
Objetivo
O objetivo neste desafio de código é encontrar o índice da primeira ocorrência de execuções de C
's in S
.
É fácil no começo: C
ocorre primeiro no índice 2
, CC
em 4
, CCC
em 7
, CCCC
em 26
, mas CCCCC
é todo o caminho no índice 27308
! Depois disso, minha memória se esgota.
O vencedor será o envio que gerar corretamente os índices mais executados (em ordem, começando em C
). Você pode usar qualquer tipo de algoritmo, mas não se esqueça de explicá-lo se não estiver usando força bruta básica. A entrada e a saída podem estar em qualquer formato fácil de entender.
Nota importante: Não sei oficialmente se S
contém ou não todas as execuções C
. Essa questão é derivada dessa pergunta no Mathematics Stack Exchange , na qual o autor também não encontrou CCCCCC
. Estou curioso para saber se alguém aqui pode. (Essa pergunta, por sua vez, é baseada na minha pergunta original sobre o assunto .)
Se você puder provar que nem todas as execuções C
ocorrem S
, você vencerá automaticamente, pois essa pergunta não será mais válida. Se ninguém puder provar isso nem encontrar CCCCCC
, o vencedor será a pessoa que conseguirá o limite inferior mais alto no índice de CCCCCC
(ou qualquer que seja a maior execução não resolvida, se CCCCCC
for encontrada).
Atualização: Muitos elogios para isaacg e res que encontraram CCCCCC
no índice astronômico de 2.124 * 10 ^ 519. Nesse ritmo, não consigo imaginar encontrar CCCCCCC
um método que dependa da força bruta. Bom trabalho pessoal!
fonte
CCCCC
no índice 27308, mas depois parece que não sabe onde ocorre pela primeira vez. Você quis dizerCCCCCC
?Respostas:
Encontrado em 2,124 * 10 ^ 519.
índice é preciso 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
Encontrado por res, usando o código (versão antiga) abaixo, após 3,5 horas de pesquisa.
Em torno desse índice, a sequência é:
...BCCBCBCCCBCCCCCCBCCB...
Para verificar, altere a linha indicada no código abaixo para iniciar em 2946, em vez de 5. A verificação leva 20 segundos.
Atualização: Programa aprimorado. O programa antigo pesquisou ~ 10x mais locais do que o necessário.
Nova versão encontra o
CCCCCC
em apenas 33 minutos.Como o código funciona: Basicamente, apenas olho para as regiões que correspondem às extremidades das seqüências incrementais e calculo as letras olhando recursivamente para a sequência original. Observe que ele usa uma tabela de notas, que pode encher sua memória. Coloque uma tampa no comprimento da tabela de notas, se necessário.
Máximo atual pesquisado para: 4000 iterações
CCCCCC
encontrado na (s) iteração (ões): 2946fonte
sys.setrecursionlimit(4000)
eULIMIT=4000
, encontrou (em cerca de 3,5 horas no meu sistema) a primeira ocorrência de CCCCCC no índice = 2,124 * 10 ^ 519. O índice exato está no próximo comentário ...Encontrado em 2,124 * 10 ^ 519.
O seguinte código ruby foi usado para procurar
CCCCCC
.O índice é o mesmo da resposta de @isaacg .
O tempo de execução do código acima para 6 é da ordem de dez segundos no meu computador. No entanto, ainda é possível procurar uma resposta
CCCCCCC
(se você quiser tentar definir constantementeSEARCH
como7
).Você pode usar
getc
para encontrar o caractere em uma posição específica,i
como é feito na última linha em que a cadeia de caracteres ao redor do índice é impressa.fonte
(Não é uma resposta, mas muito tempo para um comentário.)
A seguir, uma tradução em Python do programa Ruby do @ Howard (acelerada por um fator próximo a 3 por ter apenas um
getc
no loop de pesquisa). No meu sistema, este encontra o primeiro C ^ 6 em 3 segundos. Em 93 horas, ele não encontra C ^ 7 em 231.000 iterações; portanto, o primeiro C ^ 7 (se existir) deve ocorrer após as 10 ^ 40677 posições mais à esquerda na cadeia infinita.fonte