পতাকা সহ মজা!


20

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, 

স্কোরিং

এখানে একটি সংক্ষিপ্ত অজগর স্ক্রিপ্ট যা আমি প্রতিটি জমাটি স্কোর করতে ব্যবহার করব।

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")

আপনার স্কোরটি সঠিকভাবে চিহ্নিত চিহ্নিত পতাকাগুলির মোট সংখ্যা। টাই করার ক্ষেত্রে পূর্বের জমাটি জয়ী হয়।

বিধি

  • আমার পরীক্ষার সুবিধার জন্য, উইন্ডোজ 10 বা উবুন্টুর জন্য অবাধে উপলব্ধ দোভাষী / সংকলক সহ যে কোনও ভাষা ব্যবহার করা যেতে পারে।

  • চিত্র প্রক্রিয়াকরণ লাইব্রেরি অনুমোদিত, কিন্তু পতাকা বা দেশ সম্পর্কিত কোনও বিল্টইন অনুমোদিত নয়। ( কাশি ম্যাথমেটিকা কাশি )

  • কোনও প্রয়োজনীয় লাইব্রেরির লিঙ্কের সাথে আপনার প্রোগ্রামটি চালনার জন্য প্রয়োজনীয় পূর্ণ কমান্ড সরবরাহ করুন।

  • জমাগুলি "f.png" ব্যতীত অন্য কোনও ফাইলের সাথে ইন্টারঅ্যাক্ট করতে পারে না।

  • জমা দেওয়ার ক্ষেত্রে আমার কাছে কোনও কঠিন সময়সীমা নেই, তবে দয়া করে এটি তুলনামূলক দ্রুত রাখুন। আমি স্কোরিং স্ক্রিপ্টটি কয়েক ঘন্টা নিতে চাই না।


4
বাইট সীমাটি আসলেই কম। কেবল 196 দ্বি-বর্ণের কোডগুলি
সঙ্কলিতভাবে

2
@ edc65 কথাটি হ'ল আপনি কেবল কয়েকটি সংখ্যক পতাকা পেতে যাচ্ছেন।
isaacg ২

1
@ edc65 আমি ইচ্ছাকৃতভাবে এমন একটি সংখ্যা বাছাই করেছি যা 196 এর নিখুঁত স্কোরকে মূলত অসম্ভব করে তুলবে। এটি কোডগল্ফের পরে চিত্রগুলি সনাক্ত করার সংক্ষেপণ সম্পর্কে আরও বেশি।
ডিজেএমসিএমহেম

শুধু ডাবল চেকিং - ./program < f.pngভাষাটি যদি ফাইলগুলি পড়ার কোনও উপায় না থাকে তবে আমরা কেবলমাত্র সেই বিকল্পটি ব্যবহার করতে পারি , অথবা আমরা ভাষাটি ফাইল পড়তে পারি এমনকি এটিও ব্যবহার করতে পারি? (দৃশ্যত সিজেএম ফাইলগুলি থেকে পড়তে পারে, যা আমি জানতাম না)
Sp3000

এই 196 ফ্ল্যাগ চিত্রগুলি হ'ল আপনার প্রোগ্রামটি হ্যান্ডেল করার জন্য কেবলমাত্র ইনপুটস তখন আপনি বলবেন আপনার প্রোগ্রামটি কোনও ইনপুট নেবে না । তার মানে কি এই যে এক ফাইল f.png সেই 196 এর মধ্যে একটি হবে? সুতরাং প্রোগ্রামটি এই জিপ করা ফাইলগুলিকে উল্লেখ করতে পারে না? Just f.png
ম্যাট

উত্তর:


11

সিজেম, 139 141

xxdকোডটিতে প্রচুর অপরিশোধিত রয়েছে , সুতরাং এখানে হেক্সডাম্প রয়েছে:

00000000: 7132 3925 3162 226d cec5 9635 b14b 69ee  q29%1b"m...5.Ki.
00000010: d9d0 66e8 97b8 e88d 2366 7857 9595 1c73  ..f.....#fxW...s
00000020: 9324 11b2 ddb8 7a3f 19ed bd37 07c0 cb86  .$....z?...7....
00000030: 394e b34a ecf0 8c9b f300 a216 2e2e 594a  9N.J..........YJ
00000040: 9a6b 3b2f 250a 9a25 783b 0e49 3e9c 6ab9  .k;/%..%x;.I>.j.
00000050: 8d6d d729 42d0 85f3 657b 7d86 af48 c6cb  .m.)B...e{}..H..
00000060: f7ff 980f b81c dd5e e8cb 4e34 d8ec edca  .......^..N4....
00000070: 6646 1b4d 7605 8937 ed58 2302 1cc1 ebfd  fF.Mv..7.X#.....
00000080: 16d3 b53e 3e2c d879 fe33 feef dd65 d49f  ...>>,.y.3...e..
00000090: 5d73 7ced 92e6 9526 c186 00bf d2a8 ffaa  ]s|....&........
000000a0: 65a0 3001 f42a 94d7 592f ebe7 8bdf 97a7  e.0..*..Y/......
000000b0: 0681 8ee1 9e0e 424b f6a1 4c50 1c8a 8de5  ......BK..LP....
000000c0: 481a 388c 6eaa 0c43 e1db 69df 567b 323f  H.8.n..C..i.V{2?
000000d0: 2573 c4ce b348 6fff 37e0 55b4 7c9a 7e7d  %s...Ho.7.U.|.~}
000000e0: 73a4 ef74 2b99 b765 2a2d d99f 986a 355c  s..t+..e*-...j5\
000000f0: db22 3236 3362 3236 6227 6166 2b32 2f3d  ."263b26b'af+2/=

এটি হ'ল 256 বাইট, প্রোগ্রামটি সহ:

q29%                          Read input and keep every 29th char
    1b                        Sum code points
      "..."                   Push long string
           263b               Convert long string to base 263
               26b            Convert result to base 26
                  'af+        Add 'a to each element in the resulting array
                      2/      Split into chunks of length 2
                        =     Index sum cyclically to extract output

কমান্ড দিয়ে প্রোগ্রামটি চালান

java -Dfile.encoding=ISO-8859-1 -jar cjam-0.6.5.jar flags.cjam < f.png

এই জমাটি কাজ করতে সহায়তার জন্য @ ডেনিসকে ধন্যবাদ।


আমি অবাক হয়েছি যে কেউ এই অনেক পেয়েছে। 139/196 = 70.9%। আপনি একটি গ্রেড স্ক্র্যাপ করেছেন!
স্তর নদী সেন্ট

আপনি কি বাইনারি xxd -rডাম্পকে পুনরায় পরিবর্তনযোগ্য করে তুলতে পারবেন? সাইগউইনের থাকা উচিতxxd
বিড়াল

1
@ ট্যাককে কিছুটা ঝুঁকতে হয়েছিল, তবে আমি বুঝতে পারি নি যে সাইগউইন এটি পেয়েছিল - আমাকে কেবল এটি ইনস্টলেশন করার জন্য নিজেই নির্বাচন করতে হয়েছিল। আমি পরবর্তী আপডেটটি আপডেট করার সময় এটি আপডেট করব।
Sp3000

আমি মোর্স কোডের মতো একই কৌশলটি ব্যবহার করার চেষ্টা করেছি, তবে আমি সবচেয়ে ভালভাবে 129 টি পতাকা পেতে সক্ষম হয়েছি এবং এটি এমনকি 256-বাইট সীমাতে ফিট কিনা তাও আমি পরীক্ষা করে দেখিনি have এত ভাল হ্যাশ সন্ধান করার জন্য ভাল হয়েছে।
পিটার টেলর

12

পাইথন 2, স্কোর = 68 89

এই দ্রষ্টব্যটি দেশের সংক্ষিপ্তসারগুলির একটি তালিকাতে একটি সূচক তৈরি করতে পতাকা চিত্র ফাইলের হ্যাশ ব্যবহার করে। যদি একটি সূচকে একাধিক পতাকা হ্যাশ করে তবে কেবল প্রথম সংক্ষিপ্তসার ফিরে আসবে (সুতরাং এটি হ্যাশ বালতিতে একাধিক দেশের সাথে পরীক্ষাগুলির মধ্যে কিছুতে ব্যর্থ হবে)। এই অ্যালগরিদম তবে খালি খালি প্রতিটি হ্যাশ বালতির জন্য একটি সঠিক উত্তরের গ্যারান্টি দেয়।

i=hash(open('f.png').read())%99*2
print'kgmviruasefridusvakpsmbtgrpwcdsdauninrsyalsg--game--espyscmtyebhgqom--kh--inhudjbw--ltroilbicv--jonaugke--svhtbg--simcknbnpelcplgncmmacimytnttlytgcflirsvemhtzuyqaerbfbepa--uzaenearcl--jmbbphkzrwieet'[i:i+2]

এই প্রোগ্রামটি 247 অক্ষর।

আরও পঠনযোগ্য সংস্করণ:

encoded = 'kgmviruasefridusvakpsmbtgrpwcdsdauninrsyalsg--game--espyscmtyebhgqom--kh--inhudjbw--ltroilbicv--jonaugke--svhtbg--simcknbnpelcplgncmmacimytnttlytgcflirsvemhtzuyqaerbfbepa--uzaenearcl--jmbbphkzrwieet'
index = hash(open('f.png').read())%99 * 2
print encoded[index : index+2]

এনকোডযুক্ত স্ট্রিং তৈরি করা হচ্ছে

এনকোডযুক্ত স্ট্রিংটি তৈরি করতে, আমি ফ্ল্যাগ ফাইলগুলিকে স্ট্রিং হিসাবে পড়তে, স্ট্রিং থেকে একটি হ্যাশ তৈরি করতে এবং হ্যাশকে সীমিত সংখ্যায় হ্যাশ হ্রাস করে buckets:

def encode(buckets):
    lookup = {}
    for fn in os.listdir('flags'):
        name = fn[:2]
        signature = hash(open('flags/'+fn).read()) % buckets
        lookup[signature] = lookup.get(signature, '')+name
    return lookup

প্রতিটি স্বাক্ষরের সাথে মেলে এমন দেশগুলির একটি অভিধান ফেরত দিতে, তারপরে অভিধানটিকে একটি স্ট্রিংয়ে রূপান্তর করতে কিছু কোড ব্যবহার করুন:

encoded = ''.join(lookup.get(v, '--')[:2] for v in range(buckets))

আমার কিছুটা পরীক্ষা করা দরকার যার সাথে মানগুলি bucketsসেরা ফলাফল দেয়।


এটি কি কেবল পতাকার গড় রঙ নিচ্ছে?
আশ্বিন গুপ্ত

অশ্বিনগুপ্ত @ প্রোগ্রামটি ফাইলটিতে পড়ে তার একটি হ্যাশ নেয়। এই বড় হ্যাশ নম্বরটি একটি মডুলো অপারেটর ব্যবহার করে স্ট্রিং তালিকার একটি সূচকে হ্রাস করা হয়।
লজিক নাইট

1
এটি সাহায্য করবে কিনা তা নিশ্চিত নয় তবে আপনি এটি করতে পারেন print'...'[...:][:2]। এছাড়াও, কিছু মৌলিক সংকোচনের সাথে >>এবং সম্ভবত কোনও সারণী &?
Sp3000

@ এসপি 3000, ডাবল ইনডেক্স ধারণাটি আকর্ষণীয় দেখায় তবে আমি দেখতে পাচ্ছি না যে এখানে কোনও বাইট সংরক্ষণ করতে পারে। আমি সংক্ষেপণের জন্য বিট ম্যানিপুলেশন ফাংশনগুলি বিবেচনা করি নি, তবে এটি একটি সুবিধা দিতে পারে। Hmmmm।
লজিক নাইট

1
ডাবল ইনডেক্সিং 3 বাইট সাশ্রয় করে কারণ আপনার কোনও ভেরিয়েবলে সংরক্ষণ করার দরকার নেই i, তবে আপনি এই অতিরিক্ত বাইটগুলি ব্যবহার করতে পারবেন কিনা তা ভিন্ন প্রশ্ন: পি
স্প 3000
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.