Napisz pełny program o kodzie źródłowym 256 bajtów lub mniejszym, który patrzy na obraz flagi i określa, z jakiego kraju pochodzi ta flaga. Plik zip zawierający 196 różnych flag w wyzwaniu można pobrać tutaj . Źródło: [ Flagpedia ]. Te 196 obrazów flag to jedyne dane wejściowe, które program musi obsłużyć.
Twój program nie będzie pobierał danych. Obraz flagi będzie w tym samym katalogu co twój program i będzie miał nazwę „f.png”. Twój program otworzy ten plik, zidentyfikuje go i wydrukuje dwuliterowy skrót dla tego kraju . Jeśli używasz języka, w którym nie można otwierać plików, dopuszczalne jest również uruchamianie programu jako ./program < f.png
.
Każdy plik flagi ma taką samą nazwę jak oczekiwany wynik. Wszystkie dane wyjściowe powyżej 2 liter zostaną zignorowane.
Oto lista wszystkich wyjść / nazw plików:
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,
Punktacja
Oto krótki skrypt Pythona, którego użyję do oceny każdego zgłoszenia.
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")
Twój wynik to całkowita liczba poprawnie zidentyfikowanych flag. W przypadku remisu wygrywa wcześniejsze zgłoszenie.
Zasady
Dla mojej wygody testowania można używać dowolnego języka z swobodnie dostępnym tłumaczem / kompilatorem dla systemu Windows 10 lub Ubuntu.
Biblioteki przetwarzania obrazu są dozwolone, ale żadne wbudowane funkcje związane z flagami lub krajami nie są dozwolone. ( Kaszel Mathematica kaszel )
Podaj pełne polecenie potrzebne do uruchomienia programu wraz z linkami do niezbędnych bibliotek.
Zgłoszenia nie mogą wchodzić w interakcje z żadnym plikiem oprócz „f.png”.
Nie mam żadnych trudnych terminów składania wniosków, ale proszę zachować je stosunkowo szybko. Nie chcę, żeby skrypt oceniania zajmował godziny.
./program < f.png
opcji tylko wtedy, gdy język nie ma możliwości odczytu plików, czy możemy go również użyć, nawet jeśli język potrafi czytać pliki? (Najwyraźniej CJam potrafi czytać z plików, których nie znałem)Odpowiedzi:
CJam,
139141W kodzie jest wiele niezadrukowanych elementów, więc oto
xxd
zrzut heksowy:To dokładnie 256 bajtów, przy czym program wykonuje:
Uruchom program za pomocą polecenia
Dziękujemy @Dennis za pomoc w uruchomieniu tego zgłoszenia.
źródło
xxd -r
odwracalnym? Cygwin powinien miećxxd
Python 2, wynik =
6889To rozwiązanie wykorzystuje skrót pliku obrazu flagi, aby utworzyć indeks do listy skrótów kraju. Jeśli więcej niż jedna flaga ma skrót do indeksu, zwracany jest tylko pierwszy skrót (więc nie powiedzie się niektóre z tych testów z więcej niż jednym krajem w zasobniku mieszającym). Algorytm ten gwarantuje jednak jedną poprawną odpowiedź dla każdego niepustego segmentu mieszania.
Ten program ma 247 znaków.
Bardziej czytelna wersja:
Budowanie zakodowanego ciągu
Aby zbudować zakodowany ciąg, używam funkcji do odczytywania plików flag jako ciągów, generowania skrótu z łańcucha i redukowania skrótu do ograniczonej liczby skrótów
buckets
:aby zwrócić słownik krajów pasujących do każdego podpisu, a następnie użyj kodu do konwersji słownika na ciąg wyszukiwania:
Musiałem trochę poeksperymentować z wartościami, które
buckets
dają najlepsze wyniki.źródło
print'...'[...:][:2]
. A może tabela przeglądowa z>>
i&
dla podstawowej kompresji?i
, ale czy można skorzystać z dodatkowych bajtów, to inne pytanie: P