Onaltılıdan İkiliye


10

Onaltılık bir sayıyı (herhangi bir boyutta) bir ikili sayıya dönüştürün.

Başlangıçta başında
bir POZİTİF onaltılı sayı girin0x . Geçerli bir giriş daima aşağıdaki regex eşleşir: 0x[0-9a-fA-F]+. Giriş geçerli bir onaltılık sayı değilse , yani bu normal ifadeyle eşleşmeyen herhangi bir şey değilse, çıktı olmalıdır 0.

Çıktı
İkili biçime dönüştürülen onaltılık.


Orijinal Kod-Golf Kuralları Kazanma , En az ısırık miktarı (bytes).

Örnekler

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
"Girdi geçerli bir onaltılık sayı değilse", ne tür şeyler olabilir? Farklı bir tabanda bir sayı mı? Sayısal olmayan bir nesne mi? Program çökmesine yapılan bazı nesne, muhtemelen catchable olmayan bir şekilde değerlendirilir? Gerçekten, giriş doğrulamasından kaçınmayı önerirdim; bir bukalemun meydan okuması gibi geliyor .
xnor

2
Test senaryolarından kural çıkarmak , uygun değildir ve büyük olasılıkla bu meydan okumayı netleştirmeyecektir. Bunun dışında örnekler bana açık değil. "# 0ac4" herhangi bir ekstra karakter eklenebilir gibi görünüyor.
xnor

1
Düzenlemeden sonra hangi girişlerin mümkün olduğunu hala net değilim. Mı #0ac4hala geçerli bir test durumu?
xnor

5
İkinci test çantanız normal ifadenizle eşleşmiyor ( Xbüyük harf).
Dada

1
Baştaki sıfırlarla ilgilenmemiz gerekiyor mu? Gibi bir şey çıktı alabilir miyiz00011010
user41805

Yanıtlar:


3

Pyth, 15 bayt

.B&qr0<z2"0x"vz

Açıklama:

             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 odası

0xOP'de kural açıklaması ( küçük harf olması gerekir) ile r013 bayt kaldırabilirsiniz .

.B&q<z2"0x"vz


2

05AB1E , 11 bayt

Î2£„0xQi¹Hb

Çevrimiçi deneyin!

açıklama

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

Test çantasıyla çalışmaz 0XFF.
Okx

@Okx: Sorunun hem normal ifade hem de giriş bölümü doğru girişin başladığını belirtir, 0xbu yüzden belirli test senaryosunun yanlış olduğunu söyleyebilirim.
Emigna

1
Ah evet, bunu fark etmedim.
Okx


1

Toplu, 402 bayt

@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 üzerine girdi alır. 8 satır daha sonra giriş doğrulamasında çoğunlukla boşa harcanır, bu nedenle ilginç satırlar, her bir onaltılık basamağı ikili eşdeğeriyle değiştiren, ancak Toplu sınırlamalar nedeniyle ., tüm .s ve satır 14'ü silen bir satır 12, satır ile değiştirir. önde gelen 0'ları kaldırır. Ancak bu gibi girişler için başarısız olur, bu 0x0yüzden 0 yerine çıkış olduğu anlamına gelir.


1

PHP, 66 65 63 bayt

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

boru olarak çalıştırmak -F.

Olmadan 0x, en kötü sorun hem olurdu hexdecve base_convertsadece onaltılık olmayan karakterler görmezden; fakat bununla birlikte, yine de açık bir geçerlilik kontrolü olmalıdır.


45 bayt olmadan 0x:

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

echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;Bu güzel bir alternatif mi? Verilen test
senaryoları

@ JörgHülsermann: It'sa güzel bir alternatif ve İt's herkes için çalışan verilen test durumlarda, ancak yok değil (benim yorumu görmek geçerliliği için onaltılık değerini kontrol hexdecve base_convert).
Titus

Biliyorum ve bence soru verilen testcasları ile bir şaka.
Jörg Hülsermann

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

-2 bayt <?=arasında Istead echo -F seçeneğiyle
Jörg Hülsermann

0

JavaScript (ES6), 109 108 bayt

Herhangi bir giriş boyutu için çalışır.

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

Test senaryoları


Hmm ... 2 deneyimli golfçüler benimkinin iki katından daha uzun süredir madeni bana meydan okuduğum bir şeyi kaçırıp kaçırmadığımı merak ediyor.
Shaggy

@Shaggy Her şey meydan okumanın ilk satırının yorumlanmasına bağlıdır. Ben 'herhangi bir boyutta' kesin bir gereklilik olduğunu - ve görünüşe göre Neil yaptı bunu için aldı .
Arnauld

@Shaggy Sadece herkese açıklık getirmek için: yaklaşımınız 0x1fffffffffffff- aka Number.MAX_SAFE_INTEGER- kadar işe yarar ve bunun ötesinde yuvarlak sonuçlar döndürür. Şans eseri, iki büyük test durumu doğru şekilde yuvarlanır.
Arnauld

Ha, @ Shaggy'nin kodunun kazara çalıştığını fark etmedim; Sanırım sonuçtaki ilk ve son 1bitler arasındaki mesafeyi saymalıydım. Bu arada, $ilk regexp'de ihtiyacınız var mı?
Neil

@Neil Bundan kurtulabileceğimi sanmıyorum $. Fikir, 1sonuçta hiç yoksa son sıfıra ulaşmaktır.
Arnauld

0

REXX, 45 bayt

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


0

perl, 25

(kod 24 + 1 bayrak -n)

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

0

JavaScript (ES6), 116 111 bayt

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 bit hassasiyetle sınırlı değildir. Düzenleme: Rakam dönüşümümü yeniden yazarak 5 bayt kaydedildi, bu da benim dil gereksinimlerimi ES6'ya düşürüyor.


Her karakteri onaltılık değer olarak değerlendirerek uzunluğu 13 bayt azaltabilirsiniz. Çevrimiçi Deneyin
fəˈnɛtɪk

@ fəˈnɛtɪk Bu, soruyu olduğu gibi çözmez.
Neil

Burada, ilk dönüşümden önde gelen sıfırları kaldırdım Çevrimiçi deneyin 2 bayt daha kısa.
fəˈnɛtɪk

@ fəˈnɛtɪk Arnauld'un cevabı ile birleştirdim ve 103'e indirdim: Çevrimiçi deneyin!
Neil

@ fəˈnɛtɪk Bekle, bu beşinci test vakasında işe yaramaz 0x00101011, üzgünüm.
Neil

0

8086 makine kodu - 63 bayt

125 karaktere kadar herhangi bir giriş için çalışır (DOS'ta maksimum komut satırı uzunluğu)

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 bayt

( Herhangi bir boyuttaki girdileri işlemediği için rekabet etmiyor ; Örnek girişlerle şanslıydım)

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 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

f=
x=>0|/^0x[A-Fa-f0-9]+$/.test(x)&&Number.parseInt(x).toString(2)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.