এএসসিআইআই আর্ট আঁকতে আরএলই তথ্য সংক্ষেপণ


11

এই প্রশ্নটি আমি অন্য প্রশ্নের উত্তর দিতে কী নিয়ে এসেছি তার উপর ভিত্তি করে ।

কখনও কখনও এখানে প্রশ্নগুলি কিছু ASCII শিল্প আঁকতে জিজ্ঞাসা করে। আর্টের জন্য ডেটা সঞ্চয় করার একটি সহজ উপায় হ'ল আরএলই (রান-লেংথ এনকোডিং) । তাই:

qqqwwwwweeerrrrrtttyyyy

হয়ে:

3q5w3e5r3t4y

এখন একটি বড় এএসসিআইআই আর্ট আঁকতে আপনি সম্ভবত এটির মতো ডেটা পাচ্ছেন (নতুন লাইনের অক্ষরগুলি উপেক্ষা করে):

19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
   ^^^
   Note that this is "20 whitespaces"

(Character count: 45)

ASCII শিল্পের জন্য ব্যবহৃত অক্ষরগুলি কখনই ছোট হাতের বা বড় হাতের অক্ষর বা সংখ্যা, কেবল লক্ষণ, চিহ্ন এবং চিহ্ন নয় তবে সর্বদা মুদ্রণযোগ্য ASCII অক্ষর সেট থাকে set

আপনি সেই স্ট্রিংয়ের কিছু জায়গা বাঁচাতে চান, সুতরাং আপনি সংখ্যাগুলি বড় হাতের অক্ষর সেট দিয়ে প্রতিস্থাপন করুন ('A' সমান 1 এর সাথে সমান হবে, 'B' 2 এর সমান হবে 'জেড' 26 এর সমান হবে), কারণ আপনি কখনই যাচ্ছেন না একটি চরিত্রের 26 টিরও বেশি পুনরাবৃত্তি পান। সুতরাং আপনি পাবেন:

S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@

(Character count: 34)

এবং পরিশেষে আপনি লক্ষ্য করেছেন যে (অক্ষর + চিহ্ন) এর কয়েকটি গ্রুপ পুনরাবৃত্তি করছে, সুতরাং আপনি স্ট্রিংয়ে স্ট্রিংয়ের সাথে তিন বার বা তার বেশি উপস্থিত গ্রুপগুলি প্রতিস্থাপন করুন বা স্ট্রিংয়ের সাথে উপস্থিত থাকবেন, তবে একটি বাফারে সংরক্ষণ করুন প্রতিস্থাপন তৈরি করা হয়েছে (প্রতিটি প্রতিস্থাপকের জন্য "গ্রুপ + সাবস্টিটিউশন চর" ফর্ম্যাটে) এবং বাকী স্ট্রিংটি যেমন রয়েছে তেমন রেখে দেওয়া। সুতরাং নিম্নলিখিত গ্রুপগুলি:

S, (3 times) 
T  (4 times)
K@ (3 times)

যথাক্রমে 'ক', 'বি' এবং 'সি' দ্বারা প্রতিস্থাপিত হয়, কারণ 26 টিরও বেশি গ্রুপ পুনরাবৃত্তি করতে পারে না। সুতরাং অবশেষে আপনি পাবেন:

S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc

(Character count: 9+24=33)

[শেষ পদক্ষেপটি কেবলমাত্র 1 টি বাইট সংরক্ষণ করে কারণ প্রতিস্থাপনের পরে যে গোষ্ঠীগুলি অক্ষরগুলি সংরক্ষণ করে তারা প্রকৃতপক্ষে 4 বার বা তার বেশি উপস্থিত হয়]]

চ্যালেঞ্জ

একটি ASCII আর্ট আঁকার জন্য RLE ডেটাযুক্ত স্ট্রিং দেওয়া (প্রস্তাবিত বিধিনিষেধ সহ), সংক্ষিপ্ততম প্রোগ্রাম / ফাংশন / পদ্ধতিটি লিখুন যা এটি বর্ণিত হিসাবে সংকুচিত করতে পারেন write অ্যালগরিদম অবশ্যই দুটি স্ট্রিং মুদ্রণ / ফিরিয়ে দিতে হবে: প্রথমটি সংক্ষেপণের জন্য ব্যবহৃত অভিধানযুক্ত এবং দ্বিতীয়টি ফলাফল সংকুচিত স্ট্রিং। আপনি প্রদত্ত ক্রমে একটি টিপল, একটি অ্যারে, তালিকা বা যা কিছু, হিসাবে স্ট্রিংগুলি ফিরিয়ে দিতে পারেন।

মনে রাখবেন যে স্ট্রিংটি দ্বিতীয় ধাপে সংকুচিত করা যায় না, অ্যালগরিদমকে অবশ্যই প্রথম রিটার্ন মান হিসাবে একটি খালি স্ট্রিং এবং দ্বিতীয় ফিরতি মান হিসাবে ধাপ 1 এর ফলাফল অবশ্যই প্রদান করতে হবে।

আউটপুট মানগুলিতে আপনাকে প্রথম ধাপের ফলাফল অন্তর্ভুক্ত করার দরকার নেই, আমি কেবল তাদের ব্যাখ্যাগুলির জন্য উদাহরণগুলিতে অন্তর্ভুক্ত করি।

এটি , তাই প্রতিটি ভাষার জন্য সংক্ষিপ্ত উত্তরটি জিততে পারে!

আরেকটি পরীক্ষার মামলা

Input:                   15,15/10$15,15/10"10$10"10$10"10$10"15,15/

Output of step 1:        O,O/J$O,O/J"J$J"J$J"J$J"O,O/

Final algorithm output:  O,aO/bJ$cJ"d
                         abcabdcdcdcdab

---

Input:                   15,15/10$15,15/10"

Output of step 1:        O,O/J$O,O/J"

Final algorithm output:  <empty string>
                         O,O/J$O,O/J"

1
কারণ আপনি কখনই না কোনও চরিত্রের 26 টিরও বেশি পুনরাবৃত্তি পাবেন না। aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Okx

@ ওকএক্স এটি কখনই হতে পারে না।
এরিক আউটগলফার

@ অকক্স হ্যাঁ, বাস্তব বিশ্বে। যদিও নিয়মগুলি ASCII শিল্পের একটি সীমিত সেটের জন্য তৈরি করা হয়েছে।
চার্লি

2
সত্যিকারের বাস্তবায়নে, S,aT bK@cসম্ভবত S,T K@প্রতিস্থাপনের অক্ষরগুলির স্পষ্টভাবে নামকরণ না করে কেবলমাত্র সংরক্ষণ করা হবে যা এ থেকে তুচ্ছভাবে বাদ দেওয়া যেতে পারে।
আর্নল্ড

@ আরনাউল্ড আপনি পুরোপুরি ঠিক বলেছেন, আমি এটি মিস করেছি, তবে আমি প্রশ্নটি ঠিক তেমন রেখে যাচ্ছি, যদি কেউ তার উত্তর লিখতে শুরু করে থাকে।
চার্লি

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 168 167 বাইট

দুই স্ট্রিং একটি বিন্যাস দেখায়: [dictionary, compressed_string]

s=>[(a=(s=s.replace(/\d+/g,n=>C(n|64),C=String.fromCharCode)).match(/../g)).map(v=>s.split(v)[a[v]||3]>=''?D+=v+(a[v]=C(i++)):0,i=97,D='')&&D,a.map(v=>a[v]||v).join``]

পরীক্ষার মামলা


3

পাইথন 2 , 269 280 268 266 বাইট

এখানে অভিনব কিছু হচ্ছে না। কিছু সাধারণ নিয়মিত এক্সপ্রেশন ব্যবহার করার ভাল সুযোগ।

প্রথম সংস্করণটি বিশেষ অক্ষরযুক্ত স্ট্রিংগুলির জন্য ব্যর্থ হয়েছিল যা রেজেক্সের মধ্যে ব্যাখ্যা করা হয়েছিল। দ্বিতীয় সংস্করণ (re.escape ব্যবহার করে) সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে। এই সংশোধন করতে 11 বাইট খরচ হয়েছে।

দ্বিতীয় সংস্করণটি সমস্যার স্পেসিফিকেশন হিসাবে প্রয়োজনীয় হিসাবে যথাযথ বিকল্পের অক্ষরগুলি বরাদ্দ করে নি, এবং @ কার্লোস আলেজো দ্বারা নির্দেশিত হিসাবে। সুতরাং, অঙ্কন বোর্ডে ফিরে আসুন।

সংশোধিত সংস্করণ, আরও গল্ফ

  • -6 বাইট দুটি লাইনে আউটপুট প্রিন্ট না করে সংরক্ষণ করা হয়েছে
  • +3 বাইট: নির্দিষ্ট হিসাবে চ্যালেঞ্জটি পূরণের জন্য স্ট্রিংয়ের মাধ্যমে কোড বিকল্পগুলিতে স্যুইচ করা।
  • -4 বাইট: যেহেতু আমি আর দু'বার রিফাইন্ডল কল করছি না, তাই এটির নতুন নামকরণের দরকার নেই
  • -5 বাইট: লুপগুলি যখন লুপগুলিতে স্যুইচ করে।
  • -২ বাইটস @ কমরেড স্পার্কল পনিকে ধন্যবাদ
import re
S=re.sub
b=a=input()
for i in re.findall('\d{1,2}',a):
 b=S(i, chr(64+int(i)),b)
n,s,p=96,'',0
while p<len(b):
 c=b[p:p+2];f=b.count(c)
 if f>2and not c in s:n+=1;s+=c+chr(n)
 p+=2
p=0
while p<len(s):k=s[p:p+2];v=s[p+2];b=S(re.escape(k),v,b);p+=3
print s,b

এটি অনলাইন চেষ্টা করুন!


আপনি প্রায় সেখানে রয়েছেন, নোট করুন যে দ্বিতীয় ধাপে গোষ্ঠীগুলি যথাযথ ক্রমে তৈরি করা হয়নি (উদাহরণ দেখুন)। উপস্থিতি অনুসারে গোষ্ঠী তৈরি করতে হবে, তাই প্রথমটি হওয়া উচিত O,a
চার্লি

@ কার্লোস আলেজো আমি উল্লেখ করেছি যে প্রয়োজন হিসাবে, বিকল্পগুলি কার্যকরী দৃষ্টিকোণ থেকে স্বেচ্ছাসেবী হিসাবে কাজ করে। পাইথনের ডিফল্ট অভিধানগুলি, এটি বাস্তবায়নের প্রাকৃতিক উপায়, বিন্যস্ত। অন্যান্য সম্ভাব্য ডেটা স্ট্রাকচার বিবেচনা করতে হবে ....
সিসিবি 60

আপনি ব্যবহার করে কিছু বাইট সংরক্ষণ করা যায়নি b=a=input()এবং n,s,p=96,'',0?
কমরেড স্পার্কলপনি

\d+ব্যবহার করার জন্য একটি সংক্ষিপ্ত রেজেক্স হবে। আপনি যে কোনও উপায়ে 26 এর বেশি যেতে পারবেন না যাতে এটি নির্দিষ্ট করে 1-2 সংখ্যার নিশ্চিত করার কোনও কারণ নেই। এছাড়াও, ব্যবহারের re.escapeঅর্থ হল যে একটি মৌলিক স্ট্রিংটি replaceকিছুটা ছোট হয়ে যায়: 253 বাইট
মান কালি

0

লুয়া, 215 বাইট

প্যাটার্ন মেলানো মাত্র একটি ভাল বিট।

আমার মনে হয় লুয়া যখন গল্ফ করার কথা বলে তখন আন্ডাররেটেড ... এই সমস্ত বিবৃতি একসাথে দেখ!

g,c=string.gsub,string.char
u=g(arg[1],"%d%d?",function(n)return c(n+64)end)l,d=97,""g(u,"..",function(m)n,e=0,g(m,".", "%%%0")g(u,e,function()n=n+1 end)if n>2 then
l,s=l+1,c(l)d,u=d..m..s,g(u,e,s)end
end)print(u,d)

0

পাইথন 2 , 186 বাইট

from re import*
S=sub('\d+',lambda m:chr(int(m.group(0))+64),input())
Q=[]
for p in findall('[A-Z].',S):
 if S.count(p)>2:a=chr(len(Q)+97);Q+=[p+a];S=sub(escape(p),a,S)
print''.join(Q),S

আমি শেষ পর্যন্ত এর জন্য ব্যবহারের সন্ধান করছিলাম re.subn: সি

# first step - convert all numbers to uppercase letters
S=sub('\d+',lambda m:chr(int(m.group(0))+64),input())
# empty list to hold encoding of second step
Q=[]
# find every encoded pair (uppercase letter and some char)
for p in findall('[A-Z].',S):
 # if it occures 3 or move times
 if S.count(p)>2:
  # get lowercase letter to substitute with
  a=chr(len(Q)+97)
  # store encoding into list
  Q+=[p+a]
  # update string - substitute pair with lowercase letter
  S=sub(escape(p),a,S)
# output
# encodings of second step, space, result
# if nothing was compressed at step 2, space would prepend result (of step 1)
print''.join(Q),S

পদক্ষেপ 2 এ সংকুচিত

দ্বিতীয় ধাপে সংকুচিত হয়নি


পাইথন 2 , 246 বাইট

পুরো দ্বিতীয় ধাপটি রি.স.ব. এর repl lambda এ সম্পন্ন হয়েছে। শুধুই মজার জন্য.

from re import*
Q=[]
S=sub('\d+',lambda m:chr(int(m.group(0))+64),input())
S=sub('[A-Z].',lambda m:(lambda m:S.count(m)>2and(m in Q or not Q.append(m))and chr(Q.index(m)+97)or m)(m.group(0)),S)
print''.join(Q[i]+chr(i+97)for i in range(len(Q))),S

এটি অনলাইন চেষ্টা করুন!



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.