Inverse et carré


19

Dans ce défi, vous calculerez des nombres à partir d'une séquence curieuse.

Votre entrée est un entier non décimal unique. Inversez les bits de cet entier, puis mettez le nombre au carré pour obtenir la sortie requise.

Lors de l'inversion des bits, vous ne devez pas utiliser de zéros de tête dans l'entrée. Par exemple:

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

Les 25 premières entrées / sorties de cette séquence:

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

Votre solution devrait fonctionner pour des entiers de taille arbitraire. Si votre langue ne dispose pas d'une méthode intégrée pratique pour les utiliser, implémentez votre réponse comme si c'était le cas. Vous êtes alors excusé si votre réponse casse pour les grands nombres. Cependant, n'utilisez pas d'astuces / limites qui ne fonctionnent que pour un domaine limité (comme une table de recherche).


Votre score est le nombre d'octets de code source.

-50% de bonus si vous ne convertissez jamais le nombre en / de binaire. Cela ne se limite pas aux prédéfinis, si vous bouclez sur le nombre bit par bit (soit en décalant ou en masquant ou toute autre méthode), cela comptera également comme conversion. Je ne sais pas si cela est réellement possible, mais cela incite à repérer un motif dans la séquence.

Le plus petit score l'emporte.



1
Si le code appelle une méthode qui génère une chaîne de caractères représentant les bits, est-ce éligible au bonus?
Brad Gilbert b2gills

2
@ BradGilbertb2gills No.
orlp

Je suppose que l'utilisation des mathématiques pour extraire les bits compte également comme une conversion binaire?
lirtosiast

Réponses:


5

Par , 5 octets

✶Σ⌐Σ²

C'est un carré binaire inversé en lecture.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Ce compteur d'octets suppose UTF-8. Je crois que Mauris utilise un encodage qui n'est pas UTF-8 pour compter ses octets, mais il n'a pas spécifié cet encodage.
orlp

Par utilise son propre encodage bizarre. Sa représentation canonique est un certain sous-ensemble de <256 caractères Unicode. Je ne sais pas s'il a un nom; Je devrais attendre @Ypnypn pour sonner.
Lynn

Oh je vois. @orlp
Conor O'Brien

Peut-être qu'il a son propre SBCS?
HyperNeutrino

19

Mathematica, 42 21 octets

Merci à alephalpha d'avoir réduit de moitié le score.

#~IntegerReverse~2^2&

La vraie raison pour laquelle j'ai fait ça dans Mathematica était parce que je voulais regarder une intrigue ... ça a l'air vraiment drôle:

enter image description here


11
Mais j'aime le score! XD
Conor O'Brien

1
pourquoi cette réponse a-t-elle plus de votes que la réponse avec le moins d'octets? o_O
Seadrus

27
@Seadrus Vous savez ce qu'ils disent. Une image vaut 7 octets.
Martin Ender

5
donc votre score est de 42 + 7 = 49 octets: P
Seadrus

3
Désolé, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Martin Ender

8

Minkolang 0,14 , 43 octets

Merci à Mego d'avoir inspiré cela.

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

Testez le code ici et vérifiez tous les cas de test ici .

Explication

Cela utilise cette relation de récurrence:

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

Si nest l'entrée, alors a(n)est le nombre résultant après que sa séquence binaire a été inversée. 0 et 1 sont évidents. Pour a(2n) = a(n), considérez que x0(où xest n'importe quelle séquence de chiffres binaires) est inversé 0x, ce qui est le même que x. Car a(2n+1), le raisonnement est un peu plus compliqué. x1est inversé 1x, ce qui est égal à x + 2^kpour certains k. C'est kun de plus que le nombre de chiffres x, ce qui est floor(log_2(n))+1. La formule complète suit, sauf qu'elle est un peu modifiée. Voici ce que je code réellement:

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

Comme Mego et moi avons travaillé dans le chat, floor(n/2) = (n - n%2)/2. Ainsi, log_2(floor(n/2))+1 = log_2(n - n%2). De plus, la multiplication par (n%2)réduit à la fois les parties impaires et paires en une seule expression.

Enfin, sans plus tarder, voici le code, expliqué.

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
Je pense que la récurrence est juste une reformulation de l'itération sur les bits individuels.
Martin Ender

3
J'ai bien peur que cela ne compte pas. Chaque fois que vous voyez 2net 2n+1dans une relation de récurrence, vous devez immédiatement la considérer comme une boucle sur des bits.
orlp

1
@orlp: Eh bien, c'est une déception. Je suis un peu convaincu maintenant que votre bonus est impossible.
El'endia Starman

@ El'endiaStarman Je l'ai presque, je pense.
Conor O'Brien

8

Japt , 29 28 11 7 octets

(Vous pouvez enregistrer le programme en tant que fichier codé IEC_8859-1 de 7 octets, puis le télécharger dans l' interpréteur .)

Japt est un raccourci JavaScript créé par ETHproductions .

¢w n2 ²

Essayez-le en ligne!

Explication:

  1. ¢est un raccourci vers Us2, qui se compile en U.s(2). Uest entrée (implicite), .s(2)appelée par un nombre, invoque .toString(2)(convertit en binaire, analyse comme chaîne).

  2. wse compile en .w(), ce qui inverse la chaîne ( .split('').reverse().join('')).

  3. n2fonctionne comme parseInt(<number>,2), c.-à-d. convertit le binaire en décimal.

  4. ²invoque Math.pow(<number>,2), c'est-à-dire met le nombre au carré.


1
Il y a une fonction de chaîne surNumber n, vous pouvez donc le faire Us2 a w a n2 p2. Bon travail!
ETHproductions

1
En outre, wla même sur les chaînes comme il le fait sur les tableaux, de sorte que vous n'avez pas besoin les deux as :)
ETHproductions

1
Une dernière chose: Us2 = ¢, et p2= ², le ramenant à 7 octets:¢w n2 ²
ETHproductions

3
L' interpréteur en ligne accepte désormais les fichiers codés IEC_8859-1. (Même si je ne sais pas comment faire UTF-8 et UTF-16 aussi ...)
ETHproductions

2
@ETHproductions - maintenant je peux attribuer +1 à ceci :)
Digital Trauma

5

Python, 32 octets

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

Essayez-le en ligne.

Le code est assez simple:, bin(6)par exemple, donne 0b110, la représentation binaire de 6. [:1:-1]inverse la chaîne et supprime 0b. intconvertit la chaîne en un entier binaire et la met au **2carré.


5

Jolf , 7 octets

Il suffit de l'exécuter. L'entrée sur la page ne fonctionne pas.

^C_Bj22

Explication

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

J'ai ajouté la Qcommande, ce qui rend ces 6 octets:QC_Bj2


4
Barré 7 ressemble toujours à un 7.
un spaghetto

2
@quartata Pas aussi mauvais qu'un barré 4.
orlp


4

Sérieusement , 8 7 octets

2;,¡R¿ª

Des défis comme ceux-ci sont parfaits pour sérieusement :)

Essayez-le en ligne

Explication:

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

Beau travail correspondant à Jolf!
Conor O'Brien

+1 pour que votre interprète accepte le codage CP437 (ou au moins la représentation hexadécimale de celui-ci)
Digital Trauma

4

J, 10 9 octets

2^~|.&.#:

Il s'agit d'un verbe tacite et monadique. Essayez-le en ligne!

Merci à @randomra d'avoir joué au golf sur 1 octet!

Comment ça fonctionne

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.

Le lien ne fonctionne pas, j'obtiens une erreur 404 sur une page Google qui dit "L'URL demandée /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html est introuvable sur ce serveur. C'est tout ce que nous savons."
Bijan


2

JavaScript, 64 63 56 53 octets

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

Je me rends compte que je suis extra long, mais bon, je peux le faire: P

Démo


au lieu de parseInt(vous pouvez le faire+("0b"+
Downgoat

@Downgoat hm, il ne semble pas donner de résultats corrects.
nicael

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

1
Même plus courte w / ES7 (49 octets): n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Ne fonctionne pas pour l'instant dans les navigateurs
Downgoat

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Merci, cela économise quelques octets.
nicael

2

Perl 6 , 21 octets

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

Exemple d'utilisation:

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

PHP, 45 octets

echo pow(bindec(strrev(decbin($argv[1]))),2);

2

Coquille, 25

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

Entrée / sortie via STDIN / STDOUT:

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


1

Pyth, 9 octets

^i_.BQ2 2

Ceci est une réponse basée sur pyth très simple similaire à celle de Python


1

𝔼𝕊𝕄𝕚𝕟, 12 caractères / 21 octets

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

Try it here (Firefox only).

Réponse non compétitive, 9 caractères / 18 octets

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).


1
Via ce compteur d'octets, donne 15 octets (utilise un autre encodage).
nicael

Je note en utilisant UTF-8 (jusqu'à ce que je puisse faire fonctionner l'encodage Mines).
Mama Fun Roll

Le ... nom de la langue ... est des cases?
corsiKa

C'est ESMin en double. Les caractères Unicode ne sont pas entièrement pris en charge.
Mama Fun Roll


1

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

Prompt X
0→S
While X
2S→S
If X/2≠int(X/2
S+1→S
End
S2
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.