バイナリからネガバイナリに変換


15

入力として01111111111111111(つまり16ビットの符号なし整数)の間に含まれるバイナリ整数が与えられた場合、同じ整数をネガバイナリに出力します

入力は、言語に最も適した形式であれば何でもかまいません。たとえば、プログラムが16桁の入力を簡単に処理する0000000000000101よりも16桁で処理する方が簡単な場合は、101その方法で入力を受け入れるようにプログラムを作成できます。

サンプルI / O

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

以下は、負および非整数のベースを含むベース変換を行うサンプルプログラムです。これを使用して作業を確認できます。


もう少し明確にするために、入力と出力はバイナリである必要がありますよね?つまり、0sと1sの文字列です。私にははっきり見えますが、答えは私を軽く疑います
...-ジョアニス

@ M.Joanis入力は、バイナリで出力がnegabinaryです(バイナリとまったく同じに見えた- 0と1の文字列-しかし、数が解釈される方法が異なります。)
ピーター・オルソン

2
リンクがダウンしているように見えます。これが、最近、質問を自己完結型にする必要がある主な理由です
ジョーキング

回答:


6

APL、21文字

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

これにはDyalog APLを使用しました。 ⎕IO 0に設定して、1ではなく0から始まる配列にインデックスを付けました。

説明、右から左へ:

  • ユーザーの入力を文字ベクトルとして提供します。
  • ⍎¨実行関数()を各(¨上記の文字整数1と0のベクトルを生成します。
  • 2⊥ ベクトルを基数2から10進数にデコードします。
  • - 結果の10進整数を否定します。
  • (16/¯2)⊤10進整数を基数¯2(負の2)にエンコードします。(16/¯2複製¯216回、私たちのnegabinary数で16桁の数字を得ました。)
  • - 新しくエンコードされた数値の各要素を否定します(この前は-1と0で構成されています)。これを使用して文字ベクトルのインデックスを作成できます。
  • '01'[ ... ]'01'負のネガバイナリベクトルの0と1を使用して、文字配列()にインデックスを付けます。これにより、きれいな出力が得られます。

例:

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

4

ルビー、32 31文字

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

ネガバイナリ計算のショートカットを使用します。


入力はハードコードされていません。0xAAAAは​​入力ではなく、入力を変換するマスクです。0xAAAAは​​、1010101010101010と同等です。これは、バイナリをネガバイナリに変換するXOR演算で使用されます。入力自体はgets、STDINから取得するキーワードから取得されます。
ステファノディエムベナッティ

0xAAAAを43690(10進数で同じ数)に変更して、文字数を1減らしました。しかし、wtfが起こっていることを理解しにくくします。
ステファノディエムベナッティ

うん、いいよ。ルビーは良くないので、よく分からなかった。ごめんなさい
Rɪᴋᴇʀ

3

GolfScript、34 29 27文字

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

単純なフォワードフォワードアプローチ。最短バージョンが最初に数値に変換され、次にベース-2に戻されることは非常に興味深いです(少なくとも、これまでに見つかった最短バージョン)。しかし、これについての良いところは、15%近く含まれていること%です。

編集1:基数2に対して、1つのモジュロ演算を保存し、両方のループを結合できます。

編集2:バイナリ文字列を整数に変換するさらに短いコードを見つけました。


3

Haskell、86 83バイト

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

cを使用して呼び出し、次に数字の整数配列を使用します。たとえば、

c [1,1]

PS:私は新しいですが、これを正しく提出しましたか?

編集:ライコニのおかげでいくつかのバイトを保存し、またいくつかのタイプミスを修正

EDIT2:または、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バイト(ただし、文字列c "11"で呼び出します)


はい、あなたはやりました!サイトへようこそ!頑張ってね!
Rɪᴋᴇʀ

PPCGへようこそ!undigits 2 n関数アプリケーションは+m。よりも強力にバインドするため、括弧を削除できます。またm、ガードでバインドすることにより、いくつかのバイトを保存できますc n|m<-0xAAAAAAAA= ...
ライコニ

2

Python(2.x)、77文字

(ベースを手動で切り替える必要があるため、他のソリューションほど短くはありません...)要件を満たす必要があります。

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

さらなる改善のための提案を歓迎します!

次のような開始値を入力します。 0b1001001


2

JavaScript、68バイト

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

ES6では52バイトになりますが、それは課題をポストデートします。

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

2

Jelly、4バイト、言語後日付けチャレンジ

Ḅb-2

オンラインでお試しください!

入力を受け取り、出力を数字のリストとして生成します。

説明

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

これはほとんど仕様の直接的な翻訳です。


これは競合していませんか?この課題は'11
...-NoOneIsHere

私は逃しました。ヘッダーにメモを入れます。

1

k、17バイト 非競合

使用された機能のいくつかは、おそらく課題の後期です。

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

入力は1と0のリストであり、出力も1と0のリストです。

プログラムの動作例。





弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.