16進数から2進数


10

(任意のサイズの)16進数を2進数に変換します。

入力
A POSITIVEの 16進数0x始まりインチ 有効な入力は常に次の正規表現に一致します:0x[0-9a-fA-F]+。入力が有効な16進数ではない場合、つまりこの正規表現に一致しない場合、出力はになります0

出力
16進数が2進数に変換されます。


元のコードゴルフルールに勝ち、バイト数が最も少ない(bytes)

IN: 0x12
OUT: 10010

IN: 0xFF
OUT: 11111111

IN: 0XFF
OUT: 0

IN: #0ac4
OUT: 0

IN: 0x00101011
OUT: 100000001000000010001

IN: 0x525600
OUT: 10100100101011000000000

IN: 0x58f70555118ec400
OUT: 101100011110111000001010101010100010001100011101100010000000000

IN: 0x6669795966AF3000
OUT: 110011001101001011110010101100101100110101011110011000000000000

IN: 0b018474
OUT: 0

IN: 9577383
OUT: 0

IN: -483355
OUT: 0

IN: -0xf9ad92
OUT: 0

7
「入力が有効な16進数ではない場合」と言うと、どのような種類の入力が可能ですか?別のベースの番号?非数値オブジェクト?プログラムをクラッシュさせるために作成されたオブジェクトが、おそらくキャッチできない方法で評価されますか?本当に、私は入力検証をまったく避けることを提案したでしょう。カメレオンチャレンジのようです。
xnor 2017

2
テストケースからルールを推測すること適切ではなく、課題が不明確である可能性があります。その上、例は私には明確ではありません。「#0ac4」は、余分な文字を含めることができるように見えます。
xnor 2017

1
編集後、どの入力が可能かはまだはっきりしていません。で#0ac4、まだ有効なテストケース?
xnor 2017

5
2番目のテストケースが正規表現と一致しません(X大文字です)。
ダダ

1
先行ゼロを処理する必要がありますか?次のようなものを出力できますか00011010
user41805

回答:


3

Pyth、15バイト

.B&qr0<z2"0x"vz

説明:

             vz  Evaluate the input as a literal, to get a number (casts to integer for hexadecimal input)
      <z2        Select the first two characters of (string) input
    r0           cast to lowercase (0X -> 0x)
   q     "0x"    check whether the text starts with "0x" or "0X" (negative numbers don't) 
  &              If it does, return the casted number
.B               and convert to binary string

テストスイート

0xOPでのルールの明確化(小文字でなければならない)を使用するとr0、13バイトを削除できます。

.B&q<z2"0x"vz


2

05AB1E、11バイト

Î2£„0xQi¹Hb

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

説明

Î             # initialize stack with 0 and push input
 2£           # get the first 2 chars of input
   „0xQ       # compare to "0x"
       i      # if equal
        ¹H    # convert input from base-16 to base-10
          b   # convert to binary

テストケースでは動作しません0XFF
Okx

@Okx:質問の正規表現と入力セクションの両方で、正しい入力が始まると述べている0xので、特定のテストケースは間違っていると思います。
Emigna

1
ああ、気づかなかった。
Okx


1

バッチ、402バイト

@echo off
set/ps=
set r=0
if not %s:~0,2%==0x goto g
if %s%==0x goto g
if %s:0=%==x goto g
set t=%s%
for %%h in (0 1 2 3 4 5 6 7 8 9 a b c d e f)do call set t=%%t:%%h=%%
if not %t%==x goto g
set s=%s:~2%
for %%h in (0.0000 1.0001 2.0010 3.0011 4.0100 5.0101 6.0110 7.0111 8.1000 9.1001 a.1010 b.1011 c.1100 d.1101 e.1110 f.1111)do call set s=%%s:%%~nh=%%~xh%%
set r=%s:.=%
:g
echo %r:*1=1%

STDINで入力を受け取ります。次に、8行が入力の検証でほとんど無駄になっているため、興味深い行は11行目です。これは、各16進数字を2進数に置き換えますが、バッチの制限により、先頭の.、12行目、すべての.s を削除し、14行目、先行する0を削除します。しかし、これは次のような入力では失敗する0x0ので、代わりに0が出力されることを意味する入力を「無効化」します。


1

PHP、66 65 63バイト

<?=decbin(hexdec(preg_filter("#^0x([a-f\d]+$)#i","$1",$argn)));

でパイプとして実行し-Fます。

がない0x場合、最悪の問題は、16進数ではない文字hexdecと両方がbase_convert無視されることです。しかし、それでは、とにかく明示的な有効性チェックが必要です。


なしの45バイト0x

<?=decbin(ctype_xdigit($argn)*hexdec($argn));

echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;これはいい代替品ですか?これは、与えられたテストケースのために働く必要があります
イェルクHülsermann

@JörgHülsermann:これは素晴らしい代替案であり、与えられたすべてのテストケースで機能しますが、16進値の妥当性をチェックしませhexdecおよびの私のコメントを参照base_convert)。
タイタス

私は知っているし、問題は与えられたテストケースの冗談だと思う。
イェルクHülsermann

1
echo decbin(hexdec(preg_filter("#^0x([a-f\d]+$)#i","$1",$argn)));
クリストフ

-2バイト数<?=のistead echo -fオプションで
イェルクHülsermann

0

JavaScript(ES6)、109 108バイト

任意の入力サイズで機能します。

s=>/1.*|0$/.exec((/^0x([\da-f]+)$/i.exec(s)||'_0')[1].replace(/./g,d=>(+`0x1${d}`).toString(2).slice(1)))[0]

テストケース


うーん... 2人の経験豊富なゴルファーは、より多くの倍の長として、よりJSソリューションを提出する鉱山は、私は挑戦で何かを見逃している場合、私は疑問に思っています。
Shaggy

@Shaggyそれはすべて、チャレンジの最初の行の解釈に依存します。私は、「どんなサイズの」も明確な要件であると当然と思っていました-そして、ニールもそうでした。
Arnauld 2017

@Shaggy皆のために明確にするために:あなたのアプローチは最大0x1fffffffffffff-別名Number.MAX_SAFE_INTEGER-で機能し、それを超えた丸められた結果を返します。運がよければ、2つの大きなテストケースは正しく丸められます。
Arnauld 2017

ええと、@ Shaggyのコードが誤って機能していることに気付きませんでした。1結果の最初のビットと最後のビットの間の距離を数えるべきだったと思います。ちなみに、あなた$は最初の正規表現で必要ですか?
ニール、

@ニール私はこれを取り除くことができるとは思わない$1結果に結果がまったくない場合、最後のゼロを取得するのが目的です。
Arnauld 2017



0

perl、25

(コード24 + 1フラグ-n)

printf"%8b",/^0x/i?hex:0

0

JavaScript(ES6)、116 111バイト

f=
s=>/^0x[\da-f]+$/i.test(s)?s.replace(/./g,c=>parseInt(4+c,36).toString(2).slice(-4)).replace(/0+10*(.)/,'$1'):0
<input oninput=o.textContent=f(this.value)><pre id=o>0

53ビットの精度に限定されません。編集:数字変換を書き換えることで5バイトを節約しました。これにより、言語要件もES6に削減されます。


各文字を16進値として評価することにより、長さを13バイト減らすことができます。オンラインで試す
f –nɛtɪk 2017

@ fəˈnɛtɪkそれは提起された質問を解決しません。
Neil、

ここでは、最初の変換から先頭のゼロを削除しました。それでも2バイト短いので試してください
fəˈnɛtɪk 2017

@ fəˈnɛtɪk Arnauldの回答と組み合わせて、103に下げました。オンラインでお試しください!
Neil

@ fəˈnɛtɪkちょっと待ってください、それは5番目のテストケース0x00101011では機能しません。
ニール、

0

8086マシンコード-63バイト

最大125文字の入力で機能します(DOSでのコマンドラインの最大長)

00000000  be 82 00 bf 3f 01 89 fa  ad 3d 30 78 75 24 ac 3c  |....?....=0xu$.<|
00000010  0d 74 22 2c 30 3c 09 76  08 24 df 2c 07 3c 0f 77  |.t",0<.v.$.,.<.w|
00000020  11 b1 04 c1 e0 0c d0 e4  0f 92 c0 0c 30 aa e2 f6  |............0...|
00000030  eb dc ba 3d 01 b0 24 aa  b4 09 cd 21 c3 30 24     |...=..$....!.0$|
0000003f

0

JavaScript(ES6)、53 52 49 50 52 45バイト

どのサイズの入力も処理しないため、競合しません。サンプル入力で幸運になりました)

f=

h=>+/^0x[\da-f]+$/i.test(h)&&(+h).toString(2)

console.log(f`0x12`);
console.log(f`0XFF`);
console.log(f`#0ac4`);
console.log(f`0x00101011`);
console.log(f`0x525600`);
console.log(f`0x58f70555118ec400`);
console.log(f`0x6669795966AF3000`);
console.log(f`0b018474`);
console.log(f`9577383`);
console.log(f`-483355`);
console.log(f`-0xf9ad92`);


0

CJam、24バイト

q2/("0x"={seu:~Gb2bo}&;0

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

説明

q      e# Read the input
2/     e# Split it into 2-length segments
(      e# Pull out the first segment
"0x"=  e# Check if it equals "0x"
{      e# If it does, run this block:
 s     e#  Join the segments back together
 eu    e#  Make the string uppercase
 :~    e#  Eval each character (A-K are 10-20)
 Gb    e#  Convert from base 16 to base 10
 2b    e#  Convert to base 2
 o     e#  Output the binary number
}&     e# (end of block)
;0     e# Delete the top stack element and push 0. If the block was run, nothing is left
       e# on the stack, so the program terminates with an error before pushing 0.

0

JavaScript(ES6)、107文字

f=
b=>/0x[\da-f]+$/i.test(b)&&b.match(/[\da-f](?!x)/gi).map(x=>((+('0x1'+x)).toString(2)).slice(-4)).join('')||0

console.log(f('0x1f'))
console.log(f('0x6669795966AF3000'))



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