Ubah string "basis campuran" menjadi ASCII

8

Diberikan input string dengan byte yang mungkin dalam biner, oktal, atau hex, output setara string ASCII.

Masukan akan diberikan dalam format berikut, misalnya:

501200100001147

yang mewakili

0x50 0o120 0b01000011 0x47

yang setara (dalam ASCII) dengan

PPCG

Biner, oktal, dan hex akan selalu diberikan masing-masing 8, 3, dan 2 digit.

Untuk keperluan tantangan ini, hanya ASCII yang dapat dicetak yang harus didukung. Ini adalah kisaran 32..126inklusif. Karena itu, tidak mungkin ada ambiguitas. Catat itu

  • Sebuah string mewakili biner jika dan hanya jika dimulai dengan a 0dan karakter keduanya adalah a 0atau a 1. Semua karakter ASCII yang dapat dicetak memiliki bit tinggi dalam biner (yaitu mulai dengan a 0), dan tidak ada yang dimulai dengan 00atau 01dalam hex atau oktal.

  • Dengan biner keluar dari jalan, perhatikan bahwa semua karakter ASCII yang dapat dicetak mulai dengan 2- 7in hex dan 0- 1in octal. Oleh karena itu, dimungkinkan untuk juga membedakan antara hex dan oktal.

Anda dapat mengasumsikan bahwa input hex disediakan sebagai huruf kecil atau besar, mana yang lebih nyaman.

Regex membuat bagian parsing tantangan semi-sepele. Saya tidak ingin langsung melarang penggunaan regex, tetapi jika Anda memiliki solusi non-regex lebih lama daripada rekannya yang menggunakan regex, jangan ragu untuk mengirimkannya bersama dengan jawaban "nyata", karena saya akan tertarik untuk melihatnya juga. :)

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji:

In                   Out
-----------------------------------
501200100001147    | PPCG
5C01101111100      | \o@
313206306400110101 | 12345
2A200530402C       | * + ,
0011111100111111   | ??
<empty string>     | <empty string>
Gagang pintu
sumber

Jawaban:

4

Lex + C, 156 124 byte

%{
p(b){putchar(strtol(yytext,0,b));}
%}
%option noyywrap
%%
0[01]{7} {p(2);}
[01].. {p(8);}
.. {p(16);}
%%
main(){yylex();}

Kompilasi dengan:

lex mixed_base.l
cc -o mixed_base lex.yy.c
Rainer P.
sumber
Saya pikir Anda dapat menggunakan 0[01]{7}bukan 0[01].{6}.
Neil
3

ES6, 86 80 byte

Solusi berbasis regex:

s=>s.replace(/0[01]{7}|[01]?../g,n=>String.fromCharCode(0+'bkxo'[n.length&3]+n))

Solusi non-regex rekursif untuk 95 byte:

f=(s,r='')=>s?f(s.slice(l=s<'02'?8:s<'2'|2),r+String.fromCharCode(0+'bkxo'[l&3]+s.slice(0,l))):r
Neil
sumber
0

Python 3, 165 byte

Tanpa Regex

x=input();i=0;s=""
while i<len(x):
 a=x[i:i+2];c=int(a[0])
 if a in["00","01"]:y=8;b=2
 elif 1<c<8:y=2;b=16
 elif c<2:y=3;b=8
 s+=chr(int(x[i:i+y],b));i+=y
print(s)
Argenis García
sumber