สนุกกับธง!


20

เขียนโปรแกรมเต็มรูปแบบที่มีซอร์สโค้ดขนาด 256 ไบต์หรือน้อยกว่าซึ่งดูที่รูปธงและกำหนดประเทศที่ตั้งค่าสถานะ ไฟล์ ZIP ที่มีธงที่แตกต่างกัน 196 ในความท้าทายสามารถดาวน์โหลดได้จากที่นี่ แหล่งที่มา: [ Flagpedia ] รูปภาพธง 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")

คะแนนของคุณคือจำนวนธงทั้งหมดที่ระบุไว้อย่างถูกต้อง ในกรณีที่เสมอกันการส่งก่อนหน้านี้จะชนะ

กฎระเบียบ

  • เพื่อความสะดวกในการทดสอบฉันสามารถใช้ภาษาใดก็ได้ที่มีล่าม / คอมไพเลอร์สำหรับ Windows 10 หรือ Ubuntu ฟรี

  • อนุญาตให้ใช้ไลบรารีการประมวลผลภาพ แต่ไม่อนุญาตให้มีตัวสร้างภายในที่เกี่ยวข้องกับธงหรือประเทศ ( ไอ Mathematica ไอ )

  • โปรดระบุคำสั่งเต็มรูปแบบที่จำเป็นในการเรียกใช้โปรแกรมของคุณพร้อมกับลิงก์ไปยังไลบรารีที่จำเป็น

  • สิ่งที่ส่งมาอาจไม่สามารถโต้ตอบกับไฟล์ใด ๆ ยกเว้น "f.png"

  • ฉันไม่มีข้อ จำกัด เรื่องเวลาในการส่งงาน แต่โปรดช่วยให้มันค่อนข้างเร็ว ฉันไม่ต้องการให้สคริปต์ให้คะแนนใช้เวลาหลายชั่วโมง


4
ขีด จำกัด ไบต์ต่ำจริง ๆ เพียงเก็บรหัสสองตัวที่ไม่ได้บีบอัดจำนวน 196 ตัวต้องใช้ 392 ไบต์
edc65

2
@ edc65 ประเด็นก็คือคุณจะได้รับธงจำนวนเล็กน้อยเท่านั้น
isaacg

1
@ edc65 ฉันตั้งใจเลือกหมายเลขที่จะให้คะแนนที่สมบูรณ์แบบของ 196 เป็นไปไม่ได้โดยทั่วไป มันเพิ่มเติมเกี่ยวกับการบีบอัดของการจดจำรูปภาพแล้ว codegolf
DJMcMayhem

เพียงตรวจสอบสองครั้ง - เราจะใช้./program < f.pngตัวเลือกได้หรือไม่ถ้าภาษาไม่มีวิธีอ่านไฟล์หรือเราสามารถใช้มันได้แม้ว่าภาษาจะอ่านไฟล์ได้หรือไม่? (เห็นได้ชัดว่า CJam สามารถอ่านได้จากไฟล์ซึ่งฉันไม่รู้)
Sp3000

เหล่านี้ 196 ภาพธงเป็นเพียงปัจจัยการผลิตโปรแกรมของคุณมีการจัดการแล้วคุณบอกว่าโปรแกรมของคุณจะใช้เวลาไม่ป้อนข้อมูล หมายความว่าไฟล์หนึ่งไฟล์ f.png จะเป็นหนึ่งใน 196 ตัวนั้นดังนั้นโปรแกรมไม่สามารถอ้างอิงไฟล์ซิปเหล่านั้นได้? เพียงแค่ f.png
แมตต์

คำตอบ:


11

CJam, 139 141

มีจำนวนของ unprintables ในรหัสดังนั้นนี่คือxxdhexdump:

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

ขอบคุณ @Dennis สำหรับความช่วยเหลือในการทำให้การส่งนี้เป็นผล


ฉันประหลาดใจที่ทุกคนมีจำนวนมากนี้ 139/196 = 70.9% คุณคัดเกรด A!
เลเวลริเวอร์

คุณสามารถทำให้ไบนารีดัมพ์เป็นxxd -r-reversible ได้หรือไม่? Cygwin ควรมีxxd
cat

1
@tac ต้องแหย่หน่อย แต่ฉันก็ไม่รู้ว่า Cygwin มี - ฉันต้องเลือกมันเองสำหรับการติดตั้ง ฉันจะอัปเดตเมื่อฉันอัปเดตคำตอบต่อไป
Sp3000

ฉันพยายามใช้เทคนิคเดียวกับรหัสมอร์สแต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ 129 ธงและฉันยังไม่ได้ตรวจสอบว่าเหมาะสมกับขีด จำกัด 256 ไบต์หรือไม่ ทำได้ดีมากสำหรับการค้นหาแฮชที่ดี
Peter Taylor

12

Python 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ให้ผลลัพธ์ที่ดีที่สุด


นี่เป็นเพียงการใช้สีเฉลี่ยของธงหรือไม่
Ashwin Gupta

@AshwinGupta โปรแกรมอ่านไฟล์แล้วใช้แฮชของมัน หมายเลขแฮชขนาดใหญ่นี้จะถูกลดขนาดไปที่ดัชนีในรายการสตริงโดยใช้ตัวดำเนินการโมดูโล
Logic Knight

1
ถ้าไม่แน่ใจว่ามันจะช่วย print'...'[...:][:2]แต่คุณสามารถทำได้ นอกจากนี้อาจเป็นตารางการค้นหาด้วย>>และ&สำหรับการบีบอัดพื้นฐานบางอย่าง?
Sp3000

@ Sp3000 แนวคิดดัชนีคู่ดูน่าสนใจ แต่ฉันไม่เห็นว่าจะบันทึกไบต์ใดที่นี่ ฉันไม่ได้พิจารณาฟังก์ชั่นการจัดการบิตสำหรับการบีบอัด แต่อาจให้ประโยชน์ hmmmm
Logic Knight

1
การจัดทำดัชนีสองครั้งจะช่วยประหยัด 3 ไบต์เนื่องจากคุณไม่จำเป็นต้องบันทึกตัวแปรiแต่คุณสามารถใช้ประโยชน์จากไบต์พิเศษเหล่านั้นได้หรือไม่คำถามอื่น: P
Sp3000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.