Escriba un programa completo con un código fuente de 256 bytes o menos que observe la imagen de una bandera y determine de qué país es esa bandera. Un archivo zip que contiene las 196 banderas diferentes en el desafío se puede descargar desde aquí . Fuente: [ Flagpedia ]. Estas 196 imágenes de bandera son las únicas entradas que su programa tiene que manejar.
Su programa no tendrá entrada. La imagen de bandera estará en el mismo directorio que su programa y se llamará "f.png". Su programa abrirá este archivo, lo identificará e imprimirá la abreviatura de dos letras para ese país . Si usa un idioma que no puede abrir archivos, también es aceptable ejecutar su programa como ./program < f.png
.
Cada archivo de marca se denomina igual que el resultado esperado. Todas las salidas por encima de 2 letras serán ignoradas.
Aquí hay una lista de todas las salidas / nombres de archivo:
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,
Puntuación
Aquí hay un breve script de Python que usaré para calificar cada envío.
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")
Su puntaje es el número total de banderas correctamente identificadas. En caso de empate, gana la presentación anterior.
Reglas
Para mi conveniencia de prueba, se puede usar cualquier idioma con un intérprete / compilador disponible gratuitamente para Windows 10 o Ubuntu.
Las bibliotecas de procesamiento de imágenes están permitidas, pero no se permite ninguna construcción relacionada con banderas o países. ( Tos Mathematica tos )
Proporcione el comando completo necesario para ejecutar su programa junto con enlaces a las bibliotecas necesarias.
Los envíos no pueden interactuar con ningún archivo excepto "f.png".
No tengo ningún límite de tiempo difícil para las presentaciones, pero manténgalo relativamente rápido. No quiero que el guión de puntuación tome horas.
./program < f.png
opción solo si el idioma no tiene forma de leer archivos, o también podemos usarla incluso si el idioma puede leer archivos? (Aparentemente, CJam puede leer de archivos, lo que no sabía)Respuestas:
CJam,
139141Hay un montón de no imprimibles en el código, así que aquí está el
xxd
hexdump:Esto es exactamente 256 bytes, con el programa haciendo:
Ejecute el programa con el comando
Gracias a @Dennis por su ayuda para que esta presentación funcione.
fuente
xxd -r
reversible? Cygwin debería tenerxxd
Python 2, Puntuación =
6889Esta solución utiliza el hash del archivo de imagen de la bandera para crear un índice en una lista de las abreviaturas de los países. Si hay más de un indicador en hash a un índice, solo se devolverá la primera abreviatura (por lo que fallará algunas de esas pruebas con más de un país en un depósito de hash). Sin embargo, este algoritmo garantiza una respuesta correcta para cada cubo de hash no vacío.
Este programa tiene 247 caracteres.
Una versión más legible:
Construyendo la cadena codificada
Para construir la cadena codificada, utilizo una función para leer los archivos de marca como cadenas, generar un hash de la cadena y reducir el hash a un número limitado de hash
buckets
:para devolver un diccionario de países que coincidan con cada firma, luego use un código para convertir el diccionario en una cadena de búsqueda:
Necesitaba experimentar un poco con qué valores de
buckets
da los mejores resultados.fuente
print'...'[...:][:2]
. Además, ¿tal vez una tabla de búsqueda con>>
y&
para una compresión básica?i
, pero si puede o no usar esos bytes adicionales es una pregunta diferente: P