Latar Belakang
Seni ASCII adalah praktik membuat gambar dengan menggunakan teks ASCII untuk membentuk bentuk.
Aliasing adalah efek yang dibuat oleh "piksel" besar seni ASCII, yang merupakan ukuran karakter. Gambar menjadi gumpal dan sulit dilihat. Anti-aliasing menghilangkan efek ini dengan menciptakan gradien dan dengan melunakkan tepi keras seni ASCII.
Tantangan
Tantangan Anda adalah menulis program sesingkat mungkin yang akan mengambil karya seni ASCII dan akan menampilkan versi yang anti-alias.
Anti-aliasing macam apa?
Semua seni ASCII akan terdiri dari dua jenis simbol: Spasi dan non-spasi putih. Untuk setiap karakter non-spasi putih, program Anda harus menentukan apakah karakter tersebut berada pada posisi di mana ia harus anti-alias. Jika ya, maka Anda harus menggantinya dengan karakter yang benar. Jika tidak, maka karakternya tetap sama.
Bagaimana Anda tahu jika karakter perlu anti-alias? Jawabannya tergantung pada karakter yang tepat di atas, di bawah, kiri, dan kanan karakter ( bukan diagonal ). Berikut adalah bagan kapan anti-aliasing diperlukan, di mana ?
dan x
bisa berdiri untuk karakter non-spasi putih.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Input (dan contoh seni ASCII sebelum anti-aliasing)
Pertama, akan ada dua baris input (ke STDIN), angka H diikuti oleh angka W. Kemudian akan ada baris H masing-masing karakter W (tidak termasuk baris baru). Baris-baris berikut ini akan menjadi seni ASCII yang perlu anti-alias. Berikut adalah contoh input (tidak cantik, tetapi ujian):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Keluaran (dan contoh seni anti-alias)
Program Anda harus menghasilkan STDOUT the ASCII art (dengan dimensi yang sama), yang anti-alias. Berikut ini adalah output untuk input di atas. Perhatikan bagaimana karakter perbatasan diperlakukan sebagai membatasi spasi.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
Ini mungkin tidak terlihat bagus (karena jarak antar baris dalam blok kode), terlihat lebih baik dengan seni ASCII yang lebih besar, dan kualitasnya tergantung pada jenis huruf yang digunakan.
Contoh lain
Memasukkan
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Keluaran
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Aturan, Batasan, dan Catatan
Program Anda harus ditulis dalam karakter ASCII yang dapat dicetak saja, sehingga kami dapat membuat karya seni keluar dari program. Selain itu, aturan kode-golf standar berlaku.
sumber
_
telah menjadi;
karena berfungsi lebih baik.Jawaban:
Ruby,
180168 karakterImplementasi Ruby lain yang mengambil pendekatan zip. Anda dapat melihat contoh kedua berjalan online .
Sunting: Menggunakan
readlines
menyimpan 12 karakter.sumber
Ruby
275265263261258254244243214212207Contoh 1: http://ideone.com/PfNMA
Contoh 2: http://ideone.com/sWijD
sumber
0..h-1
dapat ditulis sebagai0...h
. 3)G=[];h.times{G<<gets}
dapat ditulis sebagaiG=readlines
, sama seperti dalam kode C # Anda. 4) Setelah langkah 3. variabel h menjadi tidak berguna, nilai h dan w hanya digunakan satu kali, sehinggah=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
dapat ditulis sebagaiH=0...gets.to_i;W=0...gets.to_i
. 5) Dalam hal iniand
dapat ditulis sebagai&&
, yang tidak membutuhkan ruang di sekitar. 6) Anda memiliki tambahan; dan Anda menghitung baris baru di akhir file, yang tidak perlu. Ini berarti 214 chars: ideone.com/CiW0lH=0..gets.to_i
ketika saya menulis kode, tetapi sepertinya tidak berhasil (jelas itu pasti karena alasan lain).map
bukannyaeach
2)z=->...
alih-alihdef z...end
.map
alih - aliheach
perubahan. Untuk sintaks lambda, bagaimanapun, saya pikir itu akan membutuhkan penggunaanz
menjadi bentukz.call(args)
bukanz(args)
, sehingga menambahkan sedikit ke jumlah karakter. Tolong beri tahu saya jika saya melewatkan sesuatu.[]
penggunaan lambda .Javascript, 410 karakter:
ungolfed:
Asli,
440 karakter:NB Saya berasumsi bahwa dua jalur input pertama sebenarnya tidak relevan dan ukuran baris berikut ini benar. Saya juga berpikir saya mungkin bisa memotong beberapa karakter lagi ketika saya mendapat kesempatan!
sumber
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
subscript kemudian mengkonversi m denganparseInt()
:m[parseInt(y[d](''),2)]
. Ini mengurangi ukuran menjadi 373 karakter.Python, 259 karakter
Program membaca input menjadi string tunggal
I
(dengan spasi memisahkan garis-garis), membuka daftar 5-tupel yang berisi karakter dan empat karakter di sekitarnya, lalu mencari karakter hasil menggunakan string indexing.sumber
PHP -
359330282268257 karaktersumber
\r\n
. Saya memperbarui kode saya untuk bekerja dengan gaya unix EOL\n
.Python,
246241WC dan uji pada sampel 2, berbeda dengan output dari solusi Ruby di atas:
sumber
C #
591563sumber