বেস 85 এনকোডিং


10

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম লিখুন যা কোনও ASCII মুদ্রণযোগ্য অক্ষর সমন্বিত একক-লাইন স্ট্রিংয়ের ইনপুট নিতে পারে এবং বেস 85 এ (একটি বড়-এন্ডিয়ান কনভেনশন ব্যবহার করে) এনকোডযুক্ত একই স্ট্রিং আউটপুট নিতে পারে । আপনি ধরে নিতে পারেন যে ইনপুটটি সর্বদা ≤ 100 টি অক্ষর হবে।


বেজ 85 এর একটি গাইড

  • চারটি অক্টেটগুলি পাঁচটি বেস 85 অক্ষরে (সাধারণত) এনকোড করা হয়।

  • Base85 অক্ষর থেকে পরিসীমা !থেকে uএবং - (117 33 হওয়া ASCII) z(হওয়া ASCII 122)।

  • এনকোড করার জন্য, আপনি ক্রমাগত চারটি অক্টেট (একটি 32-বিট সংখ্যা) দ্বারা 85 দ্বারা বিভাজন সম্পাদন করে, এবং এনকোডযুক্ত মানের জন্য ASCII অক্ষর পেতে বাকিগুলিতে (প্রতিটি বিভাগের পরে) 33 যোগ করুন। উদাহরণস্বরূপ, এই প্রক্রিয়াটির প্রথম অ্যাপ্লিকেশন এনকোডড ব্লকের মধ্যে সঠিকতম অক্ষর তৈরি করে।

  • যদি চারটি অক্টেটের সেটগুলিতে কেবল নাল বাইট থাকে তবে সেগুলির zপরিবর্তে এনকোড করা হয় !!!!!

  • যদি শেষ ব্লকটি চারটি অক্টেটের চেয়ে কম হয় তবে এটি নাল বাইটের সাথে প্যাড করবে। এনকোডিংয়ের পরে, প্যাডিং হিসাবে যুক্ত হওয়া একই সংখ্যক অক্ষরগুলি আউটপুটটির শেষে থেকে সরানো হবে।

  • এনকোডযুক্ত মানটি আগে <~এবং তার পরে অনুসরণ করা উচিত ~>

  • এনকোডযুক্ত মানটিতে কোনও সাদা জায়গা থাকতে হবে না (এই চ্যালেঞ্জের জন্য)।


উদাহরণ

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~>

নিম্নলিখিত স্নিপেট বেস 85 এ প্রদত্ত ইনপুটটি এনকোড করবে।


3
আমি কেন বিভ্রান্ত হচ্ছি, আপনি যদি প্রিন্টযোগ্য এএসসিআইআইতে ইনপুট সীমাবদ্ধ করে থাকেন তবে আপনি বাইটটি অষ্টেটের প্রতিশব্দ হিসাবে ব্যবহার করেন এবং 7-বিট বাইটের অনুমতি দেবেন না।
পিটার টেলর

শেষের দিক নির্দিষ্ট করা উচিত। একটি ব্লক [0,1,2,3] একটি 32 বিট সংখ্যায় 0x0123 বা 0x3210 রূপান্তরিত হয়?
edc65

@ উইকিপিডিয়া লিঙ্ক অনুসারে @ edc65 বড় এন্ডিয়ান
লেভেল রিভার সেন্ট

3
@ স্টিভেভারিল আপনাকে ধন্যবাদ এটি চ্যালেঞ্জ পাঠ্যে থাকা উচিত, এবং কোনও বাহ্যিক লিঙ্কে নয়। কমপক্ষে এটি এখন একটি মন্তব্যে রয়েছে
edc65

যদি ইনপুটটিতে কেবল মুদ্রণযোগ্য অক্ষর থাকতে পারে তবে কীভাবে এটিতে চারটি নাল বাইট থাকতে পারে?
লুইস মেন্ডো

উত্তর:


9

CJam, 43 39 35 বাইট

"<~"q4/{:N4Ue]256b85b'!f+}/N,)<"~>"

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

"<~"      e# Push that string.
q4/       e# Read all input from STDIN and split it into chunks of length 4.
{         e# For each chunk:
  :N      e#   Save it in N.
  4Ue]    e#   Right-pad it with 0's to a length of 4.
  256b85b e#   Convert from base 256 to base 85.
  '!f+    e#   Add '!' to each base-85 digit.
}/        e#
N,)       e# Push the length of the last unpadded chunk, plus 1.
<         e# Keep that many chars of the last encoded chunk.
"~>"      e# Push that string.

যদি ইনপুটটি খালি থাকে N,)তবে স্ট্রিংয়ের জন্য প্রযোজ্য হবে "<~"। যেহেতু Nপ্রাথমিকভাবে একটি একক অক্ষর রয়েছে তাই আউটপুটটি সঠিক হবে।

আমরা সাথে মোকাবিলা করতে হবে না z- র , বা প্যাড দৈর্ঘ্য 5 এনকোড খন্ডে যেহেতু ইনপুট শুধুমাত্র মুদ্রণযোগ্য ASCII অক্ষর উপস্থিত থাকবে।


3
এই সমাধানটি ASCII স্ট্রিংয়ের বেস85 সংস্করণটির মতো সন্দেহজনকভাবে দেখায় (প্রশ্নে সিএফ। শেষ উদাহরণ)। অপেক্ষা করুন ...
ojdo

1
@ ওডজো: সিজেম কোডে কিছু অবৈধ অক্ষর রয়েছে, আমি সবচেয়ে কাছের পেয়েছি এই সিজেএম ইন্টারপ্রেটার লিংক
স্কানাডার

@ ইউজডো কারণ চ্যালেঞ্জটি কেবল এটি:a program that can take an input of a single-line string containing any ASCII printable characters,...
edc65

5

পাইথন 3, 71 বাইট

from base64 import*
print(a85encode(input().encode(),adobe=1).decode())

আমি পাইথনে কখনও গল্ফ করিনি, সুতরাং এটি সম্ভবত সাব-অনুকূল।

@ জ্যাচগেটসকে 3 বাইট বন্ধ করে দেওয়ার জন্য ধন্যবাদ!


1
আপনি 3 বাইট সংরক্ষণ করার input().encode()পরিবর্তে ব্যবহার করতে পারেন str.encode(input())
জ্যাচ গেটস

@ জ্যাচগেটস ধন্যবাদ! সমস্ত en- / ডিকোডিং এখনও আমাকে হত্যা করছে।
ডেনিস

2

পাইথন 2, 193 162 বাইট

from struct import*
i=raw_input()
k=4-len(i)%4&3
i+='\0'*k
o=''
while i:
 b,=unpack('>I',i[-4:]);i=i[:-4]
 while b:o+=chr(b%85+33);b/=85
print'<~%s~>'%o[k:][::-1]

এটি আমার প্রথম কোড গল্ফ, সুতরাং আমি নিশ্চিত যে আমার পদ্ধতির কোনও সমস্যা আছে। আমি কেবল লাইব্রেরির ফাংশনটি কল করার পরিবর্তে বেস 85 বাস্তবায়ন করতে চেয়েছিলাম। :)


এটি 181 বাইট। আপনি সংরক্ষণ করার সময় আইডিএল আপনার কোডটিতে যুক্ত হওয়া নতুন লাইনটি সরাতে ভুলবেন না (যদি আপনি আইডিএল ব্যবহার করেন)। আপনি কখনও ফাংশনটি কল করেন না বা ব্যবহারকারীর ইনপুট পান না, সুতরাং আপনি যখন এটি চালাবেন তখন এটি কিছুই করে না।
জাচ গেটস

এটি কোনও ফাংশন হওয়া বা আই / ও পড়া উচিত কিনা নিশ্চিত ছিল না ... এটি স্টাডিন এবং প্রিন্ট স্টাডআউট পড়া উচিত? (আবার কখনও কোড গল্ফ এর আগে করেনি ...)
ডেভিড

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! 4 (বিগত 2 টি পরীক্ষার কেস) দ্বারা বিভাজ্য নয় এমন ইনপুট দৈর্ঘ্যে একটি সমস্যা রয়েছে বলে মনে হচ্ছে। লাইন 3 টি পড়তে হবে [:4+len(s)/4*4]এবং আউটপুট শেষে কোনও অক্ষর সরানো হবে না।
ডেনিস

আমি বিশ্বাস করি যে আমি সমস্যাগুলি স্থির করেছি (এবং দুর্ভাগ্যক্রমে এটি দীর্ঘ করে দিয়েছি)। আরও অনুকূলিতকরণের চেষ্টা করা হচ্ছে ...
ডেভিড

তুমি তোমার দ্বিতীয় চালু করতে পারেন whileভালো মত এক মধ্যে লুপ: while b:d=chr(b%85+33)+d;b/=85। আপনি আপনার printবিবৃতি এবং স্ট্রিংয়ের মধ্যবর্তী স্থানও সরাতে পারেন । অতিরিক্তভাবে, প্রদত্ত তর্কগুলির মধ্যে স্থানটি সরান s.unpack
জ্যাচ গেটস

2

অক্টাভা, 133 131 বাইট

@ ইজডোকে পরামর্শ দেওয়ার জন্য আমি স্ট্যান্ডিনের চেয়ে আরজিভি থেকে ইনপুট নেব, আমাকে 2 বাইট সংরক্ষণ করুন।

function g(s) p=mod(-numel(s),4);s(end+1:end+p)=0;disp(['<~' dec2base(swapbytes(typecast(s,'uint32')),'!':'u')'(:)'(1:end-p) '~>'])

Ungolfed:

function g(s)             %// function header
p=mod(-numel(s),4);       %// number of missing chars until next multiple of 4
s(end+1:end+p)=0;         %// append p null characters to s
t=typecast(s,'uint32');   %// cast each 4 char block to uint32
u=swapbytes(t);           %// change endian-ness of uint32's
v=dec2base(u,'!':'u');    %// convert to base85
w=v'(:)'(1:end-p);        %// flatten and truncate resulting string
disp(['<~' w '~>']);      %// format and display final result

আমি আইডোনে কোড পোস্ট করেছি । স্ট্যান্ডেলোন ফাংশন এবং endবিবৃতি প্রয়োজন হয় না , তবে আদর্শের একই ফাইলটিতে ফাংশন এবং কলিং স্ক্রিপ্ট রয়েছে বলে এর জন্য পৃথককারী প্রয়োজন।

stdinআইডিয়োনে কীভাবে কাজ করতে পারি তা এখনও বুঝতে পারি না । যদি কেউ জানেন, আমি এখনও আগ্রহী, সুতরাং দয়া করে আমাকে একটি মন্তব্য ড্রপ করুন।

আইডোন থেকে নমুনা আউটপুট :

easy
<~ARTY*~>
test
<~FCfN8~>
code golf
<~@rGmh+D5V/Ac~>
Programming Puzzles
<~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>

শুধু ব্যবহার argv()করবেন না কেন ? কাজের বিবরণটি পড়ার ইনপুট থেকে লাগে না বলে মনে হয় stdin
ojdo

খুব সুন্দর! সুতরাং dec2baseঅক্টোবায় 36 এর উপরে ঘাঁটিগুলিকে অনুমতি দেয়?
লুইস মেন্ডো

যেমনটি ডক (এবং ত্রুটির বার্তা) বলেছেন: আর্গুমেন্টটি BASE2 এবং 36 এর মধ্যে একটি সংখ্যা বা চিহ্নগুলির একটি স্ট্রিং । এখানে, এক্সপ্রেশন 'i':'u'85 বেসরকারী স্ট্রিংটি প্রসারিত করে !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuযা বেস হিসাবে পরিবেশন করে।
ojdo

@ojdo যদি এটি হয় তবে আমার উচিত এটি একটি ফাংশন করা এবং সম্ভবত কয়েকটা বাইট সংরক্ষণ করা উচিত।
বেকার

1
@ বেকার এটি করে কেবলমাত্র ৩ to-এর সীমাবদ্ধতা নয়, তবে এই সংখ্যাটি 0 0 9ABC অবধি প্রয়োজনীয়, তাই ASCII কোডগুলিতে ঝাঁপ দাও
লুইস মেন্ডো

1

মতলব, 175 বাইট

s=input('','s');m=3-mod(numel(s)-1,4);s=reshape([s zeros(1,m)]',4,[])';t=char(mod(floor(bsxfun(@rdivide,s*256.^[3:-1:0]',85.^[4:-1:0])),85)+33)';t=t(:)';['<~' t(1:end-m) '~>']

উদাহরণ:

>> s=input('','s');m=3-mod(numel(s)-1,4);s=reshape([s zeros(1,m)]',4,[])';t=char(mod(floor(bsxfun(@rdivide,s*256.^[3:-1:0]',85.^[4:-1:0])),85)+33)';t=t(:)';['<~' t(1:end-m) '~>']
code golf
ans =
<~@rGmh+D5V/Ac~>

1

পিএইচপি, 181 বাইট

foreach(str_split(bin2hex($argn),8)as$v){for($t="",$d=hexdec(str_pad($v,8,0));$d;$d=$d/85^0)$t=chr($d%85+33).$t;$r.=str_replace("!!!!!",z,substr($t,0,1+strlen($v)/2));}echo"<~$r~>";

অনলাইন সংস্করণ

সম্প্রসারিত

foreach(str_split(bin2hex($argn),8)as$v){
    for($t="",$d=hexdec(str_pad($v,8,0));$d;$d=$d/85^0)
      $t=chr($d%85+33).$t;
    $r.=str_replace("!!!!!",z,substr($t,0,1+strlen($v)/2));
}
echo"<~$r~>";

1

খাঁটি বাশ, ~ 738

এনকোডার প্রথমে (গল্ফড কিছু):

#!/bin/bash
# Ascii 85 encoder bash script
LANG=C

printf -v n \\%o {32..126};printf -v n "$n";printf -v m %-20sE abtnvfr;p=\<~;l()
{ q=$(($1<<24|$2<<16|$3<<8|$4));q="${n:1+(q/64#378iN)%85:1}${n:1+(q/614125)%85:1
}${n:1+(q/7225)%85:1}${n:1+(q/85)%85:1}${n:1+q%85:1}";};k() { ((${#p}>74))&&ech\
o "${p:0:75}" && p=${p:75};};while IFS= read -rd '' -n 1 q;do [ "$q" ]&&{ print\
f -v q "%q" "$q";case ${#q} in 1|2)q=${n%$q*};o+=($((${#q}+32)));;7)q=${q#*\'\\}
o+=($((8#${q%\'})));;5)q=${q#*\'\\};q=${m%${q%\'}*};o+=($((${#q}+07)));;esac;}||
o+=(0);((${#o[@]}>3))&&{ [ "${o[*]}" = "0 0 0 0" ]&& q=z|| l ${o[@]};p+="${q}";k
o=(); };done;[ "$o" ]&&{ f=0;for((;${#o[@]}<4;)){ o+=(0);((f++));};((f==0))&&[ \
"${o[*]}" = "0 0 0 0" ]&&q=z||l ${o[@]};p+="${q:0:5-f}";};p+="~>";k;[ "$p" ]&&e\
cho "$p"

পরীক্ষা:

for word in easy test code\ golf Programming\ Puzzles ;do
    printf "%-24s" "$word:"
    ./enc85.sh < <(printf "$word")
  done
easy:                   <~ARTY*~>
test:                   <~FCfN8~>
code golf:              <~@rGmh+D5V/Ac~>
Programming Puzzles:    <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>

এবং এখন ডিকোডার:

#!/bin/bash
# Ascii 85 decoder bash script
LANG=C

printf -v n "\%o" {33..117};printf -v n "$n";o=1 k=1;j(){ read -r q||o=;[ "$q" \
]&&[ -z "${q//*<~*}" ]&&((k))&&k= q="${q#*<~}";m+="$q";m="${m%~>*}";};l(){ r=;f\
or((i=0;i<${#1};i++)){ s="${1:i:1}";case "$s" in "*"|\\|\?)s=\\${s};;esac;s="${\
n%${s}*}";((r+=${#s}*(85**(4-i))));};printf -v p "\%03o" $((r>>24)) $((r>>16&255
)) $((r>>8&255)) $((r&255));};for((;(o+${#m})>0;)){ [ "$m" ] || j;while [ "${m:0
:1}" = "z" ];do m=${m:1};printf "\0\0\0\0";done;if [ ${#m} -ge 5 ];then q="${m:0
:5}";m=${m:5};l "$q";printf "$p";elif ((o));then j;elif [ "${m##z*}" ];then pri\
ntf -v t %$((5-${#m}))s;l "$m${t// /u}";printf "${p:0:16-4*${#t}}";m=;fi;}

এই কপি enc85.shএবং dec85.sh, chmod +x {enc,dec}85.sh, তারপর:

./enc85.sh <<<'Hello world!'
<~87cURD]j7BEbo80$3~>
./dec85.sh <<<'<~87cURD]j7BEbo80$3~>'
Hello world!

তবে আপনি কিছু শক্তিশালী পরীক্ষা করতে পারেন:

ls -ltr --color $HOME/* | gzip | ./enc85.sh | ./dec85.sh | gunzip

724 টি চর কমেছে:

printf -v n \\%o {32..126};printf -v n "$n";printf -v m %-20sE abtnvfr;p=\<~
l(){ q=$(($1<<24|$2<<16|$3<<8|$4))
q="${n:1+(q/64#378iN)%85:1}${n:1+(q/614125)%85:1}${n:1+(q/7225)%85:1}${n:1+(q/85)%85:1}${n:1+q%85:1}"
};k() { ((${#p}>74))&&echo "${p:0:75}" && p=${p:75};};while IFS= read -rd '' -n 1 q;do [ "$q" ]&&{
printf -v q "%q" "$q";case ${#q} in 1|2)q=${n%$q*};o+=($((${#q}+32)));;7)q=${q#*\'\\}
o+=($((8#${q%\'})));;5)q=${q#*\'\\};q=${m%${q%\'}*};o+=($((${#q}+07)));;esac;}||o+=(0)
((${#o[@]}>3))&&{ [ "${o[*]}" = "0 0 0 0" ]&&q=z||l ${o[@]};p+="${q}";k
o=();};done;[ "$o" ]&&{ f=0;for((;${#o[@]}<4;)){ o+=(0);((f++));}
((f==0))&&[ "${o[*]}" = "0 0 0 0" ]&&q=z||l ${o[@]};p+="${q:0:5-f}";};p+="~>";k;[ "$p" ]&&echo "$p"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.