Écrivez un programme complet avec un code source de 256 octets ou moins qui examine une image d'un drapeau et détermine de quel pays provient ce drapeau. Un fichier zip contenant les 196 drapeaux différents du défi peut être téléchargé à partir d' ici . Source: [ Flagpedia ]. Ces 196 images de drapeau sont les seules entrées que votre programme doit gérer.
Votre programme ne prendra aucune entrée. L'image du drapeau sera dans le même répertoire que votre programme et nommée "f.png". Votre programme ouvrira ce fichier, l'identifiera et imprimera l' abréviation à deux lettres de ce pays . Si vous utilisez une langue qui ne peut pas ouvrir de fichiers, il est également acceptable d'exécuter votre programme sous ./program < f.png
.
Chaque fichier indicateur est nommé de la même manière que la sortie attendue. Toute sortie supérieure à 2 lettres sera ignorée.
Voici une liste de toutes les sorties / noms de fichiers:
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,
Notation
Voici un court script python que je vais utiliser pour noter chaque soumission.
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")
Votre score est le nombre total de drapeaux correctement identifiés. En cas d'égalité, la soumission précédente l'emporte.
Règles
Pour mon confort de test, n'importe quelle langue avec un interprète / compilateur disponible gratuitement pour Windows 10 ou Ubuntu peut être utilisée.
Les bibliothèques de traitement d'image sont autorisées, mais toutes les extensions liées aux drapeaux ou aux pays ne sont pas autorisées. ( toux Mathematica toux )
Veuillez fournir la commande complète nécessaire pour exécuter votre programme ainsi que des liens vers les bibliothèques nécessaires.
Les soumissions ne peuvent interagir avec aucun fichier à l'exception de "f.png".
Je n'ai pas de limite de temps pour les soumissions, mais veuillez la garder relativement rapide. Je ne veux pas que le script de notation prenne des heures.
./program < f.png
option uniquement si la langue n'a aucun moyen de lire les fichiers, ou pouvons-nous également l'utiliser même si la langue peut lire les fichiers? (Apparemment, CJam peut lire des fichiers, que je ne connaissais pas)Réponses:
CJam,
139141Il y a beaucoup d'imprimables dans le code, voici donc l'
xxd
hexdump:C'est exactement 256 octets, le programme faisant:
Exécutez le programme avec la commande
Merci à @Dennis pour son aide à faire fonctionner cette soumission.
la source
xxd -r
fichier réversible? Cygwin devrait avoirxxd
Python 2, Score =
6889Cette solution utilise le hachage du fichier image de drapeau pour créer un index dans une liste des abréviations de pays. Si plusieurs drapeaux sont hachés sur un index, seule la première abréviation sera renvoyée (ainsi, certains de ces tests échoueront avec plus d'un pays dans un compartiment de hachage). Cet algorithme garantit cependant une réponse correcte pour chaque compartiment de hachage non vide.
Ce programme contient 247 caractères.
Une version plus lisible:
Construire la chaîne encodée
Pour construire la chaîne encodée, j'utilise une fonction pour lire les fichiers d'indicateurs sous forme de chaînes, générer un hachage à partir de la chaîne et réduire le hachage à un nombre limité de hachage
buckets
:pour renvoyer un dictionnaire des pays qui correspondent à chaque signature, puis utilisez du code pour convertir le dictionnaire en chaîne de recherche:
J'avais besoin d'expérimenter un peu avec quelles valeurs de
buckets
donne les meilleurs résultats.la source
print'...'[...:][:2]
. Aussi, peut-être une table de recherche avec>>
et&
pour une compression de base?i
, mais si vous pouvez ou non utiliser ces octets supplémentaires est une question différente: P