Inspirado pela grande caça aos ovos de Páscoa da API!
Sumário
Sua tarefa é procurar um número inteiro predeterminado no "espaço Collatz" (a ser explicado posteriormente) usando o menor número possível de etapas.
Introdução
Esse desafio é baseado na famosa conjectura de Collatz, da qual esperamos que todos aqui pelo menos tenham ouvido falar. Aqui está um resumo de Imprimir os números Super Collatz .
A sequência Collatz (também chamada de problema 3x + 1) é onde você começa com um número inteiro positivo; neste exemplo, usaremos 10 e aplicaremos este conjunto de etapas:
if n is even: Divide it by 2 if n is odd: Multiply it by 3 and add 1 repeat until n = 1
A distância Collatz C(m,n)
entre os dois números m
e n
, para o objetivo deste desafio, é a distância entre dois números no gráfico Collatz (créditos para @tsh por me falar sobre esse conceito), que é definida da seguinte forma: (usando 21
e 13
como exemplos ):
Anote a sequência Collatz para m
(neste caso 21
):
21, 64, 32, 16, 8, 4, 2, 1
Anote a sequência Collatz para n
(neste caso 13
):
13, 40, 20, 10, 5, 16, 8, 4, 2, 1
Agora conte quantos números aparecem apenas em uma das seqüências. Isso é definido como a distância da Collatz entre m
e n
. Nesse caso 8
, ou seja,
21, 64, 32, 13, 40, 20, 10, 5
Portanto, temos a distância de Collatz entre 21
e 13
como C(21,13)=8
.
C(m,n)
tem as seguintes boas propriedades:
C(m,n)=C(n,m)
C(m,n)=0 iff. m=n
Esperemos que a definição de C(m,n)
agora seja clara. Vamos começar a caçar ovos no espaço Collatz!
No início do jogo, um controlador decide a posição de um ovo de páscoa, que é expresso por sua coordenada unidimensional: Um número inteiro no intervalo [p,q]
(em outras palavras, um número inteiro entre p
e q
, ambas as extremidades, inclusive).
A posição do ovo permanece constante durante todo o jogo. Denotaremos essa coordenada como r
.
Agora você pode fazer um palpite inicial de 0 e ele será gravado pelo controlador. Esta é sua 0ª rodada. Se você tiver tanta sorte que acertou em primeiro lugar (ou seja, 0 = r), o jogo termina e sua pontuação é 0
(quanto menor a pontuação, melhor). Caso contrário, você entra na 1ª rodada e faz um novo palpite a 1 , isso continua até você acertar, ou seja, n = r, e sua pontuação será n
.
Para cada rodada após o dia 0, o controlador fornece um dos seguintes feedbacks para que você possa adivinhar melhor com base nas informações fornecidas. Vamos supor que você esteja atualmente na n
ronda e, portanto, seu palpite é n
- "Você achou!" se n = r, nesse caso o jogo termina e você marca
n
. - "Você está mais perto :)" se C (a n , r) <C (a n-1 , r)
- "Você está circulando em torno do ovo" se C (a n , r) = C (a n-1 , r)
- "Você está mais longe :(" se C (a n , r)> C (a n-1 , r)
Para salvar alguns bytes, chamarei as respostas como "Direita", "Mais próxima", "Mesmo", "Mais longe", na ordem apresentada acima.
Aqui está um exemplo de jogo com p=1,q=15
.
- a 0 = 10
- a 1 = 11, resposta: "Mais próximo"
- a 2 = 13, resposta: "Mais longe"
- a 3 = 4, resposta: "Mais longe"
- a 4 = 3, resposta: "Mais próximo"
- a 5 = 5, resposta: "Mesmo"
- a 6 = 7, resposta: "Certo"
Pontuação: 6
.
Desafio
Crie uma estratégia determinística para jogar p=51, q=562
com a melhor pontuação.
As respostas devem descrever os algoritmos em detalhes. Você pode anexar qualquer código que ajude a elucidar o algoritmo. Como não é um codegolf, você deve escrever um código legível.
As respostas devem incluir a pior pontuação possível para todos os casos possíveis r
e a que tiver a pior pontuação mais baixa vence. No caso de empate, os algoritmos com melhor pontuação média para todos os r
s possíveis (que também devem ser incluídos nas respostas) vencem. Não há mais desempates e podemos ter vários vencedores no final.
Especificações
- Para reiterar,
r
está no intervalo[51,562]
. - Aplicam-se brechas padrão .
Recompensa (adicionada após a primeira resposta ser publicada)
Pessoalmente, posso oferecer uma recompensa a uma resposta em que todas as suposições são feitas dentro do intervalo [51,562]
e ainda tendo uma pontuação mais baixa razoavelmente baixa.
fonte
Respostas:
Ruby, 196
Isso foi muito mais difícil do que eu pensava inicialmente. Eu tive que lidar com muitos casos obscuros e acabei com um monte de código feio. Mas foi muito divertido! :)
Estratégia
Toda sequência de Collatz termina com uma sequência de potências de 2 (ex: [16, 8, 4, 2, 1]). Assim que uma potência de 2 é encontrada, dividimos por 2 até chegarmos a 1. Vamos chamar a primeira potência de 2 em uma sequência mais próxima de pow2 (pois essa também é a potência mais próxima de 2 do nosso número usando a distância de Collatz). Para o intervalo especificado (51-562), todos os números pow2 mais próximos possíveis são: [16, 64, 128, 256, 512, 1024]
Versão curta
O algoritmo executa:
Versão detalhada
Dado um jogo com o número alvo
r
, a estratégia é a seguinte:r
no menor número de etapas possível.Os resultados
A execução do algoritmo para todos os números no intervalo 51-562 leva cerca de um segundo em um PC normal e a pontuação total é 38665.
O código
Experimente online!
fonte
pior pontuação: 11, soma resultado: 3986
Todas as suposições estão ao alcance
[51,562]
.Meu algoritmo:
vals
, inicialmente o conjunto contém todos os números no intervalo[51,562]
.Em cada etapa, faça o seguinte:
guess
no intervalo[51,562]
de tal modo que, quando os valores emvals
(excluindo oguess
próprio) é dividida em 3 conjuntos correspondentes aos resultados possíveisCloser
,Same
eFarther
, o tamanho máximo dos conjuntos 3 é mínima.Se houver vários valores possíveis de
guess
satisfazer o acima, escolha o menor.guess
.vals
que eles não possam dar esse resultado.Minha implementação de referência escrita em C ++ e Bash é executada em cerca de 7,6 segundos na minha máquina e fornece a pior pontuação de pontuação / soma, conforme descrito no título.
A tentativa de todos os valores possíveis de primeira estimativa leva cerca de 1,5 horas na minha máquina. Eu posso considerar fazer isso.
fonte