Conversion de binaire en négabinaire

15

Étant donné un entier binaire inclusivement entre 0et 1111111111111111(c'est-à-dire un entier non signé 16 bits) en entrée, sortez le même entier en négabinaire .

L'entrée peut être dans le format qui convient le mieux à votre langue; par exemple, s'il est plus facile pour le programme de gérer l'entrée avec 16 chiffres, comme 0000000000000101, plutôt que simplement 101, vous pouvez écrire le programme pour accepter uniquement l'entrée de cette façon.

Exemple d'E / S

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

Voici un exemple de programme que j'ai écrit qui effectue des conversions de base, y compris des bases négatives et non entières. Vous pouvez l'utiliser pour vérifier votre travail.

Peter Olson
la source
Juste pour clarifier un peu plus, l'entrée et la sortie devraient être binaires, non? Je veux dire: des chaînes de caractères de 0s et 1s. Cela me semble clair, mais une réponse me fait douter légèrement ...
Joanis
@ M.Joanis L'entrée est binaire, la sortie est négabinaire (qui ressemble exactement à binaire - une chaîne de zéros et de uns - mais la façon dont le nombre est interprété est différente.)
Peter Olson
2
Le lien semble être en baisse, ce qui est une des principales raisons pour lesquelles nous exigeons que les questions soient autonomes ces jours-ci
Jo King

Réponses:

6

APL, 21 caractères

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

J'ai utilisé Dyalog APL pour cela, avec ⎕IOla valeur 0, nous permettant d'indexer les tableaux à partir de 0 plutôt que 1.

Explication, de droite à gauche:

  • nous donne l'entrée de l'utilisateur comme vecteur de caractères.
  • ⍎¨applique la fonction d'exécution ( ) à chacun ( ¨) des caractères susmentionnés, résultant en un vecteur d'entiers 1 et 0.
  • 2⊥ décode le vecteur de la base 2 en décimal.
  • - annule l'entier décimal résultant.
  • (16/¯2)⊤code l'entier décimal en base ¯2(négatif 2). ( 16/¯2réplique ¯2, 16fois, donnant 16 chiffres dans notre nombre négabinaire.)
  • - annule chaque élément de notre nombre nouvellement encodé (avant cela, il se compose de -1 et de 0), afin que nous puissions l'utiliser pour indexer notre vecteur de caractères.
  • '01'[ ... ]indexe le tableau de caractères ( '01') en utilisant les 0 et les 1 du vecteur négabinaire inversé. C'est ainsi que nous obtenons une sortie plus jolie.

Exemple:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001
Dillon Cower
la source
4

Ruby, 32 31 caractères

m=43690
'%b'%(gets.to_i(2)+m^m)

Utilise le raccourci de calcul négabinaire .

Stefano Diem Benatti
la source
L'entrée n'est pas codée en dur. Le 0xAAAA n'est pas l'entrée, c'est le masque qui va transformer l'entrée. 0xAAAA est équivalent à 101010101010101010, qui est utilisé dans une opération XOR pour convertir le binaire en négabinaire. L'entrée elle-même provient du getsmot - clé, qui récupère de STDIN.
Stefano Diem Benatti
changé 0xAAAA en 43690 (qui est le même nombre en décimal) pour diminuer le nombre de caractères de 1. Cela rend plus difficile la compréhension de wtf.
Stefano Diem Benatti
Ah ok. Je ne suis pas bon rubis donc je n'étais pas sûr. Désolé pour ça.
Rɪᴋᴇʀ
3

GolfScript, 34 29 27 caractères

n*~]2base{.2%\(-2/.}do;]-1%

Une approche simple et directe. Il est assez intéressant de noter que la version la plus courte est celle qui se convertit d'abord en nombre, puis en base -2 (au moins la version la plus courte que j'ai pu trouver jusqu'à présent). Mais la bonne chose à propos de celui-ci est qu'il contient près de 15% %.

Edit 1: Pour la base 2, nous pouvons enregistrer une opération modulo et également joindre les deux boucles.

Edit 2: J'ai trouvé un code encore plus court pour convertir une chaîne binaire en entier.

Howard
la source
3

Haskell, 86 83 octets

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

Appelez en utilisant c puis un tableau d'entiers pour les chiffres, par exemple

c [1,1]

PS: je suis nouveau, ai-je soumis cela correctement?

EDIT: enregistré quelques octets grâce à Laikoni et également corrigé quelques fautes de frappe

EDIT2: Alternativement, c :: String -> String:

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

Pour 114 octets (mais vous l'appelez avec une chaîne: c "11")

Nom d'affichage générique
la source
Oui tu peux! Bienvenue sur le site! J'espère que vous resterez!
Rɪᴋᴇʀ
Bienvenue chez PPCG! Vous pouvez supprimer les parenthèses undigits 2 n, car l'application de fonction se lie plus fort que le +m. Vous pouvez également enregistrer quelques octets en se liant mdans une garde c n|m<-0xAAAAAAAA= ....
Laikoni
2

Python (2.x), 77 caractères

(pas aussi court que les autres solutions en raison de la nécessité de changer manuellement de base ...) Devrait satisfaire aux exigences.

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

Les suggestions d'améliorations supplémentaires sont les bienvenues!

Alimentez-le avec des valeurs de départ comme celle-ci: 0b1001001

ChristopheD
la source
2

JavaScript, 68 octets

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

Serait de 52 octets dans ES6, mais cela postdate le défi:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)
Neil
la source
2

Gelée , 4 octets, défi de postdates de langue

Ḅb-2

Essayez-le en ligne!

Prend l'entrée et produit la sortie sous forme de liste de chiffres.

Explication

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

Ceci est à peu près juste une traduction directe de la spécification.


la source
N'est-ce pas non concurrentiel? Ce défi date de '11 ...
NoOneIsHere
J'ai manqué ça. Je mettrai une note dans l'en-tête.
1

k, 17 octets sans concurrence

Certaines des fonctionnalités utilisées sont probablement postérieures au défi.

1_|2!{_.5+x%-2}\2/

L'entrée est une liste de 1 et de 0, et la sortie est également une liste de 1 et de 0.

Exemples de fonctionnement du programme.

zgrep
la source
0

PHP, 69 octets

for($i=bindec($argn);$i;$i+=$i%2&$c,$i>>=1,$c^=1)$r=($i%2).$r;echo$r;

Version en ligne

Jörg Hülsermann
la source
0

ES8, 54B

b=>eval`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`
user75200
la source
0

Japt , 4 octets

Entrée sous forme de chaîne binaire, sortie sous forme de tableau de chiffres négatifs.

Íì2n

Essayez-le

Ou, en prenant l'entrée comme un tableau de chiffres binaires:

ì2JÉ

Essayez-le

Hirsute
la source