2048 এর নিখুঁত খেলা খেলুন


18

আপনার কাজটি 2048 সালের গাণিতিকভাবে নিখুঁত গেমটি অনুকরণ করা। ধারণাটি হ'ল 2048 গেমটি কতদূর যেতে পারে তাত্ত্বিক upperর্ধ্ব সীমাটি সন্ধান করতে হবে এবং সেখানে কীভাবে পৌঁছতে হবে find

এটি দেখতে কেমন তা সম্পর্কে ধারণা পেতে এই 2x2 ক্লোনটি নিয়ে খেলুন এবং 68 পয়েন্ট অর্জন করার চেষ্টা করুন। যদি আপনি এটি করেন তবে আপনার 2, 4, 8 এবং 16 টাইল শেষ হবে। এই পয়েন্টটি পেরিয়ে যাওয়া অসম্ভব।

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

আপনাকে অবশ্যই এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা কোনও 2048 বোর্ডকে ইনপুট হিসাবে গ্রহণ করে এবং টাইলস ভেঙে ফেলার পরে স্পাউড টাইল এবং বোর্ডের সাথে বোর্ডকে আউটপুট দেয়। উদাহরণ স্বরূপ:

Input:
-------
0 0 0 0
0 0 0 0
0 0 0 0
0 0 8 8

Output:
-------
0 0 0 0
0 0 0 0
0 0 0 0
0 4 8 8

0 0 0 0
0 0 0 0
0 0 0 0
0 0 4 16

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

আপনার অবশ্যই অবশ্যই আইনী পদক্ষেপগুলি আউটপুট করতে হবে। কেবল একটি 2 বা 4 তৈরি করা যেতে পারে, আপনাকে নড়াচড়া করতে হবে বা নড়াচড়া করতে হবে অন্তত একটি টাইল ইত্যাদি collapse

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

বিজয়ী হবেন তিনি বোর্ডে সর্বাধিক টাইলসের সমাপ্তি দিয়ে সোর্স কোডের সর্বনিম্ন সংখ্যক বাইট দ্বারা গেমটি শেষ করবেন। আসল গেম থেকে স্কোরিং বিবেচনায় নেওয়া হবে না। (ইঙ্গিত: ব্যবহার 4)


এই টুইটটি প্রশ্ন থেকে আলাদা। এই প্রশ্নটি আপনার নিজস্ব টাইলস তৈরি করতে দেয় এবং গাণিতিকভাবে সম্ভব প্রায় 2048
কেন্ডল ফ্রে

1
@TheDoctor 68 2 ক্ষমতা একটি সমষ্টি, এবং কি আপনার স্কোর যদি আপনি পেতে হবে 2, 4, 8, 16
user12205

2
এটি কি আসলেই একটি সদৃশ? এটিকে আলাদা করতে আরও কী লাগবে?
কেন্ডাল ফ্রে

1
@ কুইনকুনস এটি যদিও একটি সাবঅপটিমাল গেম তৈরি করবে।
কেন্ডাল ফ্রে

4
আমি এই চ্যালেঞ্জটির হৃদয়টি খুঁজে পেয়েছি, "একটি অনুকূল সমাধান সন্ধান করুন" অনন্য হতে, তবে স্বীকার করেছেন যে এটি একটি নকল "শেল" এ এটি বন্ধ করে দেওয়া একটি দুর্বল পছন্দ ছিল। এটি একটি চিৎকার করে বলে, "ওহ দেখো, আরও একটি 2048 কোড গল্ফ চ্যালেঞ্জ।" নিকটতম ভোট এতটা সাবজেক্টিভ হওয়ায় আপনাকে সত্যই আপনার চ্যালেঞ্জ ভিড়ের কাছে বিক্রি করতে হবে। কখনও কখনও এর অর্থ 2048 এর নিজস্ব ভয়াবহ ফিরফ উত্পন্ন করা।
রেইনবোল্ট

উত্তর:


4

রুবি, কর্নারে প্রবেশ, স্কোর: 3340

এটি বন্ধ করার জন্য এখানে একটি খুব সাধারণ কৌশল। আমার কাছে (কাছাকাছি) নিখুঁত স্কোরের জন্য ধারণা আছে তবে এটিকে আনুষ্ঠানিকভাবে আনতে আমার সমস্যা হচ্ছে, তাই জিনিসগুলি চালিয়ে যাওয়ার জন্য এখানে সহজ কিছু।

def slide board, dir
    case dir
    when 'U'
        i0 = 0
        i_stride = 1
        i_dist = 4
    when 'D'
        i0 = 15
        i_stride = -1
        i_dist = -4
    when 'L'
        i0 = 0
        i_stride = 4
        i_dist = 1
    when 'R'
        i0 = 15
        i_stride = -4
        i_dist = -1
    end

    4.times do |x|
        column = []
        top_merged = false
        4.times do |y|
            tile = board[i0 + x*i_stride + y*i_dist]
            next if tile == 0
            if top_merged || tile != column.last
                column.push tile
                top_merged = false
            else
                column[-1] *= 2
                top_merged = true
            end
        end

        4.times do |y|
            board[i0 + x*i_stride + y*i_dist] = column[y] || 0
        end
    end

    board
end

def advance board
    if board.reduce(:*) > 0
        return board, board
    end

    16.times do |i|
        if board[15-i] == 0
            board[15-i] = 4
            break
        end
    end

    spawned = board.clone

    # Attention, dirty dirty hand-tweaked edge cases to avoid
    # the inevitable for a bit longer. NSFS!
    if board[11] == 8 && (board[12..15] == [32, 16, 4, 4] ||
                          board[12..15] == [16, 16, 4, 4] && board[8..10] == [256,64,32]) || 
       board[11] == 16 && (board[12..15] == [32, 8, 4, 4] || 
                           board[12..15] == [4, 32, 8, 8] || 
                           board[12..15] == [4, 32, 0, 4])

        dir = 'R'
    elsif board[11] == 16 && board[12..15] == [4, 4, 32, 4] ||
          board[11] == 8 && board[12..15] == [0, 4, 32, 8]
        dir = 'U'
    else
        dir = (board.reduce(:+)/4).even? ? 'U' : 'L'
    end

    board = slide(board, dir)

    if board == spawned
        dir = dir == 'U' ? 'L' : 'U'
        board = slide(board, dir)
    end
    return spawned, board
end

advanceফাংশন কেউ আপনার চাইছে। এটি 1 ডি অ্যারের হিসাবে একটি বোর্ড নেয় এবং টাইলটি তৈরি হওয়ার পরে এবং সরানো হওয়ার পরে বোর্ডটি ফিরিয়ে দেয়।

আপনি এই স্নিপেট দিয়ে এটি পরীক্ষা করতে পারেন

board = [0]*16
loop do
    spawned, board = advance(board)
    board.each_slice(4) {|row| puts row*' '}
    puts
    break if board[15] > 0
end

puts "Score: #{board.reduce :+}"

কৌশল খুব সহজ, এবং এক আমি আসলে যখন আমি 2048 নিজেকে খেলে গেল 128 থেকে এড়িয়ে যেতে ব্যবহার করা হয়: শুধু মধ্যে বিকল্প আপ এবং বাম । যতক্ষণ সম্ভব এই কাজটি করতে, 4নীচের ডানদিকে কোণায় নতুন গুলি তৈরি করা হয়েছে।

সম্পাদনা: আমি শেষের ঠিক আগে নির্দিষ্ট পদক্ষেপে কয়েকবার যাওয়ার জন্য একটি হার্ড কোডিং স্যুইচ যুক্ত করেছি, যা আসলে আমাকে 1024 এ পৌঁছাতে দেয় This যদিও এটি কিছুটা হাতছাড়া হয়ে যাচ্ছে, তাই আমি এই মুহূর্তে থামিয়ে দেব এবং আগামীকাল একটি সাধারণ উন্নত পদ্ধতির কথা চিন্তা করুন। (সত্যি বলতে কী, আমি হ্যান্ড-টিকড হ্যাকগুলি যোগ করে 4 এর ফ্যাক্টর দ্বারা আমার স্কোর বাড়িয়ে দিতে পারি তা কেবল আমাকে বলে যে আমার কৌশলটি বাজে is

এটিই আপনার শেষ বোর্ড

1024 512 256 128
 512 256 128  16
 256 128  64   8
   8  32   8   4

কেবল নিটপিকের জন্য, 4 এর স্প্যানিং আপনাকে সর্বোত্তম স্কোর দেয় না কারণ আপনি প্রতিবার 2 2 এর দ্বারা উত্পন্ন হওয়ার বিপরীতে প্রতিবার 4 পয়েন্ট অর্জন করছেন না।
ব্রুনোজে

@ ব্রুনোজে এই চ্যালেঞ্জের জন্য স্কোরটি সমস্ত টাইলের মোট হিসাবে কেবল গণনা করা হয়, আসল খেলায় আপনার যে স্কোরটি থাকে তা নয়। তবে যদি এটি হয় তবে আপনি অবশ্যই ঠিক আছেন। ;) ... যদিও আমি আমার কৌশলটি দিয়ে মনে করি এটি কোনও তাত্পর্যপূর্ণ করবে না, কারণ আমি তখন 256 এর পরিবর্তে 128 এ পৌঁছাতে পারি।
মার্টিন ইন্ডার

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