Szesnastkowy na dwójkowy

10

Konwertuj liczbę szesnastkową (dowolnego rozmiaru) na liczbę binarną.

Wejście POSITIVE liczba szesnastkowa z początku. Ważny wkład będzie zawsze dopasować następujące wyrażenia regularnego: . Jeśli dane wejściowe nie są poprawną liczbą szesnastkową, to znaczy wszystko, co nie pasuje do tego wyrażenia regularnego, dane wyjściowe powinny być .
0x0x[0-9a-fA-F]+0

Dane wyjściowe
Szesnastkowy przekształcony na binarny.

Wygrywanie
oryginalnych zasad Code-Golf, najniższa ilość ugryzień (bytes).

Przykłady

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
Hashim Kayani
źródło
7
Kiedy mówisz „Jeśli dane wejściowe nie są prawidłową liczbą szesnastkową”, jakie to mogą być rodzaje? Liczba w innej bazie? Obiekt nienumeryczny? Jakiś obiekt stworzony do awarii programu jest oceniany, być może w sposób niemożliwy do złapania? Naprawdę sugerowałbym w ogóle unikanie sprawdzania poprawności danych wejściowych; czuje się jak wyzwanie kameleona .
xnor
2
Wnioskowanie reguł z przypadków testowych nie jest prawidłowe i prawdopodobnie zamknie wyzwanie jako niejasne. Poza tym przykłady nie są dla mnie jasne. „# 0ac4” sprawia, że ​​wydaje się, że można dołączyć dowolne dodatkowe znaki.
xnor
1
Po edycji nadal nie jestem pewien, jakie dane wejściowe są możliwe. Czy #0ac4nadal jest ważny przypadek testowy?
xnor
5
Druga walizka testowa nie pasuje do wyrażenia regularnego ( Xjest to duża litera).
Dada,
1
Czy musimy dbać o wiodące zera? Czy możemy wyprowadzić coś takiego00011010
user41805 12.04.17

Odpowiedzi:

3

Pyth, 15 bajtów

.B&qr0<z2"0x"vz

Wyjaśnienie:

             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

Pakiet testowy

Z wyjaśnieniem zasad (które 0xmuszą być małymi literami) w PO, możesz usunąć r0dla 13 bajtów.

.B&q<z2"0x"vz
Steven H.
źródło
7

Python 2, 67 62 60 59 bajtów

n=input()
try:print bin(int(n,n[1]<'x'))[2:]
except:print 0

Wypróbuj online!

Wersja, w której występują błędne dane wejściowe (27 bajtów):

lambda n:bin(int(n,16))[2:]

Wypróbuj online!

ćpun matematyki
źródło
2

05AB1E , 11 bajtów

Î2£„0xQi¹Hb

Wypróbuj online!

Wyjaśnienie

Î             # 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
Emigna
źródło
Nie działa z przypadkiem testowym 0XFF.
Okx,
@Okx: Zarówno regex, jak i sekcja wejściowa pytania stwierdzają, że prawidłowe wprowadzanie rozpoczyna się od, 0xwięc powiedziałbym, że konkretny przypadek testowy jest nieprawidłowy.
Emigna,
1
Ach tak, nie zauważyłem tego.
Okx,
1

Partia, 402 bajty

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

Pobiera dane wejściowe na STDIN. 8 linii jest następnie w większości marnowanych podczas sprawdzania poprawności danych wejściowych, więc interesujące linie to linia 11, która zastępuje każdą cyfrę szesnastkową jej ekwiwalentem binarnym, ale z powodu ograniczeń wsadowych, wiodącą .linią 12, która usuwa wszystkie .s, i linią 14 , który usuwa wiodące zera. Jednak nie udaje się to dla takich danych wejściowych, 0x0więc „unieważniam” te, co oznacza, że ​​zamiast tego wyprowadzane jest 0.

Neil
źródło
1

PHP, 66 65 63 bajtów

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

uruchomić jako potok z -F.

Bez tego 0xnajgorszym problemem byłoby to, że oba z nich hexdeci base_convertpo prostu ignorowałyby znaki, które nie są hexami; ale przy tym i tak musi nastąpić jawna kontrola ważności.


45 bajtów bez 0x:

<?=decbin(ctype_xdigit($argn)*hexdec($argn));
Tytus
źródło
echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;Czy to miła alternatywa? Powinien działać dla podanych przypadków
testowych
@ JörgHülsermann: To dobra alternatywa i działa dla wszystkich podanych przypadków testowych, ale nie sprawdza poprawności wartości szesnastkowej (patrz mój komentarz na temat hexdeci base_convert).
Tytus
Wiem i myślę, że pytanie jest żartem z podanych przypadków testowych.
Jörg Hülsermann
1
echo decbin(hexdec(preg_filter("#^0x([a-f\d]+$)#i","$1",$argn)));
Christoph
-2 bajty <?=zamiast echo opcji -F
Jörg Hülsermann
0

JavaScript (ES6), 109 108 bajtów

Działa dla dowolnego rozmiaru wejściowego.

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

Przypadki testowe

Arnauld
źródło
Hmm ... 2 doświadczeni golfiści składające rozwiązań JS więcej niż dwa razy tak długo, jak kopalnia ma mnie zastanawiać, czy Tęskniłam coś w wyzwaniu.
Kudłaty
@Shaggy Wszystko zależy od interpretacji pierwszej linii wyzwania. Uznałem za rzecz oczywistą, że „o dowolnej wielkości” było zdecydowanym wymogiem - podobnie jak Neil.
Arnauld
@Shaggy Tylko dla wyjaśnienia dla wszystkich: twoje podejście działa do 0x1fffffffffffff- aka Number.MAX_SAFE_INTEGER- i zwraca zaokrąglone wyniki poza tym. Na szczęście dwa duże przypadki testowe są poprawnie zaokrąglone.
Arnauld
Huh, nie zdawałem sobie sprawy, że kod @ Shaggy zadziałał przypadkowo; Wydaje mi się, że powinienem policzyć odległość między pierwszym a ostatnim 1bitem w wyniku. Nawiasem mówiąc, czy potrzebujesz $pierwszego wyrażenia regularnego?
Neil,
@ Neil Nie sądzę, żebym się tego pozbył $. Chodzi o to, aby uzyskać końcowe zero, jeśli nie ma 1w ogóle wyniku.
Arnauld,
0

REXX, 45 bajtów

arg '0X' n
if n>'' then say x2b(n)
else say 0
idrougge
źródło
0

Siatkówka , 149 bajtów

.
;$&
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*

(zwróć uwagę na końcowy znak nowej linii)

Wypróbuj online!

Oto alternatywne rozwiązanie kosztem 7 bajtów: Wypróbuj!

user41805
źródło
0

perl, 25

(kod 24 + 1 flaga -n)

printf"%8b",/^0x/i?hex:0
Toto
źródło
0

JavaScript (ES6), 116 111 bajtów

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

Nie ogranicza się do 53 bitów precyzji. Edycja: Zapisałem 5 bajtów, przepisując moją konwersję cyfr, co również zmniejsza moje wymagania językowe do ES6.

Neil
źródło
Możesz skrócić długość o 13 bajtów, oceniając każdy znak jako wartość szesnastkową. Wypróbuj online
fəˈnɛtɪk
@ fəˈnɛtɪk To nie rozwiązuje postawionego pytania.
Neil,
Tutaj usunąłem zera z pierwszej konwersji. Wypróbuj online jeszcze o 2 bajty krócej.
fəˈnɛtɪk 20.04.17
@ fəˈnɛtɪk Połączyłem to z odpowiedzią Arnaulda i doprowadziłem do 103: spróbuj online!
Neil,
@ fəˈnɛtɪk Czekaj, to nie działa w piątym przypadku testowym 0x00101011, przepraszam.
Neil,
0

Kod maszynowy 8086 - 63 bajty

Działa dla dowolnego wejścia do 125 znaków (maksymalna długość wiersza poleceń w 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
użytkownik5434231
źródło
0

JavaScript (ES6), 53 52 49 50 52 45 bajtów

(Niekonkurencyjny, ponieważ nie obsługuje danych wejściowych o dowolnym rozmiarze; właśnie miałem szczęście z przykładowymi danymi wejściowymi)

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`);

Kudłaty
źródło
0

CJam , 24 bajty

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

Wypróbuj online!

Wyjaśnienie

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.
Business Cat
źródło
0

JavaScript (ES6), 107 znaków

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

Tomas Langkaas
źródło
0

JavaScript, 63 bajty

f=
x=>0|/^0x[A-Fa-f0-9]+$/.test(x)&&Number.parseInt(x).toString(2)
Steve Bennett
źródło