Heksadesimal ke Biner


10

Ubah angka heksadesimal (dari berbagai ukuran) menjadi angka biner.

Masukan
A POSITIF nomor heksadesimal dengan 0xdi awal. Sebuah input yang valid akan selalu cocok dengan regex berikut: 0x[0-9a-fA-F]+. Jika input bukan angka heksadesimal yang valid, yaitu, apa pun yang tidak cocok dengan regex ini, output seharusnya 0.

Output
Heksadesimal dikonversi menjadi biner.

Memenangkan
Aturan Kode-Golf Asli, Jumlah gigitan terendah (bytes).

Contohnya

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
Ketika Anda mengatakan "Jika input bukan angka heksadesimal yang valid", hal-hal seperti apa itu? Angka di pangkalan yang berbeda? Objek non-numerik? Beberapa objek yang dibuat untuk crash program dievaluasi, mungkin dengan cara yang tidak dapat ditangkap? Sungguh, saya akan menyarankan menghindari validasi input sama sekali; rasanya seperti tantangan bunglon .
xnor

2
Menyimpulkan aturan dari kasus - kasus uji tidak OK dan kemungkinan akan menutup tantangan sebagai tidak jelas. Selain itu, contoh-contohnya tidak jelas bagi saya. "# 0ac4" membuatnya tampak seperti karakter tambahan apa pun dapat dimasukkan.
xnor

1
Saya masih tidak jelas setelah mengedit input apa yang mungkin. Apakah #0ac4masih ada test case yang valid?
xnor

5
Testcase kedua Anda tidak cocok dengan regex Anda ( Xhuruf besar).
Dada

1
Apakah kita perlu menjaga nol terkemuka? Bisakah kita menampilkan sesuatu seperti00011010
user41805

Jawaban:


3

Pyth, 15 byte

.B&qr0<z2"0x"vz

Penjelasan:

             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

Test Suite

Dengan klarifikasi aturan (yang 0xharus huruf kecil) di OP, Anda dapat menghapus r0selama 13 byte.

.B&q<z2"0x"vz


2

05AB1E , 11 byte

Î2£„0xQi¹Hb

Cobalah online!

Penjelasan

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

Tidak bekerja dengan test case 0XFF.
Okx

@ Okx: Baik regex dan bagian input dari pertanyaan menyatakan bahwa input yang benar dimulai dengan 0xjadi saya akan mengatakan bahwa test-case tertentu salah.
Emigna

1
Ah ya, aku tidak menyadarinya.
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%

Mengambil input pada STDIN. 8 baris kemudian sebagian besar terbuang pada validasi input, sehingga baris yang menarik adalah baris 11, yang menggantikan setiap digit heksa dengan ekuivalen binernya, tetapi karena batasan Batch, dengan .garis 12 terkemuka , yang menghapus semua huruf .s, dan garis 14 , yang menghapus 0s awal. Namun ini gagal untuk input seperti 0x0jadi saya "membatalkan" yang artinya 0 adalah output.


1

PHP, 66 65 63 byte

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

dijalankan sebagai pipa dengan -F.

Tanpa itu 0x, masalah terburuk adalah keduanya hexdecdan base_convertmengabaikan karakter yang bukan hex; tetapi dengan itu, bagaimanapun juga harus ada pemeriksaan validitas eksplisit.


45 byte tanpa 0x:

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

echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;Apakah ini Alternatif yang baik? Seharusnya berfungsi untuk testcases yang diberikan
Jörg Hülsermann

@ JörgHülsermann: Ini adalah alternatif yang bagus, dan bekerja untuk semua kasus uji yang diberikan , tetapi tidak memeriksa nilai hex untuk validitas (lihat komentar saya di hexdecdan base_convert).
Titus

Saya tahu dan saya pikir pertanyaannya adalah lelucon dengan testcases yang diberikan.
Jörg Hülsermann

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

-2 Bytes <?=dari echo dengan opsi -F
Jörg Hülsermann

0

JavaScript (ES6), 109 108 byte

Berfungsi untuk ukuran input apa pun.

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

Uji kasus


Hmm ... 2 pegolf berpengalaman mengirimkan solusi JS lebih dari dua kali selama saya memiliki saya bertanya-tanya apakah aku sudah melewatkan sesuatu dalam tantangan.
Shaggy

@Shaggy Semuanya tergantung pada interpretasi dari baris pertama tantangan. Saya menerima begitu saja bahwa 'dalam ukuran berapa pun' adalah persyaratan yang pasti - dan begitu pula Neil.
Arnauld

@ Shaggy Hanya untuk memperjelas bagi semua orang: pendekatan Anda bekerja hingga 0x1fffffffffffff- alias Number.MAX_SAFE_INTEGER- dan mengembalikan hasil bulat di luar itu. Untungnya, dua test case besar dibulatkan dengan benar.
Arnauld

Hah, saya tidak menyadari bahwa kode @ Shaggy bekerja secara tidak sengaja; Saya kira saya harus menghitung jarak antara 1bit pertama dan terakhir dalam hasil. Omong-omong, apakah Anda memerlukan $regexp pertama?
Neil

@Neil Saya tidak berpikir saya bisa menyingkirkan ini $. Idenya adalah untuk mendapatkan nol akhir jika tidak ada 1hasilnya sama sekali.
Arnauld

0

REXX, 45 byte

arg '0X' n
if n>'' then say x2b(n)
else say 0


0

perl, 25

(kode 24 + 1 flag -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

Tidak terbatas pada presisi 53 bit. Sunting: Disimpan 5 byte dengan menulis ulang konversi digit saya, yang juga mengurangi persyaratan bahasa saya menjadi ES6.


Anda dapat mengurangi panjangnya dengan 13 byte dengan mengevaluasi setiap karakter sebagai nilai hex. Cobalah Online
fəˈnɛtɪk

@ fəˈnɛtɪk Itu tidak menyelesaikan pertanyaan seperti yang diajukan.
Neil

Di sini, saya menghapus nol terkemuka dari konversi pertama. Coba Online, 2 byte lebih pendek.
fəˈnɛtɪk

@ fəˈnɛtɪk Saya menggabungkannya dengan jawaban Arnauld dan mendapatkannya ke 103: Coba online!
Neil

@ fəˈnɛtɪk Tunggu, itu tidak berfungsi untuk kasus uji kelima 0x00101011, maaf.
Neil

0

8086 kode mesin - 63 byte

Berfungsi untuk input apa saja hingga 125 karakter (panjang baris perintah maksimum di 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

(Non-bersaing karena tidak menangani input apa pun ukuran ; Saya hanya beruntung dengan input sampel)

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

Cobalah online!

Penjelasan

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 karakter

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.