Hệ thập lục phân đến nhị phân


10

Chuyển đổi số thập lục phân (có kích thước bất kỳ) thành số nhị phân.

Input
Một TÍCH CỰC số thập lục phân với một 0xtrong đầu. Một đầu vào hợp lệ sẽ luôn khớp với regex sau : 0x[0-9a-fA-F]+. Nếu đầu vào không phải là số thập lục phân hợp lệ, nghĩa là, bất cứ thứ gì không khớp với biểu thức chính quy này, thì đầu ra phải là 0.

Đầu ra
Hệ thập lục phân chuyển thành nhị phân.

Giành chiến thắng
Quy tắc chơi gôn nguyên bản, số lần cắn thấp nhất (bytes).

Ví dụ

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
Khi bạn nói "Nếu đầu vào không phải là số thập lục phân hợp lệ", thì đó là loại thứ gì? Một số trong một cơ sở khác nhau? Một đối tượng không phải là số? Một số đối tượng được thực hiện để đánh sập chương trình được đánh giá, có thể theo cách không thể bắt được? Thực sự, tôi đã đề nghị tránh xác nhận đầu vào ở tất cả; nó cảm thấy như một thách thức tắc kè hoa .
xnor

2
Suy ra các quy tắc từ các trường hợp thử nghiệm là không ổn và có khả năng sẽ khiến thách thức đóng lại là không rõ ràng. Bên cạnh đó, các ví dụ không rõ ràng với tôi. "# 0ac4" làm cho có vẻ như bất kỳ nhân vật phụ nào cũng có thể được đưa vào.
xnor

1
Tôi vẫn chưa rõ sau khi chỉnh sửa những gì đầu vào có thể. Là #0ac4vẫn còn là một trường hợp thử nghiệm hợp lệ?
xnor

5
Testcase thứ hai của bạn không khớp với regex của bạn ( Xchữ hoa).
Dada

1
Chúng ta có cần phải chăm sóc các số 0 hàng đầu không? Chúng ta có thể xuất ra một cái gì đó như00011010
user41805

Câu trả lời:


3

Bình thường, 15 byte

.B&qr0<z2"0x"vz

Giải trình:

             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

Phòng thử nghiệm

Với một quy tắc làm rõ ( 0xphải là chữ thường) trong OP, bạn có thể xóa r013 byte.

.B&q<z2"0x"vz


2

05AB1E , 11 byte

Î2£„0xQi¹Hb

Hãy thử trực tuyến!

Giải trình

Î             # 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

Không hoạt động với trường hợp thử nghiệm 0XFF.
Okx

@Okx: Cả regex và phần đầu vào của câu hỏi đều nói rằng đầu vào đúng bắt đầu bằng 0xvì vậy tôi nói rằng trường hợp kiểm tra cụ thể là sai.
Emigna

1
À đúng rồi, tôi không để ý điều đó.
Okx


1

Batch, 402 byte

@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%

Đưa đầu vào vào STDIN. 8 dòng sau đó chủ yếu bị lãng phí khi xác thực đầu vào, vì vậy các dòng thú vị là dòng 11, thay thế từng chữ số hex bằng số nhị phân tương đương, nhưng do giới hạn Batch, với .dòng 12, hàng đầu , xóa tất cả các .dòng và dòng 14 , loại bỏ 0 hàng đầu. Tuy nhiên, điều này không thành công cho các đầu vào như 0x0vậy nên tôi "vô hiệu hóa" những đầu vào có nghĩa là 0 là đầu ra thay thế.


1

PHP, 66 65 63 byte

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

chạy như ống với -F.

Nếu không có 0x, vấn đề tồi tệ nhất là cả hai hexdecbase_convertchỉ cần bỏ qua các ký tự không phải là hex; nhưng với nó, dù sao cũng phải có một kiểm tra tính hợp lệ rõ ràng.


45 byte không có 0x:

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

echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;Đây có phải là một thay thế tốt đẹp? Nó sẽ hoạt động cho các testcase đã cho
Jörg Hülsermann

@ JörgHülsermann: Nó có thể thay thế tốt và nó hoạt động cho tất cả các trường hợp thử nghiệm đã cho , nhưng nó không kiểm tra giá trị hex cho tính hợp lệ (xem nhận xét của tôi về hexdecbase_convert).
Tít

Tôi biết và tôi nghĩ rằng câu hỏi là một trò đùa với các thử nghiệm đã cho.
Jörg Hülsermann

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

-2 Byte <?=istead của echo tùy chọn -F
Jörg Hülsermann

0

JavaScript (ES6), 109 108 byte

Hoạt động cho bất kỳ kích thước đầu vào.

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

Các trường hợp thử nghiệm


Hmm ... 2 người chơi golf có kinh nghiệm gửi giải pháp JS dài hơn gấp đôi tôi đã cho tôi tự hỏi nếu tôi đã bỏ lỡ điều gì đó trong thách thức.
Shaggy

@Shaggy Tất cả phụ thuộc vào việc giải thích dòng đầu tiên của thử thách. Tôi chấp nhận rằng 'bất kỳ kích cỡ nào' là một yêu cầu xác định - và Neil cũng vậy.
Arnauld

@Shaggy Chỉ cần làm rõ cho mọi người: cách tiếp cận của bạn có hiệu quả lên đến 0x1fffffffffffff - aka Number.MAX_SAFE_INTEGER- và trả về kết quả được làm tròn hơn thế. May mắn thay, hai trường hợp thử nghiệm lớn được làm tròn chính xác.
Arnauld

Huh, tôi đã không nhận ra rằng mã của @ Shaggy hoạt động một cách tình cờ; Tôi đoán tôi nên đã tính khoảng cách giữa đầu tiên và cuối cùng1 bit trong kết quả. Nhân tiện, bạn có cần $trong regrec đầu tiên không?
Neil

@Neil Tôi không nghĩ rằng tôi có thể thoát khỏi điều này $. Ý tưởng là lấy số 0 cuối cùng nếu không có 1kết quả nào.
Arnauld



0

perl, 25

(mã 24 + 1 cờ -n)

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

0

JavaScript (ES6), 116 111 byte

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

Không giới hạn ở độ chính xác 53 bit. Chỉnh sửa: Đã lưu 5 byte bằng cách viết lại chuyển đổi chữ số của tôi, điều này cũng làm giảm yêu cầu ngôn ngữ của tôi thành ES6.


Bạn có thể giảm độ dài 13 byte bằng cách đánh giá mỗi ký tự là giá trị hex. Dùng thử trực tuyến
fnɛtɪk

@ fəˈnɛtɪk Điều đó không giải quyết được câu hỏi như đặt ra.
Neil

Ở đây, tôi đã xóa các số 0 hàng đầu khỏi chuyển đổi đầu tiên Dùng thử trực tuyến vẫn ngắn hơn 2 byte.
fnɛtɪk

@ fəˈnɛtɪk Tôi đã kết hợp nó với câu trả lời của Arnauld và đưa nó xuống 103: Hãy thử trực tuyến!
Neil

@ fəˈnɛtɪk Đợi đã, không hoạt động cho trường hợp thử nghiệm thứ năm 0x00101011, xin lỗi.
Neil

0

Mã máy 8086 - 63 byte

Hoạt động cho mọi đầu vào lên tới 125 ký tự (độ dài dòng lệnh tối đa trong 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 byte

(Không cạnh tranh vì nó không xử lý các đầu vào kích thước bất kỳ ; Tôi chỉ gặp may mắn với các đầu vào mẫu)

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 byte

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

Hãy thử trực tuyến!

Giải trình

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 ký tự

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



0

Javascript, 63 byte

f=
x=>0|/^0x[A-Fa-f0-9]+$/.test(x)&&Number.parseInt(x).toString(2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.