La sequenza Back-and-Forth


18

Immagina un percorso fatto di <e >che termina in un @, ad es

><>@

Un camminatore inizia nella cella più a sinistra. Attraverserà il percorso come segue:

  • Se il camminatore è su una @cella, ha raggiunto l'obiettivo e il gioco è fatto.
  • Se il deambulatore si trova su una >cella, l'intero percorso sposta ciclicamente di un passo verso destra , portando con sé il deambulatore .
  • Se il deambulatore si trova su una <cella, l'intero percorso si sposta di un passo a sinistra, ciclicamente, portando con sé il deambulatore .
  • Successivamente, il camminatore fa un singolo passo. Se è alle due estremità del percorso, si allontana dalla fine. Altrimenti continua a muoversi nella direzione in cui si è spostato sull'ultimo gradino (ignorando la rotazione), camminando inizialmente a destra.

Esaminiamo l'esempio sopra. La posizione del camminatore è contrassegnata con ^:

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

Il walker ha visitato 6 celle nel processo (inclusa la cella di partenza e la @e contando ogni cella tutte le volte che è stata visitata).

Ecco un piccolo esempio, in cui il deambulatore viene trasportato attraverso i bordi mediante una rotazione:

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

Questa volta il camminatore ha visitato 3 celle.

Possiamo facilmente trasformarlo in una sequenza intera:

  • Ti viene dato un numero intero positivo N , ad es 9.
  • Si calcola la rappresentazione binaria di questo numero intero, ad es 1001.
  • Poi girare 1in >e 0in <e aggiungere un @: ><<>@.
  • Associamo a N il numero di celle visitate dal walker nel numero costruito in questo modo.

I primi elementi della sequenza risultante sono:

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

Questo può sembrare abbastanza arbitrario, ma la sequenza risultante in realtà risulta avere molta struttura:

inserisci qui la descrizione dell'immagine

Per riferimento, puoi trovare i primi 2048 numeri della sequenza in questo pastebin .

La sfida

Hai indovinato: devi calcolare la sequenza sopra. Puoi farlo in tre modi:

  • È possibile produrre una sequenza infinita (mentre la memoria lo consente), emettendo continuamente valori (separati da caratteri non numerici) o utilizzando una forma di generatore infinito in linguaggi che li supportano. Se stampi un flusso infinito su STDOUT, non devi stampare i numeri uno per uno, ma assicurati che ogni numero venga stampato dopo un periodo di tempo limitato (e in ordine). Se usi questa opzione, non dovresti prendere alcun input.
  • Si può prendere un numero intero N come input e produrre la N esimo termine della sequenza.
  • Si può prendere un numero intero N come input e prodotti tutto fino alla N esimo termine della sequenza, come elenco o stringa utilizzando un separatore univoca.

Dato che non voglio penalizzare le lingue che non possono essere facilmente convertite tra le basi, invece dell'intero N puoi invece prendere la rappresentazione binaria di N , usando 0s e 1s come al solito (come un elenco o una stringa), con il maggior numero -significante prima di tutto.

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).

Si applicano le regole standard del .

sfondo

Questo in realtà calcola il numero di "tick" che un interprete diretto del mio linguaggio di programmazione esoterico Labyrinth avrebbe bisogno di interpretare il "percorso" come codice sorgente. In tal caso, il "walker" è semplicemente il puntatore dell'istruzione (che ha una posizione e una direzione), il @comando termina il programma <e >sono comandi di modifica del codice sorgente.


quale di è richiesto? 1, 2 o 3 e come vengono assegnati i nostri contributi
Abr001,

@ Agawa001 "Puoi farlo in tre modi:" Scegli uno di essi, a seconda di quale ritieni sia più semplice per l'approccio e la lingua che desideri utilizzare.
Martin Ender,

Perché tutti i numeri ripetuti oggi!?! codegolf.stackexchange.com/questions/78787/… : D
cat

Risposte:


6

Gelatina , 10 byte

ð+\ḤiḤoµL‘

Questa funzione accetta come input un unico numero intero sotto forma di elenco delle sue cifre binarie.

L'algoritmo è equivalente a quello della risposta di @ Agawa001 .

Provalo online! o generare i primi numeri 2048 .

sfondo

Enumera le posizioni sotto il percorso da 0 a L , per un totale di L + 1 posizioni. L coincide con il numero di cifre binarie del numero N che codifica il percorso. Con questa notazione, il camminatore inizia alla posizione 0 , l'obiettivo nella posizione L .

Ad ogni passo del camminatore, si avvicina di un passo all'obiettivo (nella direzione in cui sta camminando). Inoltre, ad ogni passo del cambio, a seconda che cammini con o contro la direzione del cambio, incrementa o decrementa la sua posizione di 2 modulo L + 1 o rimane nella posizione corrente.

Per cambiare direzione, deve atterrare sulla posizione L - 1 (rivolta verso L ) o sulla posizione 1 (rivolta verso 0 ), quindi spostarsi nella sua direzione. Il prossimo passo che farà lo riporterà alla sua posizione precedente, rivolto nella direzione opposta.

  • Se L è pari, L - 1 è dispari, quindi non può avanzare direttamente dalla sua posizione iniziale a L - 1 . L'unico modo per raggiungerlo è passare attraverso L , portarsi a 0 e fare il passo successivo per atterrare su 1 , quindi avanzare a destra. Ciò richiede l'avanzamento di posizioni 2L , che può essere fatto in non meno di L passi.

    Tuttavia, dopo aver fatto L passi senza cambiare direzione, avrà raggiunto l'obiettivo. Aggiungendo uno per la cella iniziale, in questo caso otteniamo un totale di L + 1 celle visitate.

  • Se L è dispari, L - 1 è pari, quindi può raggiungere quella posizione spostandosi (L - 1) / 2 volte a destra. Se la posizione L - 1 è al di sotto di un 1 in quel momento, verrà spostato in posizione L , si girerà e passerà in posizione L - 1 (rivolto verso sinistra).

    Questo può accadere o meno prima che raggiunga il suo obiettivo, quindi ci sono due casi da analizzare:

    • Se ci sono meno di (L + 1) / 2 occorrenze di 1 nell'espansione binaria di N , fare passi a L non sarà sufficiente per girare la direzione. Poiché questi passaggi L portano il walker al suo obiettivo, aggiungendo uno per la cella iniziale, in questo caso otteniamo un totale di L + 1 celle visitate.

    • Se ci sono almeno (L + 1) / 2 occorrenze di 1 nell'espansione binaria di N , avanzamento alla ((L + 1) / 2) th verificarsi richiederà I passi, dove I è la posizione iniziale di tale occorrenza di 1 .

      Così, dopo aver I passi, il deambulatore in posizione L - 1 , rivolto verso sinistra. Per girare di nuovo le direzioni, avrebbe dovuto avanzare a sinistra in posizione 1 . Tuttavia, come nel caso pari, poiché (L - 1) - 1 è dispari, ciò richiederà di passare attraverso 0 e di fare almeno i passi L.

      Poiché la distanza iniziale dall'obiettivo nella direzione sinistra è 1 , dopo aver fatto I passi, il camminatore si trova alla distanza di I + 1 dall'obiettivo dopo aver cambiato direzione. Dato che I <L , abbiamo che I + 1 ≤ L , quindi i prossimi passi I + 1 lo porteranno all'obiettivo.

      Questo dà un totale di I + I + 1 = 2I + 1 prese. Aggiungendo uno per la cella iniziale, otteniamo un totale di 2I + 1 + 1 = 2 (I + 1) celle visitate in questo caso.

Come funziona

ð+\Ḥ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.

9

Matlab (punteggio = 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
  • La funzione prende s come indice iniziale e f come fine (digita infse vuoi continuare all'infinito).
  • La funzione può andare per sempre senza alcun notevole ritardo tra due tipi di uscite h=1000000000000000000000000000000000000000000000000000;w(h,h+1)per essere sicuri.
  • L'algoritmo segue un approccio matematico che spiegherò più avanti e conferma l'elenco di riferimento di Martin, basato su questo programma:

    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
    
  • Dal momento che l'algoritmo verifica 2048 primi casi di test, presumo ciecamente che lo farebbe per qualsiasi caso di test, quindi il mio algoritmo funziona relativamente a poche proprietà che ho scoperto in questo processo senza il dolore di spostare e spostare il puntatore:

    1- se il doppio del numero di 1 nella traduzione binaria non supera la lunghezza del sequnce, Lquindi l'output èL+1

    2- se la lunghezza della sequenza è pari e la condizione precedente non è impostata, quindi l'uscita è la stessa L+1

    3- altrimenti, l'output è il doppio L/2dell'indice th di 1.


Puoi chiarire cosa intendi con "l'output è il doppio dell'indice L / 2 di 1". ? È incredibilmente poco chiaro.
orlp,

@orlp in questa sequenza 10010001 la seconda occorrenza di 1 è 4, per 2 è 8.
Abr001am

1
Questo può essere golfato fino ad almeno 89 byte 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, il che fornisce solo un singolo elemento della sequenza.
David,

8

Python, 122 119 113 110 108 107 103 byte

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

Accetta input come un elenco di cifre binarie. Funzione di supporto per testare:

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

Ringraziamo Lynn per aver salvato 7 byte.


4
Pew Pew Pew. : D
AdmBorkBork,

Non è molto, ma ... suppongo che p-d-1in[-2,w]salva un byte.
Lynn,

Cambiando la dichiarazione per d*=2*(1!=d-p>~w)-1salvarne altre quattro! ° v °
Lynn,

@Lynn Bel uso delle leggi di de Morgan!
orlp,

puoi fornire un ampio intervallo di output da confrontare con il mio? grazie
Abr001am

3

Python 2, 99 byte

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

Python port della brillante risposta di Agawa001.

Versione leggibile:

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]

@ Agawa001 Non ho ancora capito il tuo algoritmo, ma l'ho verificato sperimentalmente fino a 10 milioni.
orlp,

3

MATL, 31 , 25 byte

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

Questa è solo una versione MATL dell'algoritmo di Agawa001, tranne per il fatto che accetta un input intero N e restituisce il termine N-esimo nella sequenza. È stato difficile tenere il passo con tutti gli elementi nella pila! Ho dovuto ricorrere all'uso degli appunti per evitare di impazzire. Puoi provarlo online!

Può essere trasformato in un ciclo stampando i primi N termini aggiungendo :"@prima del codice e ]Ddopo.

Grazie a Luis Mendo per aver salvato 6 byte interi!


2

Julia 0.4, 4̷4̷ 42 byte

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

Questa funzione accetta come input un unico numero intero sotto forma di elenco delle sue cifre binarie.

L'algoritmo è equivalente a quello della risposta di @ Agawa001 e della mia risposta di Jelly .

Provalo online!

Come funziona

find(x)restituisce gli indici basati su 1 di tutti gli elementi diversi da zero di x . Tentiamo di accedere all'array risultante all'indice k / 2 e, in caso di successo, sovrascriviamo k con il doppio dell'indice selezionato.

Ciò fallirà se e solo se una delle seguenti condizioni è vera:

  • k / 2 è un float non integrale, quindi viene generato InexactError .

  • La matrice dell'indice ha meno di k / 2 elementi, quindi viene generato un errore BoundsError .

In entrambi i casi, la sovrascrittura di k fallirà, quindi verrà restituito il suo valore originale.


1

JavaScript (ES6), 65 byte

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

Accetta una stringa binaria. Utilizza il controllo del rimbalzo dalle varie altre risposte.


1

Python 2, 74 byte

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

Questa funzione accetta come input un unico numero intero sotto forma di elenco delle sue cifre binarie.

L'algoritmo è equivalente a quello della risposta di @ Agawa001 e della mia risposta di Jelly .

Provalo su Ideone .

Come funziona

nexttenta di trovare il primo numero intero 2i per il quale k==2*sum(x[:i])restituisce true. Poiché x[:i]contiene gli elementi, questo fornisce l'indice basato su 1 del (k / 2) th 1 .

nextfallirà se k / 2 non è integrale o se x contiene meno di k / 2 . In questo caso, viene restituito il valore predefinito k .


0

> <> , 63 byte

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

Dal momento in cui ho visto il modello di esempio in questa sfida, ho saputo quale lingua usare :)

Utilizzando N per ottenere il N ° periodo.

Input assunto in binario nello stack. Invece di spostare il deambulatore, questa soluzione si basa principalmente sullo spostamento del nastro sotto il deambulatore.

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.