Tulis program lengkap dengan kode sumber 256 byte atau kurang yang terlihat pada gambar bendera dan tentukan dari negara mana bendera itu berasal. File zip yang berisi 196 bendera berbeda dalam tantangan dapat diunduh dari sini . Sumber: [ Flagpedia ]. 196 gambar bendera ini adalah satu-satunya input yang harus ditangani oleh program Anda.
Program Anda tidak akan menerima input. Gambar bendera akan berada di direktori yang sama dengan program Anda dan dinamai "f.png". Program Anda akan membuka file ini, mengidentifikasinya, dan mencetak singkatan dua huruf untuk negara itu . Jika Anda menggunakan bahasa yang tidak dapat membuka file, Anda juga dapat menjalankan program sebagai ./program < f.png
.
Setiap file flag dinamai sama dengan output yang diharapkan. Semua output di atas 2 huruf akan diabaikan.
Berikut adalah daftar semua output / nama file:
ad, ae, af, ag, al, am, ao, ar, at, au, az, ba, bb, bd, be, bf, bg, bh, bi, bj,
bn, bo, br, bs, bt, bw, by, bz, ca, cd, cf, cg, ch, ci, cl, cm, cn, co, cr, cu,
cv, cy, cz, de, dj, dk, dm, do, dz, ec, ee, eg, eh, er, es, et, fi, fj, fm, fr,
ga, gb, gd, ge, gh, gm, gn, gq, gr, gt, gw, gy, hn, hr, ht, hu, id, ie, il, in,
iq, ir, is, it, jm, jo, jp, ke, kg, kh, ki, km, kn, kp, kr, ks, kw, kz, la, lb,
lc, li, lk, lr, ls, lt, lu, lv, ly, ma, mc, md, me, mg, mh, mk, ml, mm, mn, mr,
mt, mu, mv, mw, mx, my, mz, na, ne, ng, ni, nl, no, np, nr, nz, om, pa, pe, pg,
ph, pk, pl, pt, pw, py, qa, ro, rs, ru, rw, sa, sb, sc, sd, se, sg, si, sk, sl,
sm, sn, so, sr, st, sv, sy, sz, td, tg, th, tj, tl, tm, tn, to, tr, tt, tv, tw,
tz, ua, ug, us, uy, uz, va, vc, ve, vn, vu, ws, ye, za, zm, zw,
Mencetak gol
Berikut ini adalah skrip python pendek yang akan saya gunakan untuk menilai setiap pengiriman.
import os
import subprocess
import random
botlist = []
with open("bots.txt") as bots:
for line in bots:
line = line.split(", ")
if len(line) >= 2:
botLine = line + [0]
botlist.append(botLine)
files = os.listdir(os.getcwd() + "/flags")
random.shuffle(files)
def test(bot_command):
score = 0
for filename in files:
command = "COPY flags\\{} f.png".format(filename)
os.system(command)
print bot_command
result = subprocess.check_output(bot_command, shell = True)
if result[:2] == filename[:2]:
score += 1
return score
for i in range(len(botlist)):
command = botlist[i][1]
botlist[i][2] = test(command)
with open("output.txt", "w+") as output:
for bot in botlist:
output.write("{} got a score of {}.".format(bot[0], bot[2]))
os.system("del f.png")
Skor Anda adalah jumlah total bendera yang diidentifikasi dengan benar. Dalam hal seri, pengajuan sebelumnya menang.
Aturan
Untuk kenyamanan pengujian saya, bahasa apa pun dengan juru bahasa / kompiler yang tersedia secara bebas untuk Windows 10 atau Ubuntu dapat digunakan.
Pustaka pemrosesan gambar diizinkan, tetapi bawaan apa pun yang terkait dengan bendera atau negara tidak diizinkan. ( Batuk Mathematica batuk )
Harap berikan perintah lengkap yang diperlukan untuk menjalankan program Anda bersama dengan tautan ke perpustakaan yang diperlukan.
Kiriman tidak boleh berinteraksi dengan file apa pun kecuali "f.png".
Saya tidak memiliki batas waktu pengajuan yang sulit, tapi tolong tetap relatif cepat. Saya tidak ingin skrip penilaian membutuhkan waktu berjam-jam.
./program < f.png
opsi jika bahasa tidak memiliki cara membaca file, atau bisakah kita juga menggunakannya bahkan jika bahasa dapat membaca file? (Rupanya CJam dapat membaca dari file, yang saya tidak tahu)Jawaban:
CJam,
139141Ada banyak unsintables dalam kode, jadi inilah
xxd
hexdump:Ini persis 256 byte, dengan program ini melakukan:
Jalankan program dengan perintah
Terima kasih kepada @Dennis untuk bantuan agar kiriman ini berfungsi.
sumber
xxd -r
-reversibel? Cygwin seharusnyaxxd
Python 2, Skor =
6889Solusi ini menggunakan hash dari file gambar bendera untuk membuat indeks ke daftar singkatan negara. Jika lebih dari satu bendera di-hash ke indeks, hanya singkatan pertama yang akan dikembalikan (sehingga akan gagal beberapa tes dengan lebih dari satu negara dalam ember hash). Namun algoritma ini menjamin satu jawaban yang benar untuk setiap ember hash yang tidak kosong.
Program ini adalah 247 karakter.
Versi yang lebih mudah dibaca:
Membangun string yang disandikan
Untuk membangun string yang disandikan, saya menggunakan fungsi untuk membaca file flag sebagai string, menghasilkan hash dari string, dan mengurangi hash ke sejumlah hash
buckets
:untuk mengembalikan kamus negara yang cocok dengan setiap tanda tangan, lalu gunakan beberapa kode untuk mengonversi kamus menjadi string pencarian:
Saya perlu bereksperimen sedikit dengan nilai
buckets
memberikan hasil terbaik.sumber
print'...'[...:][:2]
. Juga, mungkin tabel pencarian dengan>>
dan&
untuk beberapa kompresi dasar?i
, tetapi apakah Anda dapat menggunakan byte tambahan itu atau tidak adalah pertanyaan yang berbeda: P