Шістнадцяткова до двійкової


10

Перетворіть шістнадцяткове число (будь-якого розміру) у двійкове число.

Вхідні ПОЗИТИВ шістнадцяткове число з самого початку. Дійсний вхід завжди буде відповідати наступному регулярному виразу: . Якщо вхід не є дійсним шістнадцятковим числом, тобто тим, що не відповідає цьому регулярному вираженню, результат повинен бути .
0x0x[0-9a-fA-F]+0

Виведення
Шістнадцятковий перетворюється на двійковий.

Вигравши
оригінальні правила коду-гольфу, найменша кількість укусів (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
Коли ви говорите "Якщо введення не є дійсним шістнадцятковим числом", які типи речей це можуть бути? Число в іншій базі? Нечисловий об'єкт? Якийсь об'єкт, створений для збою програми, оцінюється, можливо, не піддається захоплюванню? Дійсно, я б запропонував взагалі уникати перевірки вводу; це відчувається як виклик хамелеона .
xnor

2
Визначення правил із тестових випадків не є нормальним, і, ймовірно, проблема буде закрита як незрозуміла. Крім того, приклади мені не зрозумілі. "# 0ac4" здається, що будь-які додаткові символи можуть бути включені.
xnor

1
Після редагування мені ще не зрозуміло, які входи можливі. Чи #0ac4все ще є дійсним тестовий випадок?
xnor

5
Ваша друга тестова скринька не відповідає вашому регексу ( X верхній регістр).
Дада

1
Чи потрібно дбати про провідні нулі? Чи можемо ми вивести щось на кшталт00011010
user41805

Відповіді:


3

Піт, 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

Тестовий сюїт

З уточненням правил (які 0xповинні бути малими літерами) в ОП, ви можете видалити 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: і в регулярному вираженні, і в вхідному розділі запитання вказується, що правильне введення починається з 0xтого, я б сказав, що конкретний тестовий випадок неправильний.
Емінья

1
Ага так, я цього не помічав.
Ок


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, який замінює кожну шістнадцяткову цифру її двійковим еквівалентом, але через обмеження в пакеті ., ведучим , рядок 12, який видаляє всі .s, і рядок 14 , що видаляє провідні 0. Однак це не вдається для таких входів, 0x0тому я "визнає недійсним" ті, що означає 0, а не вихід.


1

PHP, 66 65 63 байт

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

запустити як труба з -F.

Без цього 0xнайгіршою проблемою буде те, що обидва hexdecі base_convertпросто ігнорують персонажів, які не є шістнадцятковими; але з ним все одно має бути явна перевірка дійсності.


45 байт без 0x:

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

echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;Це приємна альтернатива? Він повинен працювати для даних тестів
Йорг Гюльсерманн,

@ JörgHülsermann: Це хороша альтернатива, і вона працює для всіх заданих тестових випадків, але вона не перевіряє шістнадцяткове значення на дійсність (див. Мій коментар hexdecі base_convert).
Тит

Я знаю, і я думаю, що питання - це жарт з даними тестовими вітринами.
Йорг Гюльсерманн

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 Просто для того, щоб уточнити для всіх: ваш підхід працює до 0x1fffffffffffff-aka Number.MAX_SAFE_INTEGER- і повертає закруглені результати поза цим. На щастя, дві великі тестові справи округлені правильно.
Арнольд

Так, я не зрозумів, що код @ Shaggy випадково спрацював; Я думаю, я мав би підрахувати відстань між першим і останнім 1бітами в результаті. До речі, чи потрібен вам $у першому регепс?
Ніл

@Neil Я не думаю, що я можу цього позбутися $. Ідея полягає в тому, щоб отримати кінцевий нуль, якщо в результаті взагалі немає 1.
Арнольд


0

Сітківка , 149 байт

.
;$&
T`L`l
f
71
e
70
d
61
c
60
b
51
a
50
9
41
8
40
7
31
6
30
5
21
4
20
3
11
2
10
;(\d{4})
$1
;(\d{3})
0$1
;(\d\d)
00$1
;
000
^(?!0{7}x).*
0
0{7}x0*

(зверніть увагу на останній рядок)

Спробуйте в Інтернеті!

Ось альтернативне рішення вартістю 7 байт: Спробуйте!




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.


Можна зменшити довжину на 13 байт, оцінивши кожен символ як шістнадцяткове значення. Спробуйте в Інтернеті
fəˈn 20tɪk

@ fəˈnɛtɪk Це не вирішує поставлене питання.
Ніл

Тут я видалив початкові нулі з першого перетворення. Спробуйте в Інтернеті ще на 2 байти коротше.
fəˈnɛtɪk

@ fəˈnɛtɪk Я поєднав це з відповіддю Арнаульда і дійшов до 103: Спробуйте в Інтернеті!
Ніл

@ fəˈnɛtɪk Зачекайте, це не працює для п’ятої тестової справи 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.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.