A sequência de trás para a frente

18

Imagine um caminho feito de <e >e terminando em um @, por exemplo,

><>@

Um caminhante começa na célula mais à esquerda. Ele percorrerá o caminho da seguinte maneira:

  • Se o caminhante estiver em uma @cela, ele alcançou a meta e está feito.
  • Se o caminhante estiver em uma >célula, todo o caminho muda um passo para a direita, ciclicamente, levando o caminhante com ele .
  • Se o caminhante estiver em uma <célula, todo o caminho se desloca um passo para a esquerda, ciclicamente, levando o caminhante com ele .
  • Depois, o caminhante dá um único passo. Se ele estiver em um dos extremos do caminho, ele se afasta do final. Caso contrário, ele continua se movendo na direção em que se moveu no último passo (ignorando a rotação), caminhando para a direita inicialmente.

Vamos trabalhar com o exemplo acima. A posição do caminhante está marcada com ^:

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

O caminhante visitou 6 células no processo (incluindo a célula inicial e a @, e contando cada célula com a mesma frequência que é visitada).

Aqui está um pequeno exemplo, onde o andador é transportado através das bordas por uma rotação:

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

Desta vez, o caminhante visitou 3 células.

Podemos facilmente transformar isso em uma sequência inteira:

  • Você recebe um número inteiro positivo N , por exemplo 9.
  • Você calcula a representação binária desse número inteiro, por exemplo 1001.
  • Em seguida, vire 1em >e 0em <e acrescentar um @: ><<>@.
  • Associamos com N o número de células visitadas pelo andador no número construído dessa maneira.

Os primeiros elementos da sequência resultante são:

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

Isso pode parecer bastante arbitrário, mas a sequência resultante acaba tendo muita estrutura:

insira a descrição da imagem aqui

Para referência, você pode encontrar os primeiros 2048 números da sequência nesta pasta .

O desafio

Você adivinhou: você deve calcular a sequência acima. Você pode fazer isso de três maneiras:

  • Você pode produzir uma sequência infinita (enquanto a memória permitir), emitindo continuamente valores (separados por caracteres não numéricos) ou usando alguma forma de gerador infinito nos idiomas que os suportam. Se você imprimir um fluxo infinito no STDOUT, não precisará imprimir os números um por um, mas verifique se todos os números serão impressos após um período finito de tempo (e em ordem). Se você usar esta opção, não deverá receber nenhuma entrada.
  • Pode levar um número inteiro N de entrada e produzir o N ° termo da sequência.
  • Você pode tomar um inteiro N como entrada e produzir tudo até o N ° termo da seqüência, como uma lista ou string usando um separador inequívoca.

Como não quero penalizar idiomas que não podem ser facilmente convertidos entre bases, em vez do número inteiro N, você pode usar a representação binária de N , usando 0s e 1s como de costume (como uma lista ou string), com o máximo de -significante primeiro.

Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).

Aplicam-se as regras de padrão .

fundo

Na verdade, isso calcula o número de "ticks" que um intérprete direto da minha linguagem de programação esotérica Labirinto precisaria para interpretar o "caminho" como código-fonte. Nesse caso, o "andador" é simplesmente o ponteiro da instrução (que possui uma posição e uma direção), o @comando finaliza o programa <e >são comandos de modificação do código-fonte.

Martin Ender
fonte
qual é necessário? 1, 2 ou 3 e como são classificadas as nossas submissões
Abr001am 27/04
@ Agawa001 "Você pode fazer isso de três maneiras:" Escolha uma delas, conforme achar mais fácil para a abordagem e o idioma que deseja usar.
Martin Ender
Por que todos os números repetidos hoje!?! codegolf.stackexchange.com/questions/78787/… : D
cat

Respostas:

6

Gelatina , 10 bytes

ð+\ḤiḤoµL‘

Esta função aceita um único número inteiro na forma da lista de seus dígitos binários como entrada.

O algoritmo é equivalente ao da resposta de @ Agawa001 .

Experimente online! ou gere os primeiros números 2048 .

fundo

Enumere as posições abaixo do caminho de 0 a L , fornecendo um total de posições L + 1 . L coincide com o número de dígitos binários do número N que codifica o caminho. Com esta notação, o caminhante começa na posição 0 , o objetivo na posição L .

A cada passo que o caminhante dá, ele se aproxima um pouco do objetivo (na direção em que está caminhando). Além disso, a cada passo do turno, dependendo de ele caminhar com ou contra a direção da mudança, ele aumenta ou diminui sua posição em 2 módulos L + 1 , ou permanece na posição atual.

Para mudar de direção, ele precisa pousar na posição L - 1 (voltada para L ) ou na posição 1 (voltada para 0 ), e depois se deslocar em sua direção. O próximo passo que ele der o trará de volta à sua posição anterior, de frente para a direção oposta.

  • Se L é par, L-1 é ímpar, então ele não pode avançar de sua posição inicial para L-1 diretamente. A única maneira de alcançá-lo é passando por L , sendo transportado para 0 e dando o próximo passo para pousar em 1 , depois avançando para a direita. Isso requer avançar posições 2L , o que pode ser feito em nada menos que L etapas.

    No entanto, depois de dar L passos sem mudar de direção, ele terá atingido a meta. Adicionando um para a célula inicial, obtemos um total de células visitadas L + 1 nesse caso.

  • Se L é ímpar, L-1 é par, então ele pode alcançar essa posição deslocando-se (L-1) / 2 vezes para a direita. Se a posição L-1 estiver abaixo de 1 naquele momento, ele será deslocado para a posição L , girará e pisará na posição L-1 (voltada para a esquerda).

    Isso pode ou não acontecer antes que ele atinja seu objetivo, então há dois casos a serem analisados:

    • Se houver menos de (L + 1) / 2 ocorrências de 1 na expansão binária de N , executar L etapas não será suficiente para virar a direção. Como essas etapas L levam o caminhante à sua meta, adicionando uma para a célula inicial, obtemos um total de células visitadas L + 1 nesse caso.

    • Se houver pelo menos (L + 1) / 2 ocorrências de 1 na expansão binária de N , avançar para a ((L + 1) / 2) quinta ocorrência exigirá I etapas, onde eu é a posição inicial dessa ocorrência de 1 .

      Assim, depois de dar os passos I , o andador está na posição L - 1 , voltado para a esquerda. Para mudar de direção novamente, ele teria que andar para a esquerda para a posição 1 . No entanto, como no caso par, já que (L - 1) - 1 é ímpar, isso exigirá passar por 0 e não dar menos que L passos.

      Como a distância inicial para o gol na direção esquerda é 1 , após dar os passos I , o caminhante se encontra à distância de I + 1 do gol após mudar de direção. Como I <L , temos que I + 1 ≤ L , então os próximos passos I + 1 o levarão à meta.

      Isso fornece um total de I + I + 1 = 2I + 1 medidas tomadas. Adicionando um para a célula inicial, obtemos um total de 2I + 1 + 1 = 2 (I + 1) células visitadas neste caso.

Como funciona

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.
Dennis
fonte
9

Matlab (pontuação = 230, n = inf)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • A função assume s como índice inicial ef como final (digite infse você deseja manter o infinito).
  • A função pode durar uma eternidade sem um intervalo de tempo notável entre dois tipos de saídas h=1000000000000000000000000000000000000000000000000000;w(h,h+1)para garantir.
  • O algoritmo segue uma abordagem matemática que explicarei mais adiante, e confirma a lista de referências de Martin, com base neste programa:

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • Como o algoritmo verifica 2048 primeiros casos de teste, assumirei cegamente que o faria para qualquer caso de teste, portanto, meu algoritmo funciona com relação a poucas propriedades que descobri nesse processo sem a necessidade de mudar e mover o ponteiro:

    1- se o dobro do número de 1 na conversão binária não exceder o comprimento da sequência, Lentão a saída seráL+1

    2- se o comprimento da sequência for regular e a condição anterior não estiver definida, a saída será a mesma L+1

    3- caso contrário, a saída será duas vezes o L/2th th de 1.

Abr001am
fonte
Você pode esclarecer o que quer dizer com "a saída é duas vezes o índice L / 2º de 1." ? É incrivelmente incerto.
orlp
@orlp nesta sequência 10010001 a segunda ocorrência de um 4 é, por 2 é 8.
Abr001am
1
Isso pode ser reduzido a pelo menos 89 bytes a=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),end, o que fornece apenas um único elemento da sequência.
David David
8

Python, 122 119 113 110 108 107 103 bytes

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

Recebe a entrada como uma lista de dígitos binários. Função auxiliar para testar:

b = lambda n: [int(d) for d in bin(n)[2:]]

Crédito para Lynn por salvar 7 bytes.

orlp
fonte
4
Banco de banco banco de banco. : D
AdmBorkBork
Não é muito, mas… suponho que p-d-1in[-2,w]economize um byte.
29
Alterar a declaração para d*=2*(1!=d-p>~w)-1economiza mais quatro! ° v °
Lynn
@ Lynn Bom uso das leis de Morgan!
Orlp
você pode fornecer uma ampla faixa de saída para comparar com a minha? thanx
Abr001am
3

Python 2, 99 bytes

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Porta Python da brilhante resposta de Agawa001.

Versão legível:

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]
orlp
fonte
@ Agawa001 Ainda não entendi seu algoritmo, mas verifiquei experimentalmente até 10 milhões.
orlp
3

MATL, 31 , 25 bytes

BXHnQtHsy2/<w2\+~?2/Hfw)E

Esta é apenas uma versão MATL do algoritmo de Agawa001, exceto que ela recebe uma entrada inteira N e retorna o N-ésimo termo na sequência. Foi complicado acompanhar todos os elementos da pilha! Eu tive que recorrer ao uso de uma prancheta para evitar enlouquecer. Você pode experimentá-lo online!

Pode ser transformado em um loop imprimindo os primeiros N termos, adicionando :"@antes e ]Ddepois do código .

Obrigado a Luis Mendo por salvar 6 bytes inteiros!

David
fonte
2

Julia 0.4, 4̷4̷ 42 bytes

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

Esta função aceita um único número inteiro na forma da lista de seus dígitos binários como entrada.

O algoritmo é equivalente ao da resposta da @ Agawa001 e da minha resposta Jelly .

Experimente online!

Como funciona

find(x)retorna os índices baseados em 1 de todos os elementos diferentes de zero de x . Tentamos acessar a matriz resultante no índice k / 2 e, se for bem-sucedido, sobrescrevemos k com o dobro do índice selecionado.

Isso falhará se e somente se uma das seguintes opções for verdadeira:

  • k / 2 é um float não integral e, portanto, InexactError é gerado.

  • A matriz de índice possui menos de k / 2 elementos, portanto, um BoundsError é gerado.

Em ambos os casos, a substituição de k falhará e, portanto, seu valor original será retornado.

Dennis
fonte
1

JavaScript (ES6), 65 bytes

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

Aceita uma cadeia de caracteres binária. Usa a verificação de devolução das várias outras respostas.

Neil
fonte
1

Python 2, 74 bytes

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

Esta função aceita um único número inteiro na forma da lista de seus dígitos binários como entrada.

O algoritmo é equivalente ao da resposta da @ Agawa001 e da minha resposta Jelly .

Teste em Ideone .

Como funciona

nexttenta encontrar o primeiro número inteiro 2i para o qual k==2*sum(x[:i])retorna true. Como x[:i]contém elementos i , isso fornece o índice baseado em 1 do (k / 2) th 1 .

nextfalhará se k / 2 for não integral ou se x contiver menos que k / 2 uns. Nesse caso, o valor padrão k é retornado.

Dennis
fonte
0

> <> , 63 bytes

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

Desde o momento em que vi o padrão de exemplo neste desafio, eu sabia qual idioma usar :)

Usando N para obter o N º prazo.

Entrada assumida como sendo binária na pilha. Em vez de mover o andador, essa solução depende principalmente do movimento da fita sob o andador.

Experimente online!

Hohmannfan
fonte