Chuyển đổi một chuỗi cơ sở hỗn hợp của cơ sở dữ liệu thành ASCII


8

Đưa ra một đầu vào của một chuỗi có các byte có thể ở dạng nhị phân, bát phân hoặc hex, xuất ra tương đương ASCII của chuỗi.

Đầu vào sẽ được cung cấp theo định dạng sau, ví dụ:

501200100001147

đại diện

0x50 0o120 0b01000011 0x47

tương đương (trong ASCII) với

PPCG

Nhị phân, bát phân và hex sẽ luôn được cung cấp với 8, 3 và 2 chữ số tương ứng.

Đối với mục đích của thách thức này, chỉ hỗ trợ ASCII có thể in được. Đây là phạm vi 32..126bao gồm. Do đó, không thể có sự mơ hồ. Lưu ý rằng

  • Một chuỗi đại diện cho nhị phân khi và chỉ khi nó bắt đầu bằng a 0và ký tự thứ hai của nó là a 0hoặc a 1. Tất cả các ký tự ASCII có thể in đều có bit cao ở dạng nhị phân (bắt đầu bằng a 0) và không có ký tự nào bắt đầu bằng 00hoặc 01ở dạng hex hoặc bát phân.

  • Với cách thức nhị phân, lưu ý rằng tất cả các ký tự ASCII có thể in bắt đầu bằng 2- 7trong hex và 0- 1trong bát phân. Do đó, có thể phân biệt rõ ràng giữa hex và bát phân là tốt.

Bạn có thể giả sử rằng đầu vào hex được cung cấp dưới dạng chữ thường hoặc chữ hoa, tùy theo cái nào thuận tiện hơn.

Regex làm cho phần phân tích cú pháp của thử thách bán tầm thường. Tôi không muốn cấm sử dụng regex hoàn toàn, nhưng nếu bạn có giải pháp không phải regex lâu hơn đối tác sử dụng regex của nó, hãy thoải mái đăng nó cùng với câu trả lời "thực sự", vì tôi sẽ quan tâm để xem nó là tốt. :)

Vì đây là , mã ngắn nhất tính bằng byte sẽ giành chiến thắng.

Các trường hợp thử nghiệm:

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

Câu trả lời:


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();}

Biên dịch với:

lex mixed_base.l
cc -o mixed_base lex.yy.c

Tôi nghĩ bạn có thể sử dụng 0[01]{7}thay vì 0[01].{6}.
Neil

3

ES6, 86 80 byte

Giải pháp dựa trên Regex:

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

Giải pháp đệ quy phi regex cho 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

0

Python 3, 165 byte

Không có 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.