Diberikan gambar hitam-putih dalam format lossless yang masuk akal sebagai input, menghasilkan seni ASCII yang sedekat mungkin dengan gambar input.
Aturan
- Hanya baris baris dan ASCII byte 32-127 yang dapat digunakan.
- Gambar input akan dipotong sehingga tidak ada spasi kosong di sekitar gambar.
- Pengajuan harus dapat menyelesaikan seluruh corpus penilaian dalam waktu kurang dari 5 menit.
- Hanya teks mentah yang dapat diterima; tidak ada format teks kaya.
- Font yang digunakan dalam penilaian adalah 20-pt Linux Libertine .
- File teks output, ketika dikonversi ke gambar seperti dijelaskan di bawah, harus memiliki dimensi yang sama dengan gambar input, dalam 30 piksel dalam dimensi mana pun.
Mencetak gol
Gambar-gambar ini akan digunakan untuk mencetak:
Anda dapat mengunduh file zip dari gambar di sini .
Pengajuan tidak harus dioptimalkan untuk korpus ini; alih-alih, mereka harus bekerja untuk 8 gambar hitam putih dengan dimensi yang sama. Saya berhak untuk mengubah gambar dalam korpus jika saya menduga pengiriman sedang dioptimalkan untuk gambar-gambar spesifik ini.
Skor akan dilakukan melalui skrip ini:
#!/usr/bin/env python
from __future__ import print_function
from __future__ import division
# modified from http://stackoverflow.com/a/29775654/2508324
# requires Linux Libertine fonts - get them at https://sourceforge.net/projects/linuxlibertine/files/linuxlibertine/5.3.0/
# requires dssim - get it at https://github.com/pornel/dssim
import PIL
import PIL.Image
import PIL.ImageFont
import PIL.ImageOps
import PIL.ImageDraw
import pathlib
import os
import subprocess
import sys
PIXEL_ON = 0 # PIL color to use for "on"
PIXEL_OFF = 255 # PIL color to use for "off"
def dssim_score(src_path, image_path):
out = subprocess.check_output(['dssim', src_path, image_path])
return float(out.split()[0])
def text_image(text_path):
"""Convert text file to a grayscale image with black characters on a white background.
arguments:
text_path - the content of this file will be converted to an image
"""
grayscale = 'L'
# parse the file into lines
with open(str(text_path)) as text_file: # can throw FileNotFoundError
lines = tuple(l.rstrip() for l in text_file.readlines())
# choose a font (you can see more detail in my library on github)
large_font = 20 # get better resolution with larger size
if os.name == 'posix':
font_path = '/usr/share/fonts/linux-libertine/LinLibertineO.otf'
else:
font_path = 'LinLibertine_DRah.ttf'
try:
font = PIL.ImageFont.truetype(font_path, size=large_font)
except IOError:
print('Could not use Libertine font, exiting...')
exit()
# make the background image based on the combination of font and lines
pt2px = lambda pt: int(round(pt * 96.0 / 72)) # convert points to pixels
max_width_line = max(lines, key=lambda s: font.getsize(s)[0])
# max height is adjusted down because it's too large visually for spacing
test_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
max_height = pt2px(font.getsize(test_string)[1])
max_width = pt2px(font.getsize(max_width_line)[0])
height = max_height * len(lines) # perfect or a little oversized
width = int(round(max_width + 40)) # a little oversized
image = PIL.Image.new(grayscale, (width, height), color=PIXEL_OFF)
draw = PIL.ImageDraw.Draw(image)
# draw each line of text
vertical_position = 5
horizontal_position = 5
line_spacing = int(round(max_height * 0.8)) # reduced spacing seems better
for line in lines:
draw.text((horizontal_position, vertical_position),
line, fill=PIXEL_ON, font=font)
vertical_position += line_spacing
# crop the text
c_box = PIL.ImageOps.invert(image).getbbox()
image = image.crop(c_box)
return image
if __name__ == '__main__':
compare_dir = pathlib.PurePath(sys.argv[1])
corpus_dir = pathlib.PurePath(sys.argv[2])
images = []
scores = []
for txtfile in os.listdir(str(compare_dir)):
fname = pathlib.PurePath(sys.argv[1]).joinpath(txtfile)
if fname.suffix != '.txt':
continue
imgpath = fname.with_suffix('.png')
corpname = corpus_dir.joinpath(imgpath.name)
img = text_image(str(fname))
corpimg = PIL.Image.open(str(corpname))
img = img.resize(corpimg.size, PIL.Image.LANCZOS)
corpimg.close()
img.save(str(imgpath), 'png')
img.close()
images.append(str(imgpath))
score = dssim_score(str(corpname), str(imgpath))
print('{}: {}'.format(corpname, score))
scores.append(score)
print('Score: {}'.format(sum(scores)/len(scores)))
Proses penilaian:
- Jalankan pengajuan untuk setiap gambar corpus, mengeluarkan hasilnya ke
.txt
file dengan batang yang sama dengan file corpus (dilakukan secara manual). - Konversi setiap file teks ke gambar PNG, menggunakan font 20-point, memotong spasi.
- Ubah ukuran gambar hasil ke dimensi gambar asli menggunakan Lanczos resampling.
- Bandingkan setiap gambar teks dengan gambar asli yang digunakan
dssim
. - Keluarkan skor dssim untuk setiap file teks.
- Keluarkan skor rata-rata.
Kesamaan Struktural (metrik yang digunakan untuk dssim
menghitung skor) adalah metrik yang didasarkan pada penglihatan manusia dan identifikasi objek dalam gambar. Sederhananya: jika dua gambar terlihat mirip dengan manusia, mereka akan (mungkin) memiliki skor rendah dssim
.
Pengajuan yang menang akan menjadi pengajuan dengan skor rata-rata terendah.
.txt
file"? Haruskah teks output program yang akan disalurkan ke file atau haruskah kita output file secara langsung?Jawaban:
Java, skor 0,57058675
Ini sebenarnya pertama kali saya melakukan manipulasi gambar jadi agak canggung tapi saya pikir ternyata baik-baik saja.
Saya tidak bisa membuat dssim bekerja di komputer saya, tetapi saya bisa membuat gambar menggunakan PIL.
Menariknya, font memberitahu saya di Jawa bahwa masing-masing karakter yang saya gunakan lebar
6
. Anda dapat melihat bahwa dalam program sayaFontMetrics::charWidth
adalah6
untuk semua karakter yang telah saya gunakan. The{}
logo terlihat cukup baik dalam font monospace. Tetapi untuk beberapa alasan, baris-baris tersebut tidak benar-benar berbaris dalam file teks lengkap. Saya menyalahkan ligatur. (Dan ya, saya harus menggunakan font yang benar.)Dalam font monospasi:
Setelah menjalankannya melalui alat gambar:
Bagaimanapun, ini kode yang sebenarnya.
Menyusun:
C:\Program Files\Java\jdk1.8.0_91\bin
)AsciiArt.java
javac AsciiArt.java
jar cvfe WhateverNameYouWant.jar AsciiArt AsciiArt.class
Penggunaan
java -jar WhateverNameYouWant.jar C:\full\file\path.png
:, mencetak ke STDOUTMEMBUTUHKAN file sumber yang akan disimpan dengan kedalaman 1-bit dan sampel untuk piksel putih menjadi
1
.Mencetak skor:
sumber
-ea
untuk mengaktifkan pernyataan. Itu tidak akan mengubah perilaku (kecuali mungkin memperlambatnya dalam jumlah kecil) karena asersi bekerja dengan kegagalan program ketika mereka mengevaluasifalse
dan semua asersi ini berlalu.