टूल-असिस्टेड कोड गोल्फ


39

टीएएस गोल्फ

SMB1 1-1 की समाप्ति

कोड-गोल्फ ट्विस्ट के साथ टूल-असिस्टेड स्पीडरुन की शैली में , इस चुनौती का लक्ष्य NES के लिए मूल सुपर मारियो ब्रोस गेम के 1-1 भाग को अपने चुने हुए प्रोग्रामिंग लैंग्वेज में यथासंभव बाइट्स में पूरा करना है, नीचे दिए गए प्रारूप में केवल इन-गेम कंट्रोलर इनपुट का उपयोग करना। आपका कार्यक्रम इस प्रारूप में लाइनों की एक सूची के लिए आउटपुट होना चाहिए , विशेष रूप से इस चुनौती के लिए बनाया गया है:stdout

up down left right start select A B

पहले फ्रेम से शुरू होकर, प्रत्येक नईलाइन एक विशेष फ्रेम के लिए नियंत्रक 1 के इनपुट का प्रतिनिधित्व करती है। प्रति फ्रेम बटन का क्रम मायने नहीं रखता है, और उन्हें गैर-न्यूलाइन व्हाट्सएप की किसी भी राशि से अलग किया जा सकता है। सभी या कोई भी या कुछ बटन नाम प्रति पंक्ति में शामिल किए जा सकते हैं। उदाहरण के लिए, एक साधारण पायथन प्रोग्राम जो कि 3 फ्रेम के लिए डी-पैड को दबाता है और फिर प्रेस करता है ए इस तरह दिख सकता है:

for _ in range(3): print('right')
print('A')

और इसका आउटपुट (जिसे मैं सत्यापित करने के लिए अपने एमुलेटर में खिलाऊंगा) होगा:

right
right
right
A

यहाँ, हम 'सफलता' को परिभाषित करते हैं, जैसा कि ऊपर चित्र के अनुसार विश्व के अंत में ध्वज तक पहुँच रहा है। इस उदाहरण के लिए स्कोर पायथन सबमिशन, यदि यह सफल हुआ (जो यह नहीं है), 44 बाइट्स या पायथन प्रोग्राम की मूल लंबाई होगी।

एक उदाहरण काम कर रहे इनपुट फ़ाइल के लिए जो मैंने सबसे तेज TAS के आधार पर बनाई है , इस Github Gist को देखें: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c5cff58e1 नोट करें कि यह फ़ाइल पूरा खेल पूरा करती है।

सबफ़्रेम इनपुट दर्ज करने का कोई तरीका नहीं है । प्लेयर 2 के नियंत्रक में इनपुट दर्ज करने का भी कोई तरीका नहीं है, लेकिन यह भी स्तर या खेल को पूरा करने के लिए आवश्यक (या उपयोगी) नहीं होना चाहिए।

उपयोग किया गया SMB का संस्करण मूल यूएसए / जापान iNES ROM (md5sum 811b027eaf99c2def7b933c5208636de) होगा - संयुक्त राज्य अमेरिका संस्करण ठीक वैसा ही है जैसा जापानी संस्करण या तो काम करेगा, रोम आमतौर पर लेबल Super Mario Bros (JU) (PRG 0)या समान है)।

सबमिशन का परीक्षण करने के लिए, मैं प्रोग्राम stdoutचलाऊंगा, उन्हें एक input.txt फ़ाइल में पाइप करूँगा, और mario.luaइस चुनौती के लिए मेरे द्वारा लिखी गई Lua स्क्रिप्ट का उपयोग करके FCEUX में लोड करेगा :

for line in io.lines('input.txt') do
   local t = {}
   for w in line:gmatch("%S+") do
      t[w] = true;
   end;
   joypad.set(1, t);
   emu.frameadvance();
end;
while (true) do
   emu.frameadvance();
end;

मैं जिस विशिष्ट कमांड का उपयोग करूंगा वह है fceux mario.nes --loadlua mario.lua। कार्यक्रमों की कोई समय सीमा नहीं है, हालांकि उन्हें अंततः समाप्त करना होगा।

यह एक छोटा सा बैश वन-लाइनर है जिसे मैंने अपनी स्क्रिप्ट के लिए एक FCEUX मूवी (.fm2) फ़ाइल को इनपुट में बदलने के लिए बनाया है। यदि यह मदद करता है:

cat movie.fm2 | cut -d'|' -f 3 | sed 's/\.//g' | sed 's/R/right /g' | sed 's/L/left /g' | sed 's/D/down /g' | sed 's/U/up /g' | sed 's/T/start /g' | sed 's/S/select /g' | sed 's/B/B /g' | sed 's/A/A /g' | tail -n +13 > input.txt

संदर्भ के लिए, यहाँ विश्व 1-1 का पूर्ण-रिज़ॉल्यूशन मानचित्र है (पूर्ण रिज़ॉल्यूशन के लिए एक नए टैब में छवि खोलें): (स्रोत: mariouniverse.com )विश्व 1-1

नोट: पहली नज़र में, यह मेरे दिए गए input.txt फ़ाइल पर कोलमोगोरोव जटिलता चुनौती की तरह लग सकता है। हालाँकि, वास्तव में यह चुनौती इससे कहीं अधिक जटिल है क्योंकि (a) मेरे द्वारा प्रदान किया गया input.txt निश्चित रूप से सबसे कम संभव नहीं है और (b) इस प्रारूप में SMB के लिए सबसे कम संभव सेट बनाने का प्रयास कभी नहीं किया गया है। । 'सबसे कम संभव बटन' ज्ञात TAS अलग है, क्योंकि यह लंबे समय तक बटन रखने की अनुमति देता है, जो इस चुनौती में वांछित आउटपुट में लंबाई जोड़ देगा।


1
जब आपने स्तर का एक वीडियो प्रदान किया है, तो मैं यह नहीं गिन सकता कि वीडियो में कितने अधिकार हैं। क्या आप हमें आवश्यक कदम बता सकते हैं?

1
क्या आपने इसे सैंडबॉक्स में पोस्ट किया है? मुझे यह याद नहीं है।

1
मुझे लगता है कि यह काफी मजेदार है कि आपके पास 16 अपवोट्स हैं और कोई उत्तर नहीं है :)

2
@JackBates जो एक अच्छे, चुनौतीपूर्ण, गैर-तुच्छ सवाल का
संकेत है

1
404 उस पूर्ण रिज़ॉल्यूशन मैप छवि पर मुझे लगता है
लियाम

जवाबों:


20

पायथन 2, 69 48 46 44 बाइट्स

print"start\n\n"*19+(27*"A right\n"+"\n")*99

इसे यूट्यूब पर एक्शन में देखें!

इस हैप्पी स्क्रिप्ट के साथ स्वचालित रूप से (संशोधित संस्करण)

start = 18
oncycle = 21
offcycle = 4


while true do
    emu.poweron()
    -- emu.speedmode("maximum")

    starting = 0
    i = 0
    frames = 0
    last_mario_x = -1

    emu.message(start .. " " .. oncycle .. " ".. offcycle)


    state = 0
    while state ~= 6 and state ~= 11 and frames < 4000 do
        if frames > 500 and frames % 100 == 0 then
            mario_x = memory.readbyte(0x6D) * 0x100 + memory.readbyte(0x86)
            if mario_x == last_mario_x then emu.message("stuck " .. mario_x .. " " .. last_mario_x); break end
            last_mario_x = mario_x
        end

        if starting < start then
            joypad.set(1, {start=1})
            emu.frameadvance(); frames = frames + 1;
            joypad.set(1, {})
            emu.frameadvance(); frames = frames + 1;
            starting = starting + 1
        else
            if i < oncycle then
                joypad.set(1, {A=1, B=1, right=1})
                i = i + 1
            else
                joypad.set(1, {})
                i = i +  1
                if i == oncycle + offcycle then
                    i = 0
                end
            end

            emu.frameadvance()
            frames = frames + 1
        end

        state = memory.readbyte(0x000E)
        if state == 4 then
            emu.message("success!")
            os.exit()
            break
        end

    end

    if start < 30 then
        start = start + 1
    elseif offcycle < 10 then
        start = 18
        offcycle = offcycle + 1
    else
        offcycle = 1
        oncycle = oncycle + 1
    end
end

1
@ हैरी कृपया नए संस्करण को सत्यापित करें।
orlp

1
@ हेरी मैंने अभी एक और नया वर्जन जोड़ा है जो 2 और बाइट्स सेव करता है ... बी बटन का उपयोग नहीं करने के लिए! यह मुश्किल से 99 रिपीट में फिट बैठता है, लगभग 100+ रिपीट करने पर बाइट बर्बाद करना पड़ता है।
orlp

1
44-बाइट संस्करण भी पुष्टि, देखने के लिए मजेदार!
हैरी

1
आह, यह उसी तरह का उत्तर है जिसके लिए मैं जा रहा था, लेकिन मुझे सही संख्या नहीं मिल रही थी !! बहुत अच्छी तरह से किया।
लिन

1
@ हैरी यह मेरी एक रिकॉर्डिंग है: youtube.com/watch?v=2-I1EEOlQYA
orlp

5

पायथन 2, 107 बाइट्स

i=0
print'\n'*33+'start'
for c in'~~22 +  2 2? @  F        . \r0'+'@'*10:print'A B right\n'[i:]*ord(c);i^=2

बहुत प्रभावशाली और पहले से ही जितना मैंने सोचा था उससे बहुत कम! हो सकता है कि मैं पूरे खेल के बाद, हाहा के साथ फंस गया हूं। इसके अलावा, मैंने यह परीक्षण किया है और यह पुष्टि कर सकता है कि यह स्तर पूरा करता है, अगर मुझे यह रिकॉर्ड करने के लिए मिल सकता है तो शायद मैं उन सभी को YouTube वीडियो के रूप में अपलोड करूंगा!
हैरी

1

जावास्क्रिप्ट (ईएस 6), 59 वर्ण

_=>`start

`[a="repeat"](19)+(`A right
`[a](27)+`
`)[a](99)

यह orlp के उत्तर के समान टेक्स्ट को आउटपुट करता है । मैंने खुद बेहतर तरीके से आने की कोशिश की, लेकिन मैंने जिन फिल्मों को input.txtफाइल में बदला, वे हमेशा ठीक से नहीं खेल पाईं। जब भी मैंने cmd से एमुलेटर चलाने की कोशिश की, मुझे एक त्रुटि बताते हुए "an unknown error occurred"


अभी इसे मेरे अंत में नहीं चला सकते हैं, लेकिन अगर यह उसी इनपुट को आउटपुट करता है। ऑरलपी के जवाब के रूप में तो हम इसे सत्यापित कहेंगे!
हैरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.