16 진수를 이진수로


10

모든 크기의 16 진수를 이진수로 변환하십시오.

입력 긍정적 인 A를 16 진수 시작한다. 유효한 입력은 항상 다음 정규식과 일치합니다 . 입력이 유효한 16 진수 가 아닌 경우 , 즉이 정규식과 일치하지 않는 경우 출력은이어야합니다 .
0x0x[0-9a-fA-F]+0

출력
16 진수를 이진수로 변환했습니다.


가장 적은 양의 물린 오리지널 코드 골프 규칙 승리(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

2
테스트 사례에서 규칙을 유추하는 것은 좋지 않으며 문제가 불분명 한 것으로 종결 될 수 있습니다. 그 외에도 예제는 명확하지 않습니다. "# 0ac4"는 추가 문자를 포함 할 수있는 것처럼 보입니다.
xnor

1
어떤 입력이 가능한지 편집 한 후에도 여전히 명확하지 않습니다. 가 #0ac4여전히 유효한 테스트 케이스?
xnor

5
두 번째 테스트 케이스가 정규식과 일치하지 않습니다 ( X대문자).
Dada

1
선행 0을 처리해야합니까? 다음과 같이 출력 할 수 있습니까?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에서 규칙 설명 ( 소문자 여야 함)을 사용하면 r013 바이트를 제거 할 수 있습니다 .

.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 진수를 이진수로 대체하지만 배치 제한으로 인해 선행 ., 줄 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;이것은 좋은 대안입니까? 주어진 테스트 케이스에서 작동해야합니다.
Jörg Hülsermann

@ JörgHülsermann : 좋은 대안이며 주어진 모든 테스트 사례에서 작동하지만 16 진수 값의 유효성을 검사 하지는 않습니다 ( hexdec및 내 의견 참조 base_convert).
Titus

나는 알고 있고 질문은 주어진 테스트 사례에 대한 농담이라고 생각합니다.
Jörg Hülsermann

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

-F 옵션 <?=echo 사용하는 대신 -2 바이트
Jörg Hülsermann

0

자바 스크립트 (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]

테스트 사례


흠 ... 두 배만큼보다 JS 솔루션을 제출이 숙련 된 골퍼 광산은 내가 도전에 뭔가를 놓친 경우 나 궁금 있습니다.
Shaggy

@Shaggy 그것은 모두 도전의 첫 번째 라인의 해석에 달려 있습니다. 나는 '어떤 크기의' 것이 분명한 요구 사항 이라는 것을 당연 하게 여겼습니다.
Arnauld

@Shaggy 모든 사람에게 명확하게 설명하기 위해 : 접근 방식은 최대 0x1fffffffffffff일명 작동하며 Number.MAX_SAFE_INTEGER그 이상의 결과를 반올림합니다. 운 좋게도 두 개의 큰 테스트 사례는 올바르게 반올림됩니다.
Arnauld

허, @Shaggy의 코드가 우연히 작동한다는 것을 몰랐다. 1결과에서 첫 번째 비트 와 마지막 비트 사이의 거리를 계산해야한다고 생각합니다 . 그건 그렇고, $첫 정규 표현식 이 필요 합니까?
Neil

@Neil 나는 이것을 제거 할 수 있다고 생각하지 않습니다 $. 아이디어는 1결과 가 전혀 없다면 최종 0을 얻는 것입니다.
Arnauld

0

REXX, 45 바이트

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


0

펄, 25

(코드 24 + 1 플래그 -n)

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

0

자바 스크립트 (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

@ fəˈnɛtɪk 그것은 제기 된 질문을 해결하지 못합니다.
Neil

여기에서 첫 번째 변환에서 선행 0을 제거 했습니다. 온라인으로 시도해보십시오 . 2 바이트가 더 짧습니다.
fəˈnɛtɪk

@ fəˈnɛtɪk 나는 그것을 Arnauld의 답변과 결합하여 103으로 줄였습니다 : 온라인으로보십시오!
Neil

@ fəˈnɛtɪk 잠깐, 5 번째 테스트 사례 0x00101011에서는 작동하지 않습니다 . 죄송합니다.
Neil

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

자바 스크립트 (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'))



0

자바 스크립트, 63 바이트

f=
x=>0|/^0x[A-Fa-f0-9]+$/.test(x)&&Number.parseInt(x).toString(2)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.