Nuovo ordine n. 2: Turn My Way


15

Introduzione (potrebbe essere ignorata)

Mettere tutti i numeri positivi nel suo ordine regolare (1, 2, 3, ...) è un po 'noioso, no? Quindi ecco una serie di sfide intorno alle permutazioni (rimpasto) di tutti i numeri positivi. Questa è la seconda sfida di questa serie. La prima sfida può essere trovata qui .

In questa sfida, utilizziamo i codici Gray per riordinare i numeri naturali. Un codice Gray, o "codice binario riflesso" è una codifica binaria in modo tale che due valori successivi differiscano in un solo bit. Un'applicazione pratica di questa codifica è usarla negli encoder rotativi , da cui il mio riferimento a "Turn My Way" .

Encoder rotativo per dispositivi di misurazione dell'angolo marcato in binario a 3 bit.

Nota che questa codifica lascia un certo grado di libertà. Ad esempio, seguendo il binario 1100, ci sono quattro possibili codici seguenti: 1101, 1110, 1000 e 0100. Per questo definirò come valore più piccolo, non utilizzato in precedenza, che differisce solo un carattere nella codifica binaria. Questa sequenza corrisponde a A163252 .un'(n)

Poiché si tratta di una sfida "sequenza pura", il compito è quello di produrre per un dato n come input, dove a (n) è A163252 .un'(n)nun'(n)

Compito

Dato un input intero n , output un'(n) in formato intero ( non in formato binario).

un'(n) è definito come il numero intero meno positivo che non si verifica in precedenza nella sequenza in modo tale che e differiscano in un solo bit quando scritto in binario.un'(n-1)un'(n)

Nota: qui si assume l'indicizzazione basata su 1; puoi utilizzare l'indicizzazione basata su 0, quindi , ecc. Indicare questo nella risposta se si sceglie di utilizzarlo.un'(0)=1;un'(1)=3

Casi test

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

Regole

  • Input e output sono numeri interi (il tuo programma dovrebbe almeno supportare input e output nell'intervallo da 1 a 32767)
  • Input non validi (0, float, stringhe, valori negativi, ecc.) Possono causare output non previsti, errori o comportamenti (non) definiti. In A163252 , è definito come 0. Per questa sfida, lo ignoreremo.un'(0)
  • Si applicano le regole I / O predefinite .
  • Sono vietate le scappatoie predefinite .
  • Questo è , quindi vince la risposta più breve in byte

Nota finale

Vedi le seguenti domande relative (ma non uguali) ai PP&CG:

Risposte:


1

Stax , 19 17 byte

êÑ{╚α8è╙mc┼σ▀»É▲ü

Esegui ed esegui il debug

Smette di funzionare a un certo punto dopo il dominio specificato a causa dell'iterazione dell'indice di bit codificato. (32767)

Disimballato, non golfato e commentato, sembra così.

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

Esegui questo


Sei 1 byte dietro la risposta 05AB1E più breve. Pensi di ottimizzarlo ulteriormente? Altrimenti accetterò la risposta di Kevin ...
agtoever

1
Se avrò l'opportunità, ci lavorerò oggi, nelle prossime 14 ore.
ricorsivo

Tutto ok. Lo terrò aperto per un altro giorno. In bocca al lupo!
agtoever

@agtoever: grazie. Ho finito ora.
ricorsivo il

Molto bene! Hai vinto! Congratulazioni!
agtoever

4

JavaScript (ES6), 65 byte

1-indicizzati.

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

Provalo online!

Commentate

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

Su TIO, ottengo un overflow dello stack per n> ~ 1024. Qualche suggerimento su come gestirlo nell'altro ambiente di Abu? Regola: "il tuo programma dovrebbe almeno supportare input e output nell'intervallo di
teorie

1
@agtoever L'ho aggiornato a una versione non ricorsiva.
Arnauld,

4

Gelatina , 26 20 byte

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

Provalo online!

Un programma completo che accetta n come unico argomento. Funziona con tutti i casi di test. Si noti inoltre che, sebbene non richiesto, gestisce n = 0.

Spiegazione

Link di aiuto: trova il prossimo termine e anteponi

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

Collegamento principale

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

Java (JDK) , 142 138 124 123 132 130 98 byte

n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

Provalo online!


1
Temo che le importazioni debbano essere incluse nel conteggio dei byte. È possibile tuttavia golf il import java.util.*;+ Set s=new HashSet();a var s=new java.util.HashSet();. Inoltre, il resto può essere giocato a golf a: Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;. Bella risposta comunque, quindi +1 da parte mia. :)
Kevin Cruijssen,

1
Salvato 2 byte in più usando Stackanziché HashSet. Molto più lento ma funziona!
Daniel Widdis,

1
O(n)O(nn)

2
Puoi ancora giocare a golf a 126 byte con il secondo golf che ho suggerito nel mio primo commento. :)
Kevin Cruijssen,


2

Python 2 , 81 byte

Indicizzazione basata su 1

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

Provalo online!


Python 2 , 79 byte

Questo richiede molto tempo (9999 non è stato completato dopo l'esecuzione in locale per 7 minuti)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

Provalo online!


1
L'input massimo 32767 non è supportato (la profondità di ricorsione predefinita non dipende dal sistema).
Erik the Outgolfer,

Anche il test case 9999 non è supportato. :)
Daniel Widdis,

@EriktheOutgolfer L'ha cambiato in un approccio iterativo, probabilmente non finisce ancora in tempo su TIO, ma funziona localmente bene.
Ovs

@ovs Oh, i timeout da soli non contano.
Erik the Outgolfer,

Freddo! L'ho appena provato per n = 9999 e si è completato con successo dopo circa un'ora. +1. Sìì! ;-)
agtoever



1

Carbone , 65 byte

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔⁰θ

Inizializza il risultato su 0.

FN«

nTempi di ciclo .

⊞υθ

Salvare il risultato precedente in modo che non lo riutilizziamo.

≔¹ηW¬‹θ⊗η≦⊗η

Trova il bit più alto nel risultato precedente.

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

Mentre quel bit è maggiore di 1, se il bit è impostato nel risultato precedente, prova a sottrarre quel bit per vedere se il risultato è un risultato non visto. Ciò garantisce che i risultati potenziali vengano provati in ordine crescente di valore.

W№υ⁻|θη&θη≦⊗η

Ora prova XORing quel bit con il risultato precedente, raddoppiando il bit fino a quando non viene trovato un risultato invisibile. Questo gestisce i casi in cui è necessario impostare un bit, sempre in ordine crescente di valore, ma anche il caso in cui il bit meno significativo deve essere attivato, che il loop precedente non si preoccupa di testare (perché è più golfista da testare per quello qui). Se il ciclo precedente ha trovato un risultato invisibile, questo ciclo non funziona mai; in caso contrario, questo ciclo ripeterà inutilmente quei risultati.

≔⁻|θη&θηθ

Aggiorna il risultato effettivamente XORing il bit con esso.

»Iθ

Emette il risultato finale alla fine del loop.


1

05AB1E , 21 20 18 byte

ÎFˆ∞.Δ¯θy^bSO¯yå_*

Abbastanza inefficiente, quindi maggiore è l'input, maggiore è il tempo necessario per ottenere il risultato. Funziona anche per l'input 0, però.

n

Spiegazione:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

Haskell , 101 byte

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

Provalo online!

Sembra un peccato incorrere in un'importazione solo per xor, ma non ho ancora trovato una buona soluzione. Mi chiedo anche se esiste un modo migliore per esprimere il ciclo.


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.