সরঞ্জাম-সহিত কোড গল্ফ


39

টিএএস গল্ফ

এসএমবি 1 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

এখানে, আমরা উপরের চিত্রের 1-1-এর শেষে পতাকাটিতে পৌঁছানোর হিসাবে 'সাফল্য' সংজ্ঞায়িত করেছি। উদাহরণস্বরূপ পাইথন জমা দেওয়ার স্কোর যদি এটি সফল হয় (যা এটি না ঘটে), 44 বাইট বা পাইথন প্রোগ্রামের মূল দৈর্ঘ্য হবে।

বর্তমানের দ্রুততম টিএএসের ভিত্তিতে আমি তৈরি করা ইনপুট ফাইলের উদাহরণের জন্য , এই গিথুব গিস্টটি দেখুন: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 নোট করুন যে এই ফাইলটি পুরো গেমটি সম্পূর্ণ করেছে tes

সাবফ্রেম ইনপুট প্রবেশের কোনও উপায় নেই । প্লেয়ার 2 এর নিয়ামকের ইনপুট প্রবেশের কোনও উপায় নেই তবে স্তর বা গেমটি শেষ করার জন্য এটি প্রয়োজনীয় (বা দরকারী )ও হওয়া উচিত নয়।

ব্যবহৃত এসএমবি এর সংস্করণটি মূল মার্কিন যুক্তরাষ্ট্র / জাপান আইএনইএস রম হবে (এমডি 5sum 811b027eaf99c2def7b933c5208636de - ইউএসএ সংস্করণটি জাপানি সংস্করণের সাথে হুবহু হ'ল হয় কাজ করবে, রমটি সাধারণত লেবেলযুক্ত Super Mario Bros (JU) (PRG 0)বা অনুরূপ)।

stdoutসাবমিশনগুলি পরীক্ষা করার জন্য, আমি প্রোগ্রামগুলি চালাব, তাদের একটি ইনপুট.টিএসটি ফাইলের মধ্যে পাইপ করব , এবং mario.luaএই চ্যালেঞ্জের জন্য আমি যে লুয়া স্ক্রিপ্টটি লিখেছিলাম তা ব্যবহার করে এফসিইউএক্স এ লোড করব :

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

দ্রষ্টব্য: প্রথম নজরে, এটি আমার প্রদত্ত ইনপুট.টিএসটি ফাইলের উপর কোলমোগোরভ জটিলতার চ্যালেঞ্জ বলে মনে হতে পারে। তবে, বাস্তবে চ্যালেঞ্জটি এর চেয়ে জটিলতর কারণ (ক) আমি সরবরাহ করা ইনপুট.টিএসটি অবশ্যই খুব কমতম সম্ভব নয় এবং (খ) এই ফর্ম্যাটে এসএমবি-র জন্য সবচেয়ে কম কিপ্রেসের সংক্ষিপ্ততম সেট তৈরি করার চেষ্টা করা হয়নি never । টিএএস-এর পরিচিত 'কয়েকটি সম্ভাব্য বোতামগুলি আলাদা' কারণ এটি দীর্ঘ সময়ের জন্য বোতামগুলি ধরে রাখার অনুমতি দেয় যা এই চ্যালেঞ্জের মধ্যে কাঙ্ক্ষিত আউটপুটটির দৈর্ঘ্য যোগ করবে।


1
আপনি স্তরের ভিডিও সরবরাহ করার সময়, ভিডিওতে কতগুলি অধিকার রয়েছে তা আমি গণনা করতে পারি না। আপনি কি আমাদের প্রয়োজনীয় চালগুলি বলতে পারেন?

1
আপনি কি এটি স্যান্ডবক্সে পোস্ট করেছেন? মনে নেই।

1
আমি মনে করি এটি আপনার কাছে 16 টি উচ্চতর উত্তর এবং কোনও উত্তর নেই বলে মজাদার :)

2
@ জ্যাকবেটস এটি একটি ভাল, চ্যালেঞ্জজং, অ-তুচ্ছ প্রশ্নটির চিহ্ন
ফ্লিপট্যাক

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+ পুনরাবৃত্তি করার জন্য একটি বাইট নষ্ট করতে হয়েছিল।
অরল্প

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

আমি ভেবেছি তার চেয়ে খুব চিত্তাকর্ষক এবং ইতিমধ্যে অনেক খাটো! হ্যাঁ, পুরোপুরি আমার সাথে পুরো খেলাটি আটকে রাখা উচিত। এছাড়াও আমি এটি পরীক্ষা করেছি এবং নিশ্চিত করতে পারি যে এটি স্তরটি সম্পূর্ণ করে, যদি আমি এটি রেকর্ড করতে পারি তবে আমি সেগুলি ইউটিউব ভিডিও হিসাবে আপলোড করব!
হ্যারি

1

জাভাস্ক্রিপ্ট (ES6), 59 টি অক্ষর

_=>`start

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

এটি orlp এর উত্তরের মতো একই পাঠ্যকে আউটপুট করে । আমি নিজে একটি আরও ভাল পদ্ধতি নিয়ে আসার চেষ্টা করেছি, তবে যে মুভিগুলিকে আমি একটি input.txtফাইলে রূপান্তর করেছি সেগুলি সবসময় সঠিকভাবে চলেনি। আমি যখনই সেন্টিমিটার থেকে এমুলেটরটি চালানোর চেষ্টা করেছি, তখন আমি একটি ত্রুটি জানিয়েছিলাম "an unknown error occurred"


এখনই এটি আমার শেষের দিকে চালানো যাবে না, তবে এটি যদি orlp এর উত্তরের মতো একই ইনপুটটিও করে দেয় t তবে আমরা একে যাচাই করব!
হ্যারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.