Escreva um programa completo com um código-fonte de 256 bytes ou menos que observe a imagem de uma bandeira e determine de que país é essa bandeira. Um arquivo zip contendo as 196 bandeiras diferentes no desafio pode ser baixado aqui . Fonte: [ Flagpedia ]. Essas 196 imagens de sinalizadores são as únicas entradas que seu programa precisa lidar.
Seu programa não aceita entrada. A imagem do sinalizador estará no mesmo diretório do seu programa e denominada "f.png". Seu programa abrirá esse arquivo, identificá-lo e imprimirá a abreviação de duas letras para esse país . Se você usa um idioma que não pode abrir arquivos, também é aceitável executar o seu programa como ./program < f.png
.
Cada arquivo de sinalizador é nomeado da mesma forma que a saída esperada. Toda saída acima de 2 letras será ignorada.
Aqui está uma lista de todas as saídas / nomes de arquivos:
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,
Pontuação
Aqui está um pequeno script python que usarei para pontuar cada envio.
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")
Sua pontuação é o número total de sinalizadores corretamente identificados. Em caso de empate, a finalização anterior vence.
Regras
Para minha conveniência de teste, qualquer idioma com um interpretador / compilador disponível gratuitamente para Windows 10 ou Ubuntu pode ser usado.
Bibliotecas de processamento de imagens são permitidas, mas não são permitidos quaisquer recursos internos relacionados a sinalizadores ou países. ( tosse Mathematica tosse )
Por favor, forneça o comando completo necessário para executar o seu programa, juntamente com os links para as bibliotecas necessárias.
Os envios não podem interagir com nenhum arquivo, exceto "f.png".
Não tenho limite de tempo para envios, mas mantenha-o relativamente rápido. Não quero que o script de pontuação leve horas.
./program < f.png
opção se o idioma não puder ler arquivos ou também podemos usá-lo mesmo que o idioma possa ler arquivos? (Aparentemente, o CJam pode ler arquivos, o que eu não sabia) #Respostas:
CJam,
139141Há muitos não imprimíveis no código, então aqui está o
xxd
hexdump:Isso é exatamente 256 bytes, com o programa fazendo:
Execute o programa com o comando
Agradecemos a @Dennis pela ajuda para que este envio funcione.
fonte
xxd -r
reversível? Cygwin deveria terxxd
Python 2, pontuação =
6889Esta solução usa o hash do arquivo de imagem da bandeira para criar um índice em uma lista de abreviações de países. Se mais de um sinalizador fizer hash em um índice, somente a primeira abreviação será retornada (portanto, falhará em alguns desses testes com mais de um país em um hash bucket). No entanto, esse algoritmo garante uma resposta correta para cada intervalo de hash não vazio.
Este programa tem 247 caracteres.
Uma versão mais legível:
Construindo a sequência codificada
Para criar a string codificada, eu uso uma função para ler os arquivos de flag como strings, gerar um hash a partir da string e reduzi-lo a um número limitado de hash
buckets
:para retornar um dicionário de países que correspondem a cada assinatura e use algum código para converter o dicionário em uma sequência de pesquisa:
Eu precisava experimentar um pouco com quais valores de
buckets
obtém os melhores resultados.fonte
print'...'[...:][:2]
. Além disso, talvez uma tabela de pesquisa com>>
e&
para alguma compactação básica?i
, mas se você pode ou não fazer uso desses bytes extras é uma questão diferente: P