La sequenza della curva del drago


23

La sequenza della curva del drago (o la normale sequenza di piegatura della carta) è una sequenza binaria. a(n)è dato dalla negazione del bit rimasto del 1 meno significativo di n. Ad esempio per calcolare a(2136), convertiamo prima in binario:

100001011000

Troviamo il nostro bit meno significativo

100001011000
        ^

Prendi il bit alla sua sinistra

100001011000
       ^

E restituisce la sua negazione

0

Compito

Dato un numero intero positivo come input, output a(n). (È possibile generare un numero intero o un valore booleano). Dovresti mirare a rendere il tuo codice il più piccolo possibile, misurato in byte.

Casi test

Ecco le prime 100 voci in ordine

1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1


9
Il bit meno significativo di 100001011000è a 0. Intendi il meno significativo 1?
disperde il

Risposte:


16

Mathematica 25 byte

1/2+JacobiSymbol[-1,#]/2&

Altri modi per farlo:

56 byte

(v:=1-IntegerDigits[#,2,i][[1]];For[i=1,v>0,i++];i++;v)&

58 byte

1-Nest[Join[#,{0},Reverse[1-#]]&,{0},Floor@Log[2,#]][[#]]&

3
Wow! Una risposta di matematica e non è solo integrata. Avere un voto!
KeyWeeUsr

2
L'unica cosa che potrebbe migliorare ulteriormente questa risposta è una spiegazione del perché e di come funziona. : P
Martin Ender,

2
@MartinEnder arxiv.org/pdf/1408.5770.pdf Vedi l'osservazione dopo l'esempio 13.
alephalpha,

7

Python 3 , 22 21 byte

1 byte grazie a ETHproductions.

lambda n:n&2*(n&-n)<1

Provalo online!

Ftw aritmetico bit a bit.


2
"È possibile che venga emesso un numero intero o un valore booleano", quindi suppongo che non sia necessario 0+(...)?
Martin Ender,

L'ordine delle operazioni qui mi sta davvero confondendo. Potrebbe n&1essere messo tra parentesi? O è 1+(n^~-n)<1che può essere messo tra parentesi? O è 1+(n^~-n)...
ETHproductions,

oh dio cosa. questo è quello che stavo cercando: o bello!
HyperNeutrino,

&ha la precedenza più bassa, quindi è1+(n^~-n)
Leaky Nun,

Ah, ho trovato la tabella delle precedenza. Ora tutto ha un senso: P
ETHproductions

6

Retina ,38 34 29 byte

\d+
$*
+`^(1+)\1$|1111
$1
^1$

Provalo online!

In sostanza Martin e Leaky hanno avuto questa idea, per altri 5 byte di sconto!

Converte l'input in unario, quindi divide progressivamente il numero per 2. Una volta che non può più farlo in modo uniforme (ovvero il numero è dispari), rimuove le patch di 4 dall'input, calcolando il risultato dell'ultima operazione mod 4 Infine, questo controlla se il risultato è 1, il che significa che la cifra a sinistra del 1 bit meno significativo era zero. Se questo è vero, il risultato finale è 1, altrimenti è zero.


31 byte (devo pubblicarlo da solo?)
Leaky Nun,

Ho trovato un modo per evitare la conversione binaria completa e invece ho semplicemente diviso i fattori di 2 e verificato l'uguaglianza con 1 (mod 4): tio.run/##K0otycxL/…
Martin Ender,

@MartinEnder essenzialmente il mio algoritmo ... con 2 byte di sconto
Leaky Nun,

@LeakyNun Oh sì, sono entrambe la stessa idea. Grandi menti e cose ...;)
Martin Ender,

Lo modificherò in, ma se uno di voi vuole
postarlo

6

Gelatina , 5 byte

&N&HṆ

Provalo online!

Come funziona

&N&HṆ  Main link. Argument: n

 N     Negate; yield -n.
&      Bitwise AND; compute n&-n.
       This yields the highest power of 2 that divides n evenly.
   H   Halve; yield n/2.
  &    Bitwise AND; compute n&-n&n/2. This rounds n/2 down if n is odd.
    Ṇ  Take the logical NOT of the result.

4

Alice , 8 byte

I2z1xnO@

Provalo online!

Accetta l'input come punto di codice di un carattere Unicode e genera il risultato come byte 0x00 o 0x01 di conseguenza.

Per verificabilità, ecco una versione I / O decimale a 12 byte che utilizza esattamente lo stesso algoritmo (solo I / O è diverso):

/o
\i@/2z1xn

Provalo online!

Se Alice fosse un linguaggio da golf e non richiedesse l'I / O esplicito e la terminazione del programma, questo avrebbe un clock di soli 5 byte ( 2z1xn) battendo sia 05AB1E che Jelly.

Spiegazione

I    Read input.
2z   Drop all factors of 2 from the input, i.e. divide it by 2 as long
     as its even. This shifts the binary representation to the right
     until there are no more trailing zeros.
1x   Extract the second-least significant bit.
n    Negate it.
O    Output it.
@    Terminate the program.


3

Saggio , 28 20 16 byte

::-~^~-&:[?>]~-^

Provalo online!

Spiegazione

Questa è una porta della risposta Python di Leaky Nun. Sfortunatamente non funziona su TIO perché la versione dell'interprete di TIO è un po 'datata.

Iniziamo facendo 3 copie del nostro input con ::, quindi diminuiamo la copia in alto di 1. In questo modo capovolgeremo tutti i bit fino al primo 1. Dopodiché xoreremo questo con un'altra copia del nostro input. Dal momento che tutti i bit fino al primo 1 sul nostro input sono stati invertiti, ciò comporterà che tutti quei bit saranno 1 sul risultato. Se poi ne aggiungiamo uno ~-al risultato, otterremo un singolo 1 nel punto a sinistra del nostro meno significativo 1. Noi AND questo con l'input per ottenere quel bit dall'input. Ora avremo 0iff quel bit era spento e una potenza di 2 iff quel bit era acceso, possiamo cambiarlo in uno singolo 1o 0con :[?>]. Una volta fatto ciò, dobbiamo solo negare il bit ~-^e abbiamo finito.



3

Haskell , 45 anni 43 39 byte

6 byte salvati grazie a nimi

f x|d<-div x 2=[f d,mod(1+d)2]!!mod x 2

Provalo online!


Puoi usare divinvece di quot.
nimi,

Ancora meglio: divMod:f x|(d,m)<-divMod x 2=[mod(1+d)2,f d]!!m
Nome del modello

@nimi Non capisco nemmeno come funzioni. Probabilmente dovresti semplicemente pubblicarlo da solo.
Mago del grano,

E 'ancora lo stesso algoritmo, ma solo un modo diverso di scegliere il ramo (ricorsivamente chiama f nuovo vs. caso base), quindi sentitevi liberi di modificarlo in. |(d,m)<-divMod x 2È una guardia di modello per legano da div x 2e ma mod x 2. Usiamo mper indicizzare l'elenco dei due elementi [...,...]!!m. In caso di m==0ritorno mod(1+d)2e in caso di m==1 f d.
nimi,

1
Oh, scusa, è necessario capovolgere gli elementi della lista: [f d,mod(1+d)2]. Provalo online! .
nimi,

3

Codice macchina x86, 17 16 15 byte:

Presuppone un ABI in cui i parametri vengono inseriti nello stack e il valore restituito si trova nel ALregistro.

8B 44 24 04 0F BC C8 41 0F BB C8 0F 93 C0 C3

Questo è smontato come segue:

_dragoncurve:
  00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
  00000004: 0F BC C8           bsf         ecx,eax
  00000007: 41                 inc         ecx
  00000008: 0F BB C8           btc         eax,ecx
  0000000B: 0F 93 C0           setae       al
  0000000E: C3                 ret

1
@PeterTaylor Sto contando la dimensione dell'istruzione CPU in byte per la mia risposta; è una pratica abbastanza comune su PPCG per le risposte degli assembly.
Govind Parmar,

1
Non saprei dire quanto sia comune, ma è decisamente sbagliato
Peter Taylor,

1
Non è solo pedante, è anche insignificante. Non esiste alcuna distinzione tra "codice macchina" e "codice assembly" per quanto riguarda un computer. La differenza è semplicemente interpretativa. Assegniamo mnemonici ai byte di codice macchina per renderli più facili da leggere per gli umani. In altre parole, eliminiamo i byte per renderli più facili da capire.
Cody Gray,

3
Questo è irrilevante, @Peter. Il codice assembly è solo una traduzione leggibile dall'uomo del codice macchina. Sono esattamente la stessa lingua, solo in due diverse forme / rappresentazioni. Non è diverso da TI BASIC, dove è comunemente accettato che contiamo i token , anziché i byte di caratteri, perché è così che il sistema li memorizza internamente. Lo stesso sarebbe vero con il linguaggio assembly: le istruzioni mnemoniche non sono memorizzate come singoli caratteri, ma piuttosto rappresentate come byte di codice macchina equivalente.
Cody Grey,

2
Inoltre, praticamente parlando, perché qualcuno dovrebbe mai inserire un linguaggio mnemonico di linguaggio assembly esteso in una competizione di code-golf, quando potrebbe tradurli in un codice macchina equivalente al 100%, in cui l'ingresso è garantito per essere più breve gratuitamente? Questo da solo fa una distinzione tra i due inutili, se non del tutto assurdi.
Cody Grey,

3

JavaScript (ES6), 17 14 byte

f=
n=>!(n&-n&n/2)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Modifica: salvato 3 byte eseguendo il porting della risposta di Dennis una volta che ho notato che l'output booleano era accettabile.


3

C (gcc) , 20 byte

f(n){n=!(n&-n&n/2);}

Provalo online!


Questo in realtà non "funziona"; stai facendo affidamento su una stranezza del generatore di codice per una versione particolare del compilatore indirizzata a una particolare architettura, in cui i calcoli intermedi vengono eseguiti nello stesso registro utilizzato per i valori restituiti. L'abilitazione di qualsiasi tipo di ottimizzazione, la modifica dell'architettura di destinazione o l'utilizzo di una versione diversa di GCC interromperà tale operazione. Potresti anche solo dire "la spazzatura sul mio stack contiene l'output giusto quando c'è una luna piena il 13 ottobre".
Cody Grey,

Mentre tutto ciò che dici è vero e codice come questo non può mai essere usato nel codice di produzione, definiamo le lingue in base alle loro implementazioni ai fini del code golf. Senza flag aggiuntivi, funziona in tutte le versioni recenti di gcc e tcc e deve funzionare solo in una versione per essere considerato valido.
Dennis,

"definiamo le lingue in base alle loro implementazioni ai fini del codice golf" Aspetta, cosa? Quindi ogni flag del compilatore e ogni versione di GCC definisce una lingua diversa? Ti rendi conto che è pazzo, vero? Lo standard del linguaggio C è ciò che definisce il linguaggio.
Cody Grey,

Non qui. Se esistesse uno standard C ma nessuna implementazione, non lo considereremmo nemmeno un linguaggio. Come ho detto prima, il compilatore definisce la lingua . Di conseguenza, è consentito fare affidamento su un comportamento indefinito . Un diverso set di flag non è considerato una lingua diversa, ma a meno che non vengano aggiunti al numero di byte, tutte le risposte utilizzano flag di compilazione standard.
Dennis,

Wow. È pazzesco. Voglio dire, potrei capire se stavi dicendo che il comportamento definito dall'implementazione è permesso, ma il comportamento indefinito non è definito dall'implementazione. È letteralmente indefinito. L'implementazione è autorizzata a fare cose casuali ogni volta. E questa nozione di "flag di compilazione standard" è qualcosa che hai appena inventato. I miei flag di compilazione standard includono diversi che infrangono il tuo codice. E difficilmente penso che l'ottimizzatore non sia standard. Bene, chiaramente questo sito non fa per me.
Cody Gray,

3

INTERCAL , 50 byte

DOWRITEIN.1DO.1<-!?1~.1'~#1DOREADOUT.1PLEASEGIVEUP

Gli operatori unari di INTERCAL sono abbastanza adatti per questo, quindi ho deciso di scrivere il mio primo post.

DO WRITE IN .1
DO .1 <- !?1~.1'~#1
DO READ OUT .1
PLEASE GIVE UP



2

,,, , 10 9 byte

::0-&2*&¬

Spiegazione

Prendi input come 3 per esempio.

::0-&2*&1≥
               implicitly push command line argument       [3]
::             duplicate twice                             [3, 3, 3]
  0            push 0 on to the stack                      [3, 3, 3, 0]
   -           pop 0 and 3 and push 0 - 3                  [3, 3, -3]
    &          pop -3 and 3 and push -3 & 3 (bitwise AND)  [3, 1]
     2         push 2 on to the stack                      [3, 1, 2]
      *        pop 2 and 1 and push 2 * 1                  [3, 2]
       &       pop 2 and 3 and push 2 & 3                  [2]
        ¬      pop 2 and push ¬ 2 (logical NOT)            [0]
               implicit output                             []


2

Ottava , 34 byte

@(x)~(k=[de2bi(x),0])(find(k,1)+1)

Provalo online!

Spiegazione:

@(x)                               % Anonymous function taking a decimal number as input
    ~....                          % Negate whatever comes next
     (   de2bi(x)   )              % Convert x to a binary array that's conveniently 
                                   % ordered with the least significant bits first
        [de2bi(x),0]               % Append a zero to the end, to avoid out of bound index
     (k=[de2bi(x),0])              % Store the vector as a variable 'k'
                     (find(k,1)    % Find the first '1' in k (the least significant 1-bit)
                               +1  % Add 1 to the index to get the next bit
     (k=[de2bi(x),0])(find(k,1)+1) % Use as index to the vector k to get the correct bit

Come mai non ho mai sentito parlare di de2bi ...: O
Sanchises,

1

Presentazione:

Python 2 , 41 39 byte

x=input()
while~-x&1:x/=2
print 1-x/2%2

Provalo online!

-2 byte grazie a FryAmTheEggman

Soluzione iniziale:

Python 2 , 43 byte

lambda x:1-int(bin(x)[bin(x).rfind('1')-1])

Provalo online!


Quindi qual è la tua richiesta?
Leaky Nun,

@LeakyNun Il primo perché è più corto; la seconda era la mia presentazione originale. Devo pubblicarli separatamente?
HyperNeutrino,

~-x&1funziona invece per la condizione while, penso.
FryAmTheEggman,

(Dimentico il nome utente); Ho rifiutato la tua modifica perché le modifiche al golf del codice di altre persone non sono consigliate su PPCG. Puoi pubblicare suggerimenti (a proposito, grazie a @FryAmTheEggman), ma per favore non apportare modifiche al golf. Grazie!
HyperNeutrino,

@StewieGriffin Ah sì, grazie. Purtroppo non posso eseguire il ping dell'utente perché la modifica è stata rifiutata.
HyperNeutrino,

1

MATL , 11 10 byte

t4*YF1)Z.~

Provalo online! Oppure vedi le prime 100 uscite .

Spiegazione

t    % Implicit input. Duplicate
4*   % Multiply by 4. This ensures that the input is a multiple of 2, and
     % takes into account that bit positions are 1 based
YF   % Exponents of prime factorization
1)   % Get first exponent, which is that of factor 2
Z.   % Get bit of input at that (1-based) position
~    % Negate. Implicit display


1

Befunge-98 , 19 byte

&#;:2%\2/\#;_;@.!%2

Provalo online!

&#                       Initial input: Read a number an skip the next command
  ;:2%\2/\#;_;           Main loop: (Direction: East)
   :2%                    Duplicate the current number and read the last bit
      \2/                 Swap the first two items on stack (last bit and number)
                          and divide the number by two => remove last bit
         \                swap last bit and number again
          #;_;            If the last bit is 0, keep going East and jump to the beginning of the loop
                          If the last bit is 1, turn West and jump to the beginning of the loop, but in a different direction.
&#;           @.!%2      End: (Direction: West)
&#                        Jump over the input, wrap around
                 %2       Take the number mod 2 => read the last bit
               .!         Negate the bit and print as a number
              @          Terminate

1

SCALA, 99 (78?) Caratteri, 99 (78?) Byte

if(i==0)print(1)else
print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

dov'è il'input.

Come puoi vedere, salvo 21 byte se non mi occupo dello zero (come ha fatto l'autore nel suo caso di test):

print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

Questo è il mio primo codegolf quindi spero di aver fatto bene :)

Provalo online! Anche se è abbastanza lungo calcolare lol.


Benvenuti nel sito!
DJMcMayhem


1

Java 8, 17 byte

n->(n&2*(n&-n))<1

Porta semplice della risposta Python 3 di LeakyNun . Non ho abbastanza familiarità con le operazioni bit per bit e la precedenza dell'operatore per vedere una soluzione più breve; forse c'è un modo per evitare l'ulteriore parenteesi?


0

Japt , 10 8 9 byte

!+¢g¢a1 É

Provalo online!

Spiegazione

!+¢   g    a1 É
!+Us2 gUs2 a1 -1 # Implicit input (U) as number
!+               # Return the boolean NOT of
      g          #   the character at index
       Us2       #     the input converted to binary
           a1    #     the index of its last 1
              -1 #     minus 1
      g          #   in string
  Us2            #     the input converted to binary

Questo ritorna falseper tutto perché il carattere (0 o 1) è sempre una stringa.
Shaggy,

Oops, avrei dovuto notare che ... Risolto ora
Luke,

Sembra che fallisca per1 ora.
Shaggy,

0

JavaScript (ES6), 53 34 byte

a=>eval("for(;~a&1;a/=2);~a>>1&1")

42 byte:a=>!+(a=a.toString(2))[a.lastIndexOf(1)-1]
Shaggy,

Ho già trovato una soluzione (matematica) più breve ...
Luca,

Bello :) Ti dispiace se inserisco quello a 42 byte?
Shaggy,

@Shaggy, no per niente
Luca



0

Chip , 93 byte

HZABCDEFG,t
 ))))))))^~S
H\\\\\\\/v~a
G\\\\\\/v'
F\\\\\/v'
E\\\\/v'
D\\\/v'
C\\/v'
B\/v'
A/-'

Accetta input come piccoli byte endian. (Il TIO ha un po 'di pitone che lo fa per te). Fornisce output come 0x0o 0x1. (Il TIO usa xxd per ispezionare il valore).

Provalo online!

Come si fa?

Il chip esamina l'input di un byte alla volta, quindi la gestione dell'ingresso multibyte aggiunge un po 'di volume, ma non così vicino come avevo temuto.

Andiamo dentro:

HZABCDEFG

Questi sono HZ, bit alto del byte precedente (se ce n'era uno), e A- G, i sette bit inferiori del byte corrente. Questi vengono utilizzati per individuare il bit impostato più basso del numero.

        ,t
))))))))^~S

Quando viene trovato il bit impostato più basso, abbiamo alcune cose da fare. Questo primo pezzo dice "se abbiamo un bit impostato ( )i), quindi smettiamo di Ssopprimere l'output ed teliminiamo dopo aver stampato la risposta.

H\\\\\\\/v~a
G\\\\\\/v'
...
A/-'

Qualunque bit del byte corrente ( A- H) è preceduto solo da un gruppo di zero, quindi uno ( \e /: questi guardano i bit direttamente a nord di loro; possiamo fidarci che tutti i bit precedenti erano zero) viene passato ai fili su destra ( v, ', ...), poi scegliendo il valore è dato viene invertita ed il bit basso dell'uscita ( ~a).

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.