「混合ベース」文字列をASCIIに変換します


8

バイナリ、8進数、16進数のいずれかであるバイトを含む文字列を入力すると、同等の文字列のASCIIが出力されます。

たとえば、入力は次の形式で提供されます。

501200100001147

これは

0x50 0o120 0b01000011 0x47

これは(ASCIIで)と同等です

PPCG

2進数、8進数、16進数には、常にそれぞれ8、3、2桁が表示されます。

この課題では、印刷可能なASCIIのみをサポートする必要があります。これは32..126包括的範囲です。したがって、あいまいさがあることは不可能です。ご了承ください

  • 文字列は、それがaで始まり0、2番目の文字がa 0またはaの場合に限り、バイナリを表し1ます。すべての印刷可能なASCII文字は、バイナリでハイビットがオフになっています(つまり、aで始まります0)。また、16進数または8進数で始まっ00たり01、それらで始まったりするものはありません 。

  • 道のバイナリうちでは、ノートでは、すべての印刷可能なASCII文字で始まること2- 7進にして0- 18進数で。したがって、16進数と8進数を明確に区別することもできます。

16進入力は、小文字または大文字のどちらか便利な方で提供されると想定できます。

Regexは、チャレンジの解析部分をかなり簡単にします。私は完全に正規表現の使用を禁止したくありませんが、正規表現を使用しない対応策よりも長い非正規表現ソリューションがある場合は、とにかく「本当の」答えと一緒に気軽に投稿してください。同様にそれを見てください。:)

これは、バイト単位の最も短いコードが優先されます。

テストケース:

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

回答:


4

Lex + C、156 124バイト

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

コンパイル:

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

0[01]{7}代わりに使用できると思います0[01].{6}
Neil

3

ES6、86の 80バイト

正規表現ベースのソリューション:

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

95バイトの再帰的な非正規表現ソリューション:

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バイト

正規表現なし

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.