Kayıp ASCII sanat sıkıştırma


21

Arka fon

PICASCII , görüntüleri ASCII sanatına dönüştüren zarif bir araçtır.

Aşağıdaki on ASCII karakterini kullanarak farklı parlaklık derecelerine ulaşır:

@#+';:,.` 

Bu karakterlerin (karakter elemanları) 1'den (tabelada) 10'a (boşluk) kadar parlaklığa sahip olduğunu söyleyeceğiz.

Aşağıda, doğru yazı tipiyle görüntülenen küçük bir kodun, Gal bayrağının, devrik bir fraktalın, büyük bir alabalık ve küçük bir golfün dönüştürülmesinin sonuçlarını görebilirsiniz:

ASCII sanatı

Bu kemandaki görüntüleri görebilir ve Google Drive'dan indirebilirsiniz .

Görev

PICASCII'nin sonuçları görsel olarak hoş olsa da, birleştirilen beş görüntü de 153,559 bayt ağırlığında. Kalitelerinin bir bölümünü feda etmeye hazırsak, bu görüntüler ne kadar sıkıştırılabilir?

Göreviniz, yukarıdakiler gibi bir ASCII sanat görüntüsünü kabul eden ve girdi olarak minimum kalite kabul eden ve görüntünün kayıplı bir sıkıştırmasını (tam bir program veya tek bir dizgeyi döndüren bir işlev biçiminde) basan bir program yazmaktır. kalite gereksinimi.

Bu, ayrı bir dekompresör yazmadığınız anlamına gelir; Sıkıştırılmış görüntülerin her birinde yerleşik olmalıdır.

Orijinal görüntü, satır beslemeleri ile aynı uzunluktaki çizgilere ayrılmış, 1 ile 10 arasında parlaklığa sahip karakterlerden oluşacaktır. Sıkıştırılmış görüntünün aynı boyutta olması ve aynı karakter kümesini kullanması gerekir.

N charxel içeren sıkıştırılmamış bir görüntü için, görüntünün sıkıştırılmış bir versiyonunun kalitesi

kalite formülü

Nerede c ı parlaklığı olan i inci sıkıştırılmış resmin çıktı charxel ve u ı parlaklığı i inci sıkıştırılmamış görüntünün charxel.

puanlama

Kodunuz, her bir görüntü için giriş ve minimum kalite ayarları olan 0.50, 0.60, 0.70, 0.80 ve 0.90 olarak yukarıdaki beş görüntü ile çalıştırılacaktır.

Puanınız, tüm sıkıştırılmış görüntülerin boyutlarının, yani yirmi beş sıkıştırılmış görüntünün tümünün uzunluğunun yirmi beşinci kökünün geometrik ortalamasıdır.

En düşük puan kazanır!

Ek kurallar

  • Kodunuz yalnızca puanlama için kullanılanları değil, keyfi görüntüler için çalışmak zorundadır.

    Test durumlarda doğru kod, ancak bu bile olmayan bir programı optimize beklenmektedir girişimi benden bir upvote almazsınız keyfi görüntüleri sıkıştırmak için.

  • Kompresörünüz dahili byte stream kompresörleri (örneğin, gzip) kullanabilir, ancak bunları sıkıştırılmış görüntüler için kendiniz uygulamanız gerekir.

    Normalde bayt akım dekompresörlerinde (örneğin baz dönüşüm, çalışma uzunluğu kod çözme) kullanılan mermilere izin verilir.

  • Kompresör ve sıkıştırılmış görüntüler aynı dilde olmak zorunda değildir.

    Ancak, tüm sıkıştırılmış görüntüler için tek bir dil seçmelisiniz.

  • Sıkıştırılmış her görüntü için standart kod golf kuralları uygulanır.

Doğrulama

Tüm kalite gereksinimlerini kolayca doğrulamak ve bir gönderinin puanını hesaplamak için bir CJam senaryosu hazırladım.

Java tercümanını buradan veya buradan indirebilirsiniz .

e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.

"file:///home/dennis/codegolf/53199/original/image%s.txt"

e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".

"file:///home/dennis/codegolf/53199/code/image%s-%s.php"

e# URLs of the compressed images (output).

"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"

e# Code

:O;:C;:U;5,:)
{
    5,5f+Af*
    {
        C[IQ]e%g,X*:X;
        ISQS
        [U[I]e%O[IQ]e%]
        {g_W=N&{W<}&}%
        _Nf/::,:=
        {
            {N-"@#+';:,.` "f#}%z
            _::m2f#:+\,81d*/mq1m8#
            _"%04.4f"e%S
            @100*iQ<"(too low)"*
        }{
            ;"Dimension mismatch."
        }?
        N]o
    }fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N

Örnek

Bash → PHP, puan 30344.0474

cat

Tüm girdiler için% 100 kalite elde eder.

$ java -jar cjam-0.6.5.jar vrfy.cjam
1 50 1.0000 
1 60 1.0000 
1 70 1.0000 
1 80 1.0000 
1 90 1.0000 
2 50 1.0000 
2 60 1.0000 
2 70 1.0000 
2 80 1.0000 
2 90 1.0000 
3 50 1.0000 
3 60 1.0000 
3 70 1.0000 
3 80 1.0000 
3 90 1.0000 
4 50 1.0000 
4 60 1.0000 
4 70 1.0000 
4 80 1.0000 
4 90 1.0000 
5 50 1.0000 
5 60 1.0000 
5 70 1.0000 
5 80 1.0000 
5 90 1.0000 

SCORE: 30344.0474

Bu bölümü anlamakta biraz güçlük çekiyorum: Birisi q = 0.5 seçerse, girdi dosyasındaki her karakter, çıktıdaki parlaklığın yarısı ile değiştirilmelidir, değil mi? Belli ki boşluğu hariç tuttum, çünkü bu bütün görüntüyü mahveder.
Nicolás Siplis

1
Hepsi çok kafa karıştırıcı ve boşluklu. Mattmahoney.net/dc/barf.html girişini nasıl durdurursunuz ? Açıştırıcı, sıkıştırılmış görüntüden başka bir dosyayı da okuyabilir mi? Bir piton betiği veya bir görüntüyü gerçekten kontrol eden ve görüntüyü hesaplayan bir cetvel sunabilir misiniz? Vb
Will

1
@ Kafa karıştırıcı mı? Olabilir. Ama bunun bir boşluk olduğunu sanmıyorum. Sıkıştırılmış her görüntünün bir program veya işlev olması gerekir, bu nedenle BARF gibi komik olmayan şakalar otomatik olarak hariç tutulur. Python'u tanımıyorum ama doğrulama için basit bir şey düşüneceğim.
Dennis,

8
“Tüm kalite gereksinimlerini kolayca doğrulamak ve bir gönderinin puanını hesaplamak için bir CJam senaryosu hazırladım.” İnsanlar bu şeyi normal senaryolar yapmak için gerçekten kullanıyor mu? Sevgili lordum ...
15'te

Yanıtlar:


4

Java → CJam, puan ≈4417.89

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import net.aditsu.cjam.CJam;

public class Compress {
    protected static final char[] DIGITS = "0123456789ABCDEFGHIJK".toCharArray();
    protected static final String CHARS = "@#+';:,.` ";
    protected static final char[] CHR = CHARS.toCharArray();

    private static class Img {
        public final int rows;
        public final int cols;
        public final int[][] a;

        public Img(final int rows, final int cols) {
            this.rows = rows;
            this.cols = cols;
            a = new int[rows][cols];
        }

        public Img(final List<String> l) {
            rows = l.size();
            cols = l.get(0).length();
            a = new int[rows][cols];
            for (int i = 0; i < rows; ++i) {
                for (int j = 0; j < cols; ++j) {
                    a[i][j] = CHARS.indexOf(l.get(i).charAt(j));
                }
            }
        }

        public static Img read(final Reader r) {
            try {
                final BufferedReader br = new BufferedReader(r);
                final List<String> l = new ArrayList<>();
                while (true) {
                    final String s = br.readLine();
                    if (s == null || s.isEmpty()) {
                        break;
                    }
                    l.add(s);
                }
                br.close();
                return new Img(l);
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        public static Img read(final File f) {
            try {
                return read(new FileReader(f));
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        public Img scaleDown(final int fr, final int fc) {
            final int r1 = (rows + fr - 1) / fr;
            final int c1 = (cols + fc - 1) / fc;
            final Img x = new Img(r1, c1);
            final int[][] q = new int[r1][c1];
            for (int i = 0; i < rows; ++i) {
                for (int j = 0; j < cols; ++j) {
                    x.a[i / fr][j / fc] += a[i][j];
                    q[i / fr][j / fc]++;
                }
            }
            for (int i = 0; i < r1; ++i) {
                for (int j = 0; j < c1; ++j) {
                    x.a[i][j] /= q[i][j];
                }
            }
            return x;
        }

        public Img scaleUp(final int fr, final int fc) {
            final int r1 = rows * fr;
            final int c1 = cols * fc;
            final Img x = new Img(r1, c1);
            for (int i = 0; i < r1; ++i) {
                for (int j = 0; j < c1; ++j) {
                    x.a[i][j] = a[i / fr][j / fc];
                }
            }
            return x;
        }

        public Img crop(final int r, final int c) {
            if (r == rows && c == cols) {
                return this;
            }
            final Img x = new Img(r, c);
            for (int i = 0; i < r; ++i) {
                for (int j = 0; j < c; ++j) {
                    x.a[i][j] = a[i][j];
                }
            }
            return x;
        }

        public Img rescale(final int fr, final int fc) {
            return scaleDown(fr, fc).scaleUp(fr, fc).crop(rows, cols);
        }

        public double quality(final Img x) {
            if (x.rows != rows || x.cols != cols) {
                throw new IllegalArgumentException();
            }
            double t = 0;
            for (int i = 0; i < rows; ++i) {
                for (int j = 0; j < cols; ++j) {
                    final int y = a[i][j] - x.a[i][j];
                    t += y * y;
                }
            }
            t /= 81 * rows * cols;
            t = 1 - Math.sqrt(t);
            return Math.pow(t, 8);
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder();
            for (int i = 0; i < rows; ++i) {
                for (int j = 0; j < cols; ++j) {
                    sb.append(CHR[a[i][j]]);
                }
                sb.append('\n');
            }
            return sb.toString();
        }

        public Array toArray() {
            final Array x = new Array(rows * cols);
            int k = 0;
            for (int i = 0; i < rows; ++i) {
                for (int j = 0; j < cols; ++j) {
                    x.a[k++] = a[i][j];
                }
            }
            return x;
        }

        public String compress(final double quality) {
            int bi = 1;
            int bj = 1;
            int bs = rows * cols;
            Img bx = this;

            for (int i = 1; i < 3; ++i) {
                for (int j = 1; j < 3; ++j) {
                    Img x = rescale(i, j);
                    if (quality(x) >= quality) {
                        x = scaleDown(i, j);
                        if (x.rows * x.cols < bs) {
                            bi = i;
                            bj = j;
                            bs = x.rows * x.cols;
                            bx = x;
                        }
                    }
                }
            }

            Array a = bx.toArray();
            int bf = 0;
            for (int i = 1; i <= 20; ++i) {
                final int t = a.rle11(i).n;
                if (t < bs) {
                    bs = t;
                    bf = i;
                }
            }

            int b = 10;
            if (bf > 0) {
                b = 11;
                a = a.rle11(bf);
            }

            String s = null;
            for (int i = 92; i < 97; ++i) {
                for (char c = ' '; c < '$'; ++c) {
                    final String t = a.cjamBase(b, i, c);
                    boolean ok = true;
                    for (int j = 0; j < t.length(); ++j) {
                        if (t.charAt(j) > '~') {
                            ok = false;
                            break;
                        }
                    }
                    if (!ok) {
                        continue;
                    }
                    if (s == null || t.length() < s.length()) {
                        s = t;
                    }
                }
            }

            if (bf > 0) {
                s += "{(_A={;()";
                if (bf > 1) {
                    s += DIGITS[bf] + "*";
                }
                s += "\\(a@*}&\\}h]e_";
            }
            if (bi * bj == 1) {
                return s + '"' + CHARS + "\"f=" + cols + "/N*";
            }
            s += bx.cols + "/";
            if (bi > 1) {
                s += bi + "e*";
                if (rows % 2 == 1) {
                    s += "W<";
                }
            }
            if (bj > 1) {
                s += bj + "fe*";
                if (cols % 2 == 1) {
                    s += "Wf<";
                }
            }
            return s + '"' + CHARS + "\"ff=N*";
        }

        public void verify(final String s, final double quality) {
            final String t = CJam.run(s, "");
            final Img x = read(new StringReader(t));
            final double q = quality(x);
            if (q < quality) {
                throw new RuntimeException(q + " < " + quality);
            }
//          System.out.println(q + " >= " + quality);
        }
    }

    private static class Array {
        public final int[] a;
        public final int n;

        public Array(final int n) {
            this.n = n;
            a = new int[n];
        }

        public Array(final int[] a) {
            this.a = a;
            n = a.length;
        }

        public String join() {
            final StringBuilder sb = new StringBuilder();
            for (int x : a) {
                sb.append(x).append(' ');
            }
            sb.setLength(sb.length() - 1);
            return sb.toString();
        }

//      public String cjamStr() {
//          final StringBuilder sb = new StringBuilder("\"");
//          for (int x : a) {
//              sb.append(DIGITS[x]);
//          }
//          sb.append("\":~");
//          return sb.toString();
//      }

        public String cjamBase(final int m, final int b, final char c) {
            final boolean zero = a[0] == 0;
            String s = join();
            if (zero) {
                s = "1 " + s;
            }
            s = CJam.run("q~]" + m + "b" + b + "b'" + c + "f+`", s);
            s += "'" + c + "fm" + b + "b" + DIGITS[m] + "b";
            if (zero) {
                s += "1>";
            }
            return s;
        }

        public Array rle11(final int f) {
            final int[] b = new int[n];
            int m = 0;
            int x = -1;
            int k = 0;
            for (int i = 0; i <= n; ++i) {
                final int t = i == n ? -2 : a[i];
                if (t == x && m < 11 * f) {
                    m++;
                }
                else {
                    if (m >= f && m > 3) {
                        b[k++] = 10;
                        b[k++] = m / f - 1;
                        b[k++] = x;
                        for (int j = 0; j < m % f; ++j) {
                            b[k++] = x;
                        }
                    }
                    else {
                        for (int j = 0; j < m; ++j) {
                            b[k++] = x;
                        }
                    }
                    m = 1;
                    x = t;
                }
            }
            return new Array(Arrays.copyOf(b, k));
        }
    }

    private static void score() {
        double p = 1;
        for (int i = 1; i < 6; ++i) {
            final File f = new File("image" + i + ".txt");
            final Img img = Img.read(f);
            final int n = (int) f.length();
            for (int j = 5; j < 10; ++j) {
                final double q = j / 10.0;
                final String s = img.compress(q);
                System.out.println(f.getName() + ", " + q + ": " + n + " -> " + s.length());
                img.verify(s, q);
                p *= s.length();
            }
        }
        System.out.println(Math.pow(p, 1 / 25.0));
    }

    public static void main(final String... args) {
        if (args.length != 2) {
            score();
            return;
        }
        final String fname = args[0];
        final double quality = Double.parseDouble(args[1]);
        try {
            final Img img = Img.read(new File(fname));
            final String s = img.compress(quality);
            img.verify(s, quality);
            final FileWriter fw = new FileWriter(fname + ".cjam");
            fw.write(s);
            fw.close();
        }
        catch (IOException e) {
            throw new RuntimeException();
        }
    }
}

Sınıf yolunda CJam kavanozu gerektirir. 2 komut satırı argümanı verirseniz (dosya adı ve kalitesi), dosya adına ".cjam" ekler ve burada sıkıştırılmış resmi yazar. Aksi halde, geçerli dizinde olduğu düşünülen 5 test görüntüsündeki puanını hesaplar. Program ayrıca her sıkıştırılmış görüntüyü otomatik olarak doğrular. Herhangi bir tutarsızlık olması durumunda puan hesaplamasını iki kez kontrol etmek isteyebilirsiniz.

Kullanılan teknikler (şimdiye kadar): kaliteyi çok fazla düşürmezse yarıya ölçekleme (yatay, dikey ya da her ikisi), özel kodlanmış bir RLE ve her karakterde daha fazla veri paketlemek için temel dönüştürme. yazdırılabilir ASCII aralığı.


Bunun nasıl çalıştırılacağı hakkında bana kısa bir genel bakış verebilir misiniz? Derledim (başarılı bir şekilde düşünüyorum, sanırım) javac -cp cjam-0.6.5.jar Compress.java, ancak java -cp cjam-0.6.5.jar Compressdiyor Error: Could not find or load main class Compressve java CompressCJam sınıfını bulamıyor.
Dennis,

@Dennis Classpath (-cp) dosyasına Compress.class içeren dizini eklemeniz gerekir. Geçerli -cp .:cjam-0.6.5.jar
dizindeyse

İşe yaradı, teşekkür ederim.
Dennis,

2

Python 3.5 (ana ve çıktı) (şu anda rekabet dışı)

Doğum günün kutlu olsun, meydan! İşte hediyen: bir cevap!

EDIT: Çıktıyı python koduna dönüştürdü, iyileştirilmiş sıkıştırma oranı (biraz) EDIT2: size1 olduğunda ham yazdırıldı . İyileştirilmiş puan, ancak puanın tekrar hesaplanması gerekiyor. EDIT3: @Dennis hala düzeltmem gereken hatalarım olduğunu belirtti, bu yüzden yanıtı rakipsiz olarak işaretledim

Kod:

import sys
LIST = [' ','`','.',',',':',';',"'",'+','#','@']

def charxel_to_brightness(charxel):
    return LIST.index(charxel)

def brightness_to_charxel(bright):
    return LIST[bright]

def image_to_brightness(imagetext):
    return [list(map(charxel_to_brightness,line)) for line in imagetext.split("\n")]

def brightness_to_image(brightarray):
    return '\n'.join([''.join(map(brightness_to_charxel,line)) for line in brightarray])

def split_into_parts(lst,size):
    return [lst[x:x+size] for x in range(0, len(lst), size)]

def gen_updown(startxel,endxel,size):
    return [[int((size-r)*(endxel-startxel)/size+startxel) for c in range(size)] for r in range(size)]

def gen_leftright(startxel,endxel,size):
    return [[int((size-c)*(endxel-startxel)/size+startxel) for c in range(size)] for r in range(size)]

def gen_tlbr(startxel,endxel,size):
    return [[int((2*size-r-c)/2*(endxel-startxel)/size+startxel) for c in range(size)] for r in range(size)]

def gen_bltr(startxel,endxel,size):
    return [[int((size-r+c)/2*(endxel-startxel)/size+startxel) for c in range(size)] for r in range(size)]

def gen_block(code,startxel,endxel,size):
    if code==0:return gen_updown(startxel,endxel,size)
    if code==1:return gen_leftright(startxel,endxel,size)
    if code==2:return gen_bltr(startxel,endxel,size)
    if code==3:return gen_tlbr(startxel,endxel,size)

def vars_to_data(code,startxel,endxel):
    acc=endxel
    acc+=startxel<<4
    acc+=code<<8
    return acc

def data_to_vars(data):
    code=data>>8
    startxel=(data>>4)&15
    endxel=data&15
    return code,startxel,endxel

def split_into_squares(imgarray,size):
    rows = split_into_parts(imgarray,size)
    allsquares = []
    for rowblock in rows:
        splitrows = []
        for row in rowblock:
            row = split_into_parts(row,size)
            splitrows.append(row)
        rowdict = []
        for row in splitrows:
            for x in range(len(row)):
                if len(rowdict)<=x:
                    rowdict.append([])
                rowdict[x].append(row[x])
        allsquares.append(rowdict)
    return allsquares

def calc_quality(imgarray,comparray):
    acc=0
    for row in range(len(imgarray)):
        for col in range(len(imgarray[row])):
            acc+=pow(imgarray[row][col]-comparray[row][col],2)
    return (1-(acc/81.0/sum([len(row) for row in imgarray]))**.5)**8

def fuse_squares(squarray):
    output=[]
    counter=0
    scounter=0
    sqrow=0
    while sqrow<len(squarray):
        if scounter<len(squarray[sqrow][0]):
            output.append([])
            for square in squarray[sqrow]:
                output[counter].extend(square[scounter])
            scounter+=1
            counter+=1
        else:
            scounter=0
            sqrow+=1
    return output

def main_calc(imgarray,threshold):
    imgarray = image_to_brightness(imgarray)
    size = 9
    quality = 0
    compimg=[]
    datarray=[]
    testdata = [vars_to_data(c,s,e) for c in range(4) for s in range(10) for e in range(10)]
    while quality<threshold:
        squares = split_into_squares(imgarray,size)
        compimg = []
        datarray = []
        testblock = [gen_block(c,s,e,size) for c in range(4) for s in range(10) for e in range(10)]
        for row in squares:
            comprow = []
            datrow=[]
            for square in row:
                quality_values = [calc_quality(square,block) for block in testblock]
                best_quality = quality_values.index(max(quality_values))
                comprow.append(testblock[best_quality])
                datrow.append(testdata[best_quality])
            compimg.append(comprow)
            datarray.append(datrow)
        compimg = fuse_squares(compimg)
        quality = calc_quality(imgarray,compimg)
        print("Size:{} Quality:{}".format(size,quality))
        size-=1
    return brightness_to_image(compimg),datarray,size+1

template = '''def s(d,s,e,z):
 x=range(z)
 return d<1 and[[int((z-r)*(e-s)/z+s)for c in x]for r in x]or d==1 and[[int((z-c)*(e-s)/z+s)for c in x]for r in x]or d==2 and[[int((2*z-r-c)/2*(e-s)/z+s)for c in x]for r in x]or d>2 and[[int((z-r+c)/2*(e-s)/z+s)for c in x] for r in x]
i=lambda a:'\\n'.join([''.join(map(lambda r:" `.,:;'+#@"[r],l))for l in a])
def f(a):
 o=[];c=0;s=0;r=0
 while r<len(a):
  if s<len(a[r][0]):
   o.append([])
   for q in a[r]:
    o[c].extend(q[s])
   s+=1;c+=1
  else:
   s=0;r+=1
 return o
t={};z={}
print(i(f([[s(D>>8,(D>>4)&15,D&15,z)for D in R]for R in t])))'''

template_size_1 = '''print("""{}""")'''   

def main(filename,threshold):
    print(filename+" "+str(threshold))
    file = open(filename,'r')
    compimg,datarray,size = main_calc(file.read(),threshold)
    file.close()
    textoutput = open(filename.split(".")[0]+"-"+str(threshold*100)+".txt",'w')
    textoutput.write(compimg)
    textoutput.close()
    compoutput = open(filename.split(".")[0]+"-"+str(threshold*100)+".py",'w')
    datarray = str(datarray).replace(" ","")
    code = ""
    if size==1:
        code = template_size_1.format(compimg)
    else:
        code= template.format(datarray,str(size))
    compoutput.write(code)
    compoutput.close()
    print("done")

if __name__ == "__main__":
    main(sys.argv[1],float(sys.argv[2]))

Bu cevapta pek çok gelişme olabilir, bu yüzden muhtemelen haftasonu üzerinde daha fazla çalışacağım.

Bu nasıl çalışır:

  • Görüntüyü boyut bloklarına bölün size.
  • En iyi eşleşen bloğu bul
    • Bloklar artık gradyana sahip olabilir!
  • Tüm görüntü için kaliteyi hesaplayın (formüle göre).
  • Doğruysa, sıkıştırılmış görüntüyü dosyaya yazın.
  • Aksi takdirde, azaltın sizeve tekrar deneyin.

Bu algoritma düşük kaliteli (0.5, 0.6) için iyi çalışır, ancak yüksek kaliteli görüntülerde (aslında şişer) çok iyi çalışmaz. Aynı zamanda gerçekten yavaş.

Burada oluşturulan tüm dosyalar var, bu yüzden onları tekrar oluşturmak zorunda kalmayacaksınız.


Sonunda bir cevap! Bu teknik olarak rekabet edemez, çünkü bu mücadeleyi yayınladıktan sonra Bubblegum'u yarattığımdan ... Puanlama komut dosyasını daha sonra çalıştıracağım ve belki daha az ezoterik bir dile taşıyacağım.
Dennis,

@Dennis Ah, çıktıyı python betiğine yerleştirmek çok zor olmamalı. Yardımların için teşekkürler
Blue

Mücadelemi tekrar okudum (bir yıl sonra, detaylar üzerinde biraz bulanıktım) ve kompresörünüz yerleşik byte stream kompresörleri kullanabilir (örneğin, gzip), ancak bunları kendiniz için uygulamanız gerektiğini söylüyor sıkıştırılmış görüntüler Bu, Bubblegum'un zaten dışarıda olduğu anlamına geliyor.
Dennis,

Sonunda bunu puanlayacağımı vaat ettiğimi hatırladım; gecikme için üzgünüm. Kodunuz , programı çalıştırmak için sabitlediğim bir yazım hatası ( compingolması gerektiği compimg) gibi görünüyor . Kodunuzu çalıştırırken bir hata yapmadığım sürece, oluşturulan görüntülerin bazılarının boyutları yanlış (örneğin, image2.txt33,164 bayt, ancak image2-50.0.txt33,329) ve diğer üretilen programları çalıştırırken aynı dosyayı oluşturmuyor ( 0,5110image3-50.0.txt kalitede) , ancak oluşturulan programın çalıştırılması 0.4508 kalitesi ile sonuçlanır ).
Dennis,

Ek: image3-50.0.pyDropbox'ınızdan indirdim ve oluşturduğum dosyayla aynı.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.