7
Base85エンコーディング
チャレンジ ASCII印刷可能文字を含む単一行の文字列の入力を受け取り、Base85でエンコードされた同じ文字列を(ビッグエンディアン規則を使用して)出力できるプログラムを記述します。入力は常に100文字以下であると想定できます。 Base85のガイド 4オクテットは、(通常)5つのBase85文字にエンコードされます。 Base85文字が範囲!にu及び- (117 ASCII 33)z(ASCII 122)。 エンコードするには、4オクテット(32ビット数)で85による除算を継続的に実行し、(各除算の後に)残りに33を加算して、エンコードされた値のASCII文字を取得します。たとえば、このプロセスの最初のアプリケーションは、エンコードされたブロックの右端の文字を生成します。 4オクテットのセットにnullバイトのみが含まれる場合、それらはのz代わりにとしてエンコードされ!!!!!ます。 最後のブロックが4オクテットより短い場合は、ヌルバイトが埋め込まれます。エンコード後、パディングとして追加されたのと同じ数の文字が出力の最後から削除されます。 エンコードされた値の前後には<~、が必要~>です。 エンコードされた値には、空白を含めないでください(このチャレンジのため)。 例 In: easy Out: <~ARTY*~> In: test Out: <~FCfN8~> In: code golf Out: <~@rGmh+D5V/Ac~> In: Programming Puzzles Out: <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~> 次のスニペットは、指定された入力をBase85にエンコードします。 コードスニペットを表示 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>String.prototype.toAscii85=function(){if(""==this)return"<~~>";for(var r=[],t=0;t<this.length;t+=4){for(var i=(this.substr(t,4)+"\x00\x00\x00").substr(0,4),o=0,n=0;4>n;n++)o=256*o+i.charCodeAt(n);var s=[];for(n=0;5>n;n++){var e=o%85;o=(o-e)/85,s.unshift(String.fromCharCode(e+33))}r=r.concat(s)}var a=4-this.length%4;return 4!=a&&r.splice(-a,a),"<~"+r.join("").replace(/!!!!!/g,"z")+"~>"};</script><style>#in,#out{margin:20px;width:400px;resize:none}</style><input id="in" type="text" value="Base85"><button onclick="$('#out').text($('#in').val().toAscii85())">Submit</button><br><textarea id="out" rows=5 disabled></textarea> …