Dönüştür ikili dosyadan negabinary


15

Giriş olarak 0ve arasında 1111111111111111( ve 16-bit işaretsiz tam sayı) bir ikili tamsayı verildiğinde , aynı tamsayıyı negatif olarak verir .

Giriş, diliniz için en uygun formatta olabilir; örneğin, programın 0000000000000101sadece 16 basamaklı girişi işlemesi daha kolaysa 101, sadece girişi değil, programı yazabilirsiniz.

Örnek G / Ç

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

İşte olan numune programı negatif olmayan tamsayı üsleri dahil baz dönüşümleri yapar yazdım. Çalışmanızı kontrol etmek için kullanabilirsiniz.


Sadece biraz daha açıklığa kavuşturmak için, girdi ve çıktı ikili olmalı, değil mi? Yani: 0s ve 1s karakter dizeleri . Bana net görünüyor, ama bir cevap beni biraz şüphe ediyor ...
Joanis

@ M.Joanis Giriş ikili, çıktı negatif (ikili ile tamamen aynı görünüyor - sıfırlar ve sıfırlar dizisi - ancak sayının yorumlanma şekli farklı.)
Peter Olson

2
Bağlantı kopmuş gibi görünüyor, bu yüzden bu günlerde soruların kendi kendine
Jo King

Yanıtlar:


6

APL, 21 karakter

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

Bunun için Dyalog APL'yi ⎕IO0 olarak ayarlayarak, 1 yerine 0'dan başlayan dizileri dizine eklememize izin verdim .

Sağdan sola açıklama:

  • bize bir karakter vektörü olarak girdi sağlar.
  • ⍎¨yukarıda belirtilen karakterlerin her birine ( ¨) execute işlevini ( ) uygulayarak 1 ve 0'lı bir tamsayı vektörüne yol açar .
  • 2⊥ vektörü taban 2'den ondalığa dönüştürür.
  • - elde edilen ondalık tamsayıyı reddeder.
  • (16/¯2)⊤ondalık tamsayıyı tabana kodlar ¯2(negatif 2). ( 16/¯2kopyaları ¯2, 16süreleri, negatif sayımızda 16 basamak vererek.)
  • - yeni kodlanmış sayımızın her bir öğesini (bundan önce -1 ve 0'lardan oluşur) reddeder, böylece karakter vektörümüzü endekslemek için kullanabiliriz.
  • '01'[ ... ]'01'Negatif negatif negatif vektörün 0'larını ve 1'lerini kullanarak karakter dizisini ( ) dizine ekler. Bu yüzden daha güzel bir çıktı elde ederiz.

Misal:

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

4

Ruby, 32 31 karakter

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

Negatif hesaplama kısayolunu kullanır .


Giriş sabit kodlanmış değil. 0xAAAA girdi değil, girdiyi dönüştürecek olan maske. 0xAAAA, bir XOR işleminde ikili dosyayı negatif olana dönüştürmek için kullanılan 1010101010101010'a eşdeğerdir. Girdinin kendisi, STDIN'den getirilen getsanahtar kelimeden gelir .
Stefano Diem Benatti

karakter sayısını 1 azaltmak için 0xAAAA'yı 43690'a (ondalık sayı ile aynı sayıdır) değiştirdi. wtf'nin ne olduğunu anlamayı zorlaştırıyor.
Stefano Diem Benatti

Ah tamam. İyi yakut değilim o yüzden emin değildim. Bunun için üzgünüm.
Rɪᴋᴇʀ

3

GolfScript, 34 29 27 karakter

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

Düz-ileriye doğru bir yaklaşım. En kısa versiyonun önce sayıya ve daha sonra taban -2'ye (en azından şimdiye kadar bulabildiğim en kısa versiyon) dönüşen versiyon olması oldukça ilginçtir. Ancak bununla ilgili güzel olan şey, neredeyse% 15'i içermesidir %.

Edit 1: Base 2 için bir modulo işlemi kaydedebilir ve her iki döngüye de katılabiliriz.

Edit 2: İkili dizeyi tamsayıya dönüştürmek için daha da kısa bir kod buldum.


3

Haskell, 86 83 Bayt

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

Rakamlar için c ve ardından bir tamsayı dizisi kullanarak çağırın, ör.

c [1,1]

Not: Yeniyim, bunu doğru bir şekilde gönderdim mi?

EDIT: Laikoni sayesinde bazı bayt tasarrufu ve ayrıca bazı yazım hataları düzeltildi

EDIT2: Alternatif olarak, 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

114 bayt için (ancak bir dize ile çağırırsınız: c "11")


Evet yaptın! Siteye Hoşgeldiniz! Umarım etrafta dolaşırsın!
Rɪᴋᴇʀ

PPCG'ye Hoşgeldiniz! undigits 2 nİşlev uygulaması .'den daha güçlü bağlandığından parantezleri bırakabilirsiniz +m. Ayrıca bağlanarak bazı bayt kaydedebilirsiniz mbir bekçi: c n|m<-0xAAAAAAAA= ....
Laikoni

2

Python (2.x), 77 karakter

(baz istasyonunu manuel olarak değiştirme ihtiyacı nedeniyle diğer çözümler kadar kısa değil ...) Gereksinimleri karşılamalıdır.

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

Daha fazla iyileştirme önerileri bekliyoruz!

Bunun gibi başlangıç ​​değerleriyle besleyin: 0b1001001


2

JavaScript, 68 bayt

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

ES6'da 52 bayt olur, ancak bu meydan okumadan sonra gelir:

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

2

Jelly , 4 bayt, dil postdates zorluğu

Ḅb-2

Çevrimiçi deneyin!

Girdi alır ve basamak listesi olarak çıktı üretir.

açıklama

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

Bu hemen hemen şartnamenin doğrudan bir çevirisi.


Bu rakip değil mi? Bu meydan okuma '11 ... dan
NoOneIsHere

Onu özledim. Başlığa bir not koyacağım.

1

k, 17 bayt rekabet etmiyor

Kullanılan özelliklerin bazıları muhtemelen meydan okumadan sonra.

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

Girdi 1'lerin ve 0'ların bir listesidir ve çıktı da 1'lerin ve 0'ların bir listesidir.

Çalışan program örnekleri.





0

Japt , 4 bayt

İkili dize olarak giriş yapın, negatif bir basamak dizisi olarak çıkın.

Íì2n

Dene

Veya girdiyi ikili basamak dizisi olarak alarak:

ì2JÉ

Dene

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.