পাইথন 781 731 605 579 চার্স
আমি প্রথম যখন এটি দেখেছিলাম তখন থেকে আরও অনেক বেশি এবং আরও ভাল উত্তর পাওয়া যায়, তবে আমি আমার অজগর স্ক্রিপ্টটিতে অনেক সময় নষ্ট করেছি তাই আমি এটি যে কোনও উপায়ে পোস্ট করতে যাচ্ছি, এটি আরও সংক্ষিপ্ত করার জন্য পরামর্শগুলি দেখতে অবাক লাগবে,
সম্পাদনা করুন: এড এইচ এর পরামর্শের জন্য 2 টি অক্ষর কাটা, আরও এগিয়ে যেতে আমাকে এখানে অনেক কিছু পুনর্গঠন করতে হতে পারে যা কিছুটা সময় নিতে চলেছে
s="e |nd|-We| a|-(Ooh|N| what|ive| go|ay it-|I|er|G|o |make5 |D| th| othH |A| tF|ing |nna |tell|'s been|'rS|-You|-N4| know|L5 up|PR | you|evHK>| how I'm feeling-|O, g7)|O)9gL, n4gL-(G7)|-I just wa>=53Gotta EuRHstaR-.|Q've8n eachBfor sFlong:r heart<Pch?but:;toFshy@sJInsidSwSboth8M<K?onQ8CSgame6we;go>plJ|9g79let5 down9runProuR6desHt59Ecry9sayKodbye9=P lie6hurt5-|\n|Q;nFstrangHs@love:8CSrules6sFdFI-A full commitment'sM I'mCink?of: wouldn't getCis fromPnyBguy0/AR if5Psk me3Don't = me5;toFbliR@see-..2211-/0..";i=83
exec"x,s=s.split('|',1);s=s.replace(chr(i),x);i-=1"*39
print s
প্রথমবারের পরে আমি ম্যানুয়ালি স্ট্রিংটি তৈরি করেছি (খুব ক্লান্তিকর), আমি পুনরাবৃত্তভাবে প্যাটার্নটি প্রতিস্থাপনের জন্য একটি ফাংশন লিখেছিলাম যা সবচেয়ে লাভজনক ছিল (সেই ধাপে), যা আমাকে একটি সমাধান দিয়েছে তবে এটি আকারটি 10 দ্বারা বাড়িয়েছে অক্ষর।
সুতরাং, আমি কেবলমাত্র 'অক্ষরগুলি হ্রাস', চূড়ান্ত র্যাঙ্কিংয়ের পরিবর্তে 'অক্ষর হ্রাস', 'প্যাটার্নের দৈর্ঘ্য' এবং 'প্যাটার্নের সংখ্যা' র উপর চূড়ান্ত র্যাঙ্কিং না করে আমার অ্যালগরিদমকে কিছুটা লোভী করেছিলাম
প্যাটার্ন দৈর্ঘ্য = দৈর্ঘ্য গণনা = গণনা
rank = [(length-1)*count - length - 2] + lengthWeight * length + countWeight * count
তারপরে আমি আমার দুর্বল ল্যাপটপটিকে অসীমভাবে চলতে বলেছিলাম, বিভিন্ন চূড়ান্ত সংকোচনের আকার lengthWeight
এবং এলোমেলো মান নির্ধারণ করে এবং countWeight
একটি ফাইলের মধ্যে ন্যূনতম সংকোচনের জন্য ডেটা সঞ্চয় করি
আধ ঘন্টা বা তারপরে এটি উপরের স্ট্রিংয়ের সাথে উপস্থিত হয়েছিল (আমি কোডটি ছোট করতে পারি কিনা তা দেখার জন্য আমি আরও এটির সাথে টিঙ্কার চেষ্টা করেছি), এবং এটি কোনও কম হবে না, আমি অনুমান করি যে আমি এখানে কিছু মিস করছি।
এটির জন্য আমার কোডটি এখানেও max_pattern
খুব ধীর (দ্রষ্টব্য: কোডটি সমাধানের আগের সংস্করণে ফর্মের মতো একটি স্ট্রিং ছুঁড়ে ফেলেছে, আমি নিজে নিজেই বোঝাতে চাইছিলাম বর্তমান ফর্মটি পাওয়ার জন্য, ম্যানুয়ালি আমি পাইথন শেলটিতে ম্যানুয়ালি)
import itertools
global pretty
global split
split = False
pretty = False
# try to keep as much visibility as possible
def prefrange():
return range(32,127) + ([] if pretty else ([10, 9, 13] + [x for x in range(32) if x not in (10, 9, 13)] + [127]))
def asciichr():
return [chr(x) for x in prefrange()]
def max_pattern(s, o, lenw, numw):
l = len(s)
patts = []
for c in range(l/2+1,1,-1):
allsub = [s[i:i+c] for i in range(0, l, c)]
subcounts = [[a, s.count(a)] for a in allsub if len(a) == c]
repeats = [(x, y, ((c-o)*y - o*2 - c)) for x, y in subcounts if y > 1]
ranks = [(x, y, (z + lenw*c + numw*y)) for x,y,z in repeats if z > 0]
patts = patts + ranks
try:
return sorted(patts, key=lambda k: -k[2])[0]
except:
return None
def sep():
return '~~' if pretty else chr(127) + chr(127)
def newcharacter(s):
doable = [x for x in asciichr() if x not in s]
if len(doable) == 0:
doable = list(set(x+y for x in asciichr() for y in asciichr() if x+y not in s and x+y != sep()))
if len(doable) == 0:
return None
return doable[0]
def joined(s, l):
one = [x for x in l if len(x)==1]
two = [x for x in l if len(x)==2]
return ''.join(reversed(two)) + sep() + ''.join(reversed(one)) + sep() + s
def compress(s, l=[], lenw=0, numw=0):
newchr = newcharacter(s)
if newchr == None:
if not l:
return s
return joined(s,l)
else:
ptn = max_pattern(s, len(newchr), lenw, numw)
if ptn == None:
if not l:
return s
return joined(s, l)
s = s.replace(ptn[0], newchr)
s = ptn[0] + newchr + s
l.append(newchr)
return compress(s, l, lenw, numw)
def decompress(s):
lst2, lst, s = s.split(sep(),2)
li = [lst2[i:i+2] for i in xrange(0, len(lst2), 2)]+list(lst)
for c in li:
x, s = s.split(c, 1)
s = s.replace(c, x)
return s
def test(times):
import random
rnd = random.random
tested = {(1001, 1001): (10000, 10, False),}
org = open('text').read()
minfound = 1000
for i in xrange(times):
l,n = 1001,1001
while (l,n) in tested:
# i guess this would be random enough
xr = lambda: random.choice((rnd(), rnd()+rnd(), rnd()-rnd(), rnd()*random.choice((10,100,1000)), -1*rnd()*random.choice((10,100,1000)),))
n = xr()
l = xr()
sm = compress(org, l=[], lenw=l, numw=n)
try:
dc = decompress(sm)
except:
tested[l,n] = (len(sm), len(sm)/float(len(org)), 'err')
continue
tested[l,n] = (len(sm), len(sm)/float(len(org)), dc==org)
if len(sm) < minfound:
minfound = len(sm)
open('min.txt','a').write(repr(tested[l,n])+'\n')
print '~~~~~~~!!!!!!! New Minimum !!!!!!!~~~~'
return tested
if __name__ == '__main__':
import sys
split = False
try:
if sys.argv[2] == 'p':
pretty = True
except:
pretty = False
org = open(sys.argv[1]).read()
try:
l=float(sys.argv[3])
n=float(sys.argv[4])
except:
l,n=0,0
sm = compress(org,lenw=l,numw=n)
print 'COMPRESSED -->'
print sm, len(sm)
#open('new.py','w').write(sm)
print len(sm)/float(len(org))
print 'TRYING TO REVERT -->'
dc = decompress(sm)
#print dc
print dc==org