Напишите полную программу с исходным кодом размером 256 байт или менее, которая просматривает изображение флага и определяет, из какой страны этот флаг. Почтовый файл, содержащий 196 различных флагов в соревновании, можно скачать здесь . Источник: [ Флагпедия ]. Эти 196 изображений флагов - единственные входы, которые должна обрабатывать ваша программа.
Ваша программа не будет принимать никаких данных. Изображение флага будет находиться в том же каталоге, что и ваша программа, и будет называться «f.png». Ваша программа откроет этот файл, определит его и напечатает двухбуквенное сокращение для этой страны . Если вы используете язык, который не может открывать файлы, также допустимо запускать вашу программу как ./program < f.png
.
Каждый файл флага называется так же, как ожидаемый результат. Весь вывод выше 2 букв будет игнорироваться.
Вот список всех выходных файлов / имен файлов:
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,
счет
Вот короткий скрипт на python, который я буду использовать для оценки каждого представления.
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")
Ваша оценка - это общее количество правильно определенных флагов. В случае ничьей побеждает более раннее представление.
правила
Для удобства тестирования можно использовать любой язык со свободно доступным интерпретатором / компилятором для Windows 10 или Ubuntu.
Библиотеки обработки изображений разрешены, но любые встроенные функции, связанные с флагами или странами, не допускаются. ( кашель Mathematica кашель )
Пожалуйста, предоставьте полную команду, необходимую для запуска вашей программы, а также ссылки на любые необходимые библиотеки.
Материалы не могут взаимодействовать с каким-либо файлом, кроме "f.png".
У меня нет жестких временных ограничений на подачу заявок, но, пожалуйста, держите их относительно быстро. Я не хочу, чтобы сценарий выигрыша занимал часы.
./program < f.png
опцию, только если язык не может читать файлы, или мы можем использовать ее, даже если язык может читать файлы? (Очевидно, CJam может читать из файлов, которые я не знал)Ответы:
CJam,
139141В коде много непечатаемых элементов, поэтому вот
xxd
hexdump:Это ровно 256 байт, при этом программа делает:
Запустите программу с помощью команды
Спасибо @Dennis за помощь в получении этой работы.
источник
xxd -r
обратимым? Cygwin должен иметьxxd
Python 2, оценка =
6889Это решение использует хэш файла изображения флага для создания индекса в списке сокращений стран. Если к индексу хэшируется более одного флага, будет возвращена только первая аббревиатура (так что некоторые из этих тестов не пройдут, если в хэш-памяти находится более одной страны). Этот алгоритм, тем не менее, гарантирует один правильный ответ для каждого непустого блока хэша.
Эта программа 247 символов.
Более читаемая версия:
Построение закодированной строки
Чтобы построить закодированную строку, я использую функцию для чтения в файлах флагов как строк, генерирования хеша из строки и уменьшения хеша до ограниченного числа хешей
buckets
:чтобы вернуть словарь стран, которые соответствуют каждой подписи, затем используйте некоторый код для преобразования словаря в строку поиска:
Мне нужно было немного поэкспериментировать с тем, какие значения
buckets
дают лучшие результаты.источник
print'...'[...:][:2]
. Кроме того, может быть таблица поиска с>>
и&
для некоторого базового сжатия?i
, но можете ли вы использовать эти дополнительные байты - это другой вопрос: P