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.


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

4

Ruby, 32 31 caractères

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

Utilise le raccourci de calcul négabinaire .


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.


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")


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


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`)

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.


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.





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

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.