Introdução
Suponha por um momento que as víboras e o penhasco estejam a apenas dois passos, em vez de três.
o
---
Hsss! |
';;' ___ /_\ ___ _
|
Você é, infelizmente, prisioneiro de um torturador sádico. Você deve dar um passo à esquerda ou à direita a cada curva. Caso contrário, eles matam você instantaneamente. Você tem permissão para planejar suas etapas com antecedência, mas depois de dar sua primeira etapa, você não poderá alterar seu plano. (E também não demore; eles vão atirar em você.)
De repente, uma idéia brilhante vem à mente ...
Ah! Eu posso apenas alternar pisando direita e esquerda! Passo para a direita, passo para a esquerda, passo para a direita, passo para a esquerda e assim por diante ...
Ah ah ah, não tão rápido. Como eu disse, o torturador é sádico. Eles escolhem se você dá cada passo, ou segundo passo, ou terceiro passo, e assim por diante. Portanto, se você escolher ingenuamente a sequência RLRLRL...
, eles poderão forçá-lo a dar cada segundo passo, que começa com LL
. Oh! Você foi mordido por víboras! A escuridão toma conta de você e tudo mais desaparece ...
Na verdade não, você ainda não está morto. Você ainda precisa propor seu plano. Depois de pensar por alguns minutos, você percebe que está condenado. Não há como planejar uma série de etapas que garantam sua sobrevivência. O melhor que você pode fazer é RLLRLRRLLRR
. 1 Onze etapas seguras e nada mais. Se o décimo segundo passo for R
, o Torturador fará com que você dê todos os passos e, em seguida, os três últimos passos o enviarão do penhasco. Se o décimo segundo passo for L
, o Torturador fará com que você dê cada terceiro passo ( LRLL
), o que o coloca bem na ninhada de víboras e suas mordidas letais.
Você escolhe R
o décimo segundo passo, esperando adiar sua morte o maior tempo possível. Com o vento rugindo em seus ouvidos, você se pergunta ...
E se eu tivesse três etapas?
Alerta de spoiler!
Você ainda morreria. Acontece que, não importa quantos passos você tenha, haverá algum momento em que, independentemente da escolha que você faça, há uma sequência de passos que seu Torturador pode seguir para garantir que você cumpra seu destino mortal. 2 No entanto, quando as víboras e o penhasco estão a três passos, você pode fazer um total de 1160 etapas seguras e, quando estão a quatro etapas, existem pelo menos 13.000 etapas seguras! 3
O desafio
Dado um único número inteiro n < 13000
, produza uma sequência de n
etapas seguras, assumindo que o penhasco e as víboras estão a quatro passos.
Regras
- Pode ser um programa completo ou uma função.
- A entrada pode ser obtida através de STDIN ou equivalente, ou como argumento de função.
- Saída deve ter dois caracteres distintos (que pode ser
+/-
,R/L
,1/0
, etc.). - Qualquer espaço em branco na saída não importa.
- A codificação embutida de uma solução não é permitida. Isso banalizaria esse desafio.
- Seu programa deve (em teoria) terminar em uma quantidade decente de tempo. Como
n=13000
pode demorar um mês, mas não deve demorar mil anos ou mais. Ou seja, sem força bruta. (Bem, pelo menos tente evitá-lo.) - Bônus de vida: forneça uma série de
2000
etapas seguras. Se você fizer isso, o Torturador ficará tão impressionado com sua tenacidade, perseverança e premeditação que eles deixarão você viver. Desta vez. (Trate esta sequência como um número binário e forneça o equivalente decimal para verificação. Isso visa recompensar respostas que terminam rapidamente, pois as respostas podem demorar muito tempo.) - Pontuação: bytes , a menos que você se qualifique para o bônus - multiplique por 0,75 .
1 Há uma boa explicação sobre esse problema e a "solução" de uma das estrelas do Numberphile, James Grime, em seu canal do YouTube aqui: https://www.youtube.com/watch?v=pFHsrCNtJu4 .
2 Essa conjectura de 80 anos, conhecida como problema de discrepância de Erdos, foi provada muito recentemente por Terence Tao. Aqui está um artigo muito bom na Revista Quanta sobre isso: https://www.quantamagazine.org/20151001-tao-erdos-discrepancy-problem/ .
3 Fonte: Um ataque do SAT à conjectura de discrepância de Erdos , de Boris Konev e Alexei Lisitsa. Retirado daqui: http://arxiv.org/pdf/1402.2184v2.pdf .
fonte
n=13000
, as primeiras 2000 instruções ganharão um bônus? Parece inútil, então você provavelmente quis dizer outra coisa?n=13000
dentro de um ano, talvez dez. Você vai esperar um mêsn=2000
? Provavelmente não. E se o fizer , você merece o bônus de qualquer maneira.Respostas:
Java, 915 * 0,75 = 686,25
A entrada é aceita como um argumento da linha de comandos.
Isso tenta quase todas as possibilidades (a única restrição é que os oito primeiros passos só devem ir dentro de -1..1), indo passo a passo, usando uma heurística mágica de vodu para escolher qual caminho tentar primeiro.
Resolve 2000 e até 4000 em 1 segundo no meu computador (bastante rápido). Precisa de mais RAM para números maiores; a maior entrada que resolvi em 8 GB é 5023 e demorou cerca de 30 segundos.
Representação decimal da solução para as etapas de 2000, conforme exigido para o bônus:
Acrescente
Yb
a ele no CJam para converter novamente em binário.Sobre a heurística: primeiro, há um padrão que estou usando: a cada 9 etapas, tente repetir as 9 primeiras, exceto a cada 9 (x) etapa, tente repetir a décima segunda etapa. Isso é inspirado na solução que baixei e usei (codificada) na minha resposta python.
Estou acompanhando o número de vezes que me desviei do padrão e também o número de vezes que cheguei a um "limite" (1 passo após a morte). A função heurística é basicamente uma combinação ponderada desses 2 números e o número de etapas executadas até o momento.
A heurística pode ser aprimorada ainda mais para melhorar a velocidade, e existem várias maneiras de adicionar um fator aleatório a ela também.
De fato, acabei de ler sobre funções multiplicativas em relação a esse problema, e parece que isso pode proporcionar uma melhoria significativa (TODO: implemente isso mais tarde).
Ungolfed e comentou:
fonte
Python 2, 236 bytes
Isso é bastante rápido, para um método de força bruta, levando apenas alguns segundos para n = 223, mas muito mais tempo para n> = 224.
Explicação: Mantenha o controle de uma lista de pares de listas de cadeias (s, u), em que a lista u é tal que u [i] é a posição atual depois de seguir cada i-ésimo passo na cadeia. Para cada sequência da lista, tente adicionar "L" ou "R" e altere os valores na lista que se cruzam. (ou seja, se a sequência resultante tiver comprimento 10, adicione ou subtraia 1 das posições 1,2,5 e 10, de acordo com as instruções que você moveu). Se você exceder 3 ou -3, jogue o novo par fora, caso contrário, mantenha-o na lista. As seqüências mais longas são mantidas no final. Depois de ter uma sequência de comprimento n, retorne-a.
fonte
//
estava disponível no python 2. #Python 2, 729 bytes
Eu acho que isso também se qualifica para o bônus se a idéia for "recompensar respostas que terminem rapidamente".
No entanto, essa é uma resposta codificada, que não está no espírito do desafio (embora não seja explicitamente proibida quando eu a escrevi).
fonte