Inverso e quadrato


19

In questa sfida calcolerai i numeri da una sequenza curiosa.

Il tuo input è un singolo intero decimale non decimale. Invertire i bit in questo numero intero e quindi quadrare il numero per ottenere l'output richiesto.

Quando si invertono i bit non è necessario utilizzare zero iniziali nell'input. Per esempio:

26 (base 10) = 11010 (base 2) -> 01011 (base 2) = 11 -> 11*11 = 121

I primi 25 ingressi / uscite di questa sequenza:

0: 0
1: 1
2: 1
3: 9
4: 1
5: 25
6: 9
7: 49
8: 1
9: 81
10: 25
11: 169
12: 9
13: 121
14: 49
15: 225
16: 1
17: 289
18: 81
19: 625
20: 25
21: 441
22: 169
23: 841
24: 9

La tua soluzione dovrebbe funzionare con numeri interi di dimensioni arbitrarie. Se la tua lingua non ha un metodo incorporato conveniente per usarli, implementa la tua risposta come se lo fosse. Sei quindi scusato se la tua risposta si interrompe per numeri grandi. Tuttavia, non utilizzare trucchi / limiti che funzionano solo per un dominio limitato (come una tabella di ricerca).


Il tuo punteggio è il numero di byte del codice sorgente.

-50% di bonus se non converti mai il numero in / da binario. Questo non si limita ai builtin, se si esegue il ciclo sul numero bit per bit (spostando o mascherando o qualsiasi altro metodo), verrà conteggiato anche come conversione. Non so se questo sia effettivamente possibile, ma è un incentivo a individuare uno schema nella sequenza.

Il punteggio più piccolo vince.



1
Se il codice chiama un metodo che risulta in una stringa di caratteri che rappresenta i bit, è idoneo per il bonus?
Brad Gilbert b2gills

2
@ BradGilbertb2gills No.
orlp

Presumo che usare la matematica per estrarre i bit sia anche una conversione binaria?
lirtosiast

Risposte:


5

Par , 5 byte

✶Σ⌐Σ²

Quello è read-binary-reverse-binary-square.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Quel contatore di byte assume UTF-8. Credo che Mauris stia usando una codifica che non è UTF-8 per contare i suoi byte, ma non ha specificato questa codifica.
orlp

Par usa la sua strana codifica. La sua rappresentazione canonica è un certo sottoinsieme di <256 caratteri Unicode. Non sono sicuro che abbia un nome; Dovrei aspettare che @Ypnypn intervenga.
Lynn,

Oh, capisco. @orlp
Conor O'Brien il

Forse ha il suo SBCS?
HyperNeutrino

19

Mathematica, 42 21 byte

Grazie ad alephalpha per aver dimezzato il punteggio.

#~IntegerReverse~2^2&

La vera ragione per cui l'ho fatto in Mathematica era perché volevo guardare una trama ... sembra sicuramente divertente:

inserisci qui la descrizione dell'immagine


11
Ma mi piace il punteggio! XD
Conor O'Brien,

1
perché questa risposta ha più voti della risposta con il minor numero di byte? o_O
Seadrus,

27
@Seadrus Sai cosa dicono. Un'immagine vale 7 byte.
Martin Ender,

5
quindi il tuo punteggio è 42 + 7 = 49 byte: P
Seadrus

3
Siamo spiacenti, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender,

8

Minkolang 0,14 , 43 byte

Grazie a Mego per aver ispirato questo.

n1{d1`,2$3*&$z2zd2%-2l$Md1%-;z2%*z2:{+}2;N.

Prova qui il codice e controlla tutti i casi di test qui .

Spiegazione

Questo utilizza questa relazione di ricorrenza:

a(0) = 0
a(1) = 1
a(2n) = a(n)
a(2n+1) = a(n) + 2^(floor(log_2(n))+1)

Se nè l'input, allora a(n)è il numero risultante dopo che la sua sequenza binaria è stata invertita. 0 e 1 sono evidenti. Per a(2n) = a(n), considera che x0(dove xc'è una sequenza di cifre binarie) è capovolto 0x, che è lo stesso di x. Perché a(2n+1)il ragionamento è un po 'più complicato. x1capovolto è 1x, che è uguale a x + 2^kper alcuni k. Questo kè uno in più rispetto al numero di cifre x, che è floor(log_2(n))+1. Segue la formula completa, tranne per il fatto che è stata leggermente modificata. Questo è ciò che effettivamente codice:

a(0) = 0
a(1) = 1
a(n) = a(n//2) + (n%2) * 2^(floor(log_2(n - n%2)))

Come Mego e ho lavorato in chat floor(n/2) = (n - n%2)/2. Così, log_2(floor(n/2))+1 = log_2(n - n%2). Inoltre, moltiplicando per (n%2)collassa sia le parti dispari che quelle pari in un'unica espressione.

Infine, senza ulteriori indugi, ecco il codice, spiegato.

n                                              Take number from input
 1{                                            Start recursion that takes only one element
   d1`,                                        1 if top of stack 0 or 1, 0 otherwise
       2$3*                                    26
           &                                   Jump if top of stack is not zero
            $z                                 Store top of stack in register (z)

               zd2%-                           n - n%2
                    2l$M                       log_2(n - n%2)
                        d1%-                   floor(log_2(n - n%2))
              2             ;                  2^floor(log_2(n - n%2))
                             z2%               n%2
                                *              Multiply
                                 z2:           n//2
                                    {          Recurse
                                     +         Add
                                      }        Return
                                       2;N.    Square it, output as number, and stop.

1
Penso che la ricorrenza sia solo una riformulazione dell'iterazione sui singoli bit.
Martin Ender,

3
Temo che questo non conta. Ogni volta che vedi 2ne 2n+1in una relazione di ricorrenza dovresti immediatamente pensarlo come un loop su bit.
orlp,

1
@orlp: Beh, è ​​un peccato. Sono un po 'convinto ora che il tuo bonus è impossibile.
El'endia Starman,

@ El'endiaStarman L'ho quasi capito, credo.
Conor O'Brien,

8

Japt , 29 28 11 7 byte

(È possibile salvare il programma come file con codifica IEC_8859-1 a 7 byte, quindi caricarlo sull'interprete .)

Japt è abbreviato JavaScript creato da ETHproductions .

¢w n2 ²

Provalo online!

Spiegazione:

  1. ¢è un collegamento a Us2, che viene compilato in U.s(2). Uè input (implicito), .s(2)chiamato da un numero, invoca .toString(2)(converte in binario, analizza come stringa).

  2. wcompila in .w(), che inverte la stringa ( .split('').reverse().join('')).

  3. n2funziona come parseInt(<number>,2), cioè converte binario in decimale.

  4. ²invoca Math.pow(<number>,2), ovvero quadra il numero.


1
C'è una funzione stringa su Numero attivo n, quindi puoi farlo Us2 a w a n2 p2. Ottimo lavoro però!
ETHproductions

1
Inoltre, wfunziona allo stesso modo sulle stringhe come sulle matrici, quindi non hai bisogno delle due as :)
ETHproductions

1
Un'ultima cosa: Us2 = ¢, e p2= ², portandolo a 7 byte:¢w n2 ²
ETHproductions

3
L' interprete online ora accetta file codificati IEC_8859-1. (Anche se non sono sicuro di come fare UTF-8 e UTF-16 ...)
ETHproductions

2
@ETHproductions - ora posso fare +1 su questo :)
Digital Trauma

5

Python, 32 byte

lambda x:int(bin(x)[:1:-1],2)**2

Provalo online.

Il codice è piuttosto semplice: bin(6)ad esempio, dà 0b110, la rappresentazione binaria di 6. [:1:-1]inverte la stringa e rimuove 0b. intconverte la stringa in un numero intero da binario e la **2piazza.


5

Jolf , 7 byte

Eseguilo e basta. L'input nella pagina non funziona.

^C_Bj22

Spiegazione

^C_Bj22
    j   numeric input
   B    convert to binary (str)
  _     reverse
 C   2  parse as binary integer to base 10
^     2 square
        implicit output

Ho aggiunto il Qcomando, che rende questo 6 byte:QC_Bj2


4
Il 7 barrato sembra ancora un 7.
uno spaghetto il

2
@quartata Non male come un barrato 4.
orlp


4

Scherzi a parte , 8 7 byte

2;,¡R¿ª

Sfide come queste sono perfette per Seriamente :)

Provalo online

Spiegazione:

2;,¡    get a string representing the (decimal) input in binary, with a 2 on the bottom of the stack
R      reverse the string
¿    convert binary string to decimal int (using that extra 2 from earlier)
ª      square it

Bel lavoro di abbinamento a Jolf!
Conor O'Brien,

+1 per far accettare alla tua interprete la codifica CP437 (o almeno la sua rappresentazione esadecimale)
Digital Trauma

4

J, 10 9 byte

2^~|.&.#:

Questo è un verbo tacito e monadico. Provalo online!

Grazie a @randomra per giocare a golf a 1 byte!

Come funziona

2^~|.&.#:  Right argument: y

       #:  Convert y to binary.
   |.      Reverse the digits.
     &.    Dual; apply the inverse of #:, i.e., convert back to integer.
 ^~        Apply power (^) with reversed argument order (~)...
2          to 2 and the previous result.

Il collegamento non funziona, ricevo un errore 404 su una pagina di Google che dice "L'URL richiesto /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html non è stato trovato su questo server. Questo è tutto ciò che sappiamo."
Bijan,


2

JavaScript, 64 63 56 53 byte

n=>parseInt([...n.toString(2)].reverse().join``,2)**2

Mi rendo conto di essere molto più lungo, ma hey, posso farcela: P

dimostrazione


invece di parseInt(te puoi fare+("0b"+
Downgoat,

@Downgoat hm, non sembra dare risultati corretti.
nicael

[...n.toString(2)]e.join``
Conor O'Brien il

1
Ancora più breve w / ES7 (49 byte): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Non funziona ancora in nessun browser
Downgoat,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Grazie, questo consente di risparmiare alcuni byte.
nicael

2

Perl 6 , 21 byte

{:2(.base(2).flip)²}

Esempio di utilizzo:

say {:2(.base(2).flip)²}(26); # 121

say (0..24).map: {:2(.base(2).flip)²};
# (0 1 1 9 1 25 9 49 1 81 25 169 9 121 49 225 1 289 81 625 25 441 169 841 9)

my &code = {:2(.base(2).flip)²};
say code 3; # 9

say chars code 10¹⁰⁰; # 140


2

Shell, 25

dc -e2o?p|rev|dc -e2i?d*p

Ingresso / uscita tramite STDIN / STDOUT:

$ echo 26|dc -e2o?p|rev|dc -e2i?d*p
121
$ 

1

Pyth - 9 byte

Conversioni semplici. In realtà ho assegnato 2 a un var che è piuttosto strano.

^i_jQK2KK

Test Suite .


1

Pyth, 9 byte

^i_.BQ2 2

Questa è una risposta basata su Pyth molto semplice simile a quella di Python


1

𝔼𝕊𝕄𝕚𝕟, 12 caratteri / 21 byte

⦅`ᶀ`+ᴙ(ïß2)²

Try it here (Firefox only).

Risposta non competitiva, 9 caratteri / 18 byte

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).


1
Tramite questo contatore di byte, fornisce 15 byte (utilizza un'altra codifica).
nicael

Grado usando UTF-8 (fino a quando non riesco a far funzionare la codifica Mines).
Mama Fun Roll

Il ... nome della lingua ... è box?
corsiKa

È ESMin in doppio abbattimento. I caratteri Unicode non sono completamente supportati.
Mama Fun Roll


1

TI-Basic (TI-84 Plus CE), 42 byte

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
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.