গুগলের হপিং বনি


16

4 ডিসেম্বর, 2017-এ, গুগল ডুডল একটি গ্রাফিকাল প্রোগ্রামিং গেম ছিল যা একটি বানির বৈশিষ্ট্যযুক্ত । পরবর্তী স্তরগুলি দুর্দান্তভাবে তুচ্ছ ছিল এবং এটিকে চ্যালেঞ্জের জন্য দুর্দান্ত প্রার্থীর মতো মনে হয়েছিল ।

বিস্তারিত

খেলা

  • চারটি উপলভ্য চলন রয়েছে: এগিয়ে এগিয়ে আসা, বাম দিকে ঘুরুন, ডানদিকে ঘুরুন এবং লুপ করুন। এই প্রতিটি পদক্ষেপের একটি টোকেন , সত্য যে এটি প্রতিটি খেলায় টাইল হয়।
  • খরগোশটি চারটি অर्थোগোনাল দিকের (যেমন উত্তর, দক্ষিণ, পূর্ব, পশ্চিম) মুখোমুখি হতে পারে।
  • খরগোশ এগিয়ে যেতে পারে (তার সামনে যে দিকের দিকে একটি বর্গক্ষেত্রটি সরাতে পারে) এবং বাম বা ডানদিকে ঘুরতে পারে।
  • লুপগুলির ভিতরে অন্যান্য লুপগুলি সহ আরও কয়েকটি চলন থাকতে পারে এবং তাদের পুনরাবৃত্তকরণের গণনাটি কোনও ধনাত্মক পূর্ণসংখ্যা (যদিও গেমটি প্রযুক্তিগতভাবে 0 এর একটি পুনরাবৃত্তি গণনাের অনুমতি দেয়)।
  • বোর্ডটি গ্রিড-প্রান্তিকৃত স্কোয়ারগুলির একটি সেট এবং বনি সংলগ্ন স্কোয়ারগুলির মধ্যে হ্যাপ করতে পারে।
  • খরগোশ শূন্যে hopুকতে পারে না। অর্থ এই যে বোর্ডটি বন্ধ করে দেওয়ার চেষ্টা করা কিছুই করে না। (এটি দৃশ্যত কিছু লোকের জন্য একটি আশ্চর্যজনক এবং অন্যদের জন্য হতাশা ছিল।)
  • স্কোয়ারগুলি চিহ্নিত বা চিহ্নযুক্ত। যখন খরগোশটি একটি স্কোয়ারে থাকে তখন এটি চিহ্নিত হয়ে যায়।
  • স্তরটি সম্পূর্ণ হয় যখন সমস্ত স্কোয়ার চিহ্নিত করা হয়।
  • আপনি ধরে নিতে পারেন কোনও সমাধান রয়েছে।

তোমার গোপন সংকেত

  • উদ্দেশ্য: একটি বোর্ড দেওয়া, এক বা একাধিক সংক্ষিপ্ত সমাধান সন্ধান করুন।
  • ইনপুটটি বোর্ড গঠনের বর্গক্ষেত্রের তালিকার একটি তালিকা (চিহ্নিত চিহ্নিত এবং চিহ্নযুক্ত স্কোয়ারগুলি পৃথক করে) এবং আউটপুটটি চলাচলের একটি তালিকা। ইনপুট এবং আউটপুট ফর্ম্যাটটি মোটেই গুরুত্বপূর্ণ নয়, যতক্ষণ না সেগুলি মানব-পঠনযোগ্য এবং বোধগম্য।
  • বিজয়ী মানদণ্ড: প্রতিটি বোর্ডের জন্য এক মিনিটের মধ্যে সংক্ষিপ্ততম সমাধানের চালগুলির সংখ্যার যোগফল। যদি আপনার প্রোগ্রামটি কোনও নির্দিষ্ট বোর্ডের জন্য সমাধান না খুঁজে পায়, তবে সেই বোর্ডের জন্য আপনার স্কোর (স্কোয়ারের 5 * সংখ্যা)।
  • দয়া করে কোনও পদ্ধতিতে হার্ডকোড সমাধান করবেন না। আপনার কোড কোনও বোর্ডকে ইনপুট হিসাবে নিতে সক্ষম হবে, কেবল নীচের উদাহরণ হিসাবে দেওয়া হয়নি।

উদাহরণ

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

Sবানির শুরুর বর্গক্ষেত্র (পূর্ব দিকে), #একটি অচিহ্নিত বর্গ এবং Oএটি একটি চিহ্নিত বর্গ। চলাফেরার জন্য, আমার স্বরলিপিটি F= হপ এগিয়ে, L= বাম দিকে ঘুরুন, R= ডান দিকে ঘুরুন, এবং LOOP(<num>){<moves>}এমন লুপকে বোঝায় যা <num>বারবার পুনরাবৃত্তি করে এবং <moves>প্রতিবার করে । লুপটি যদি কোনও ন্যূনতম সংখ্যার বাইরেও যে কোনও সংখ্যা চালাতে <num>পারে, তা বাদ দেওয়া যেতে পারে (অর্থাত্ অনন্ত কাজ করে)।

স্তর 1:

S##

মুক্তিযোদ্ধা

স্তর 2:

S##
  #
  #

লুপ (2) {FFR}

স্তর 3:

S##
# #
###

লুপ {FFR}

স্তর 4:

###
# #
##S##
  # #
  ###

লুপ {এফ লুপ ()) L এফএল}} (ডিজেএমসিমেহেমের দ্বারা পাওয়া)

স্তর 5:

#####
# # #
##S##
# # #
#####

লুপ (18) {লুপ (10) {এফআর} এল}
উত্স: রেডডিট

স্তর 6:

 ###
#OOO#
#OSO#
#OOO#
 ###

লুপ {লুপ (3) {এফ} এল

বিশাল বোর্ড: (সংক্ষিপ্ততম সমাধানগুলি বর্তমানে অজানা)

12x12:

S###########
############
############
############
############
############
############
############
############
############
############
############

স্তর 5 কিন্তু বড় উপায়:

#############
# # # # # # #
#############
# # # # # # #
#############
# # # # # # #
######S######
# # # # # # #
#############
# # # # # # #
#############
# # # # # # #
#############

আরও হোলি বোর্ড:

S##########
###########
## ## ## ##
###########
###########
## ## ## ##
###########
###########
## ## ## ##
###########
###########

এবং

S#########
##########
##  ##  ##
##  ##  ##
##########
##########
##  ##  ##
##  ##  ##
##########
##########

অবশেষে, অসমमितা বাট মধ্যে একটি বাস্তব ব্যথা হতে পারে:

#######
# ##  #
#######
###S###
# ##  #
# ##  #
#######

এবং

#########
# ##  ###
###S  ###
# #######
###    ##
#####   #
####  ###
#########
#########


"এক বা একাধিক সংক্ষিপ্ত সমাধান সন্ধান করুন" আমি ভেবেছিলাম থামানো সমস্যা এটিকে নিষিদ্ধ করে
Leaky Nun

@ লাকি নুন এটি থামানো সমস্যার সাথে সম্পর্কিত নয়। এটি একটি গ্রাফ অনুসন্ধান
হোয়াটটোডো

তবে লুপিংয়ের অনুমতি রয়েছে ...
লিকি নুন

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

উত্তর:


12

পাইথন 3, 67 টোকেন

import sys
import time

class Bunny():
    def __init__(self):
        self.direction = [0, 1]
        self.coords = [-1, -1]

    def setCoords(self, x, y):
        self.coords = [x, y]

    def rotate(self, dir):
        directions = [[1, 0], [0, 1], [-1, 0], [0, -1]]
        if dir == 'L':
            self.direction = directions[(directions.index(self.direction) + 1) % 4]
        if dir == 'R':
            self.direction = directions[(directions.index(self.direction) - 1) % 4]

    def hop(self):
        self.coords = self.nextTile()

    # Returns where the bunny is about to jump to
    def nextTile(self):
        return [self.coords[0] + self.direction[0], self.coords[1] + self.direction[1]]

class BoardState():
    def __init__(self, map):
        self.unvisited = 0
        self.map = []

        self.bunny = Bunny()
        self.hopsLeft = 0

        for x, row in enumerate(map):
            newRow = []
            for y, char in enumerate(row):
                if char == '#':
                    newRow.append(1)
                    self.unvisited += 1

                elif char == 'S':
                    newRow.append(2)

                    if -1 in self.bunny.coords:
                        self.bunny.setCoords(x, y)
                    else:
                        print("Multiple starting points found", file=sys.stderr)
                        sys.exit(1)

                elif char == ' ':
                    newRow.append(0)

                elif char == 'O':
                    newRow.append(2)

                else:
                    print("Invalid char in input", file=sys.stderr)
                    sys.exit(1)

            self.map.append(newRow)

        if -1 in self.bunny.coords:
            print("No starting point defined", file=sys.stderr)
            sys.exit(1)

    def finished(self):
        return self.unvisited == 0

    def validCoords(self, x, y):
        return -1 < x < len(self.map) and -1 < y < len(self.map[0])

    def runCom(self, com):
        if self.finished():
            return

        if self.hopsLeft < self.unvisited:
            return

        if com == 'F':
            x, y = self.bunny.nextTile()
            if self.validCoords(x, y) and self.map[x][y] != 0:
                self.bunny.hop()
                self.hopsLeft -= 1

                if (self.map[x][y] == 1):
                    self.unvisited -= 1
                self.map[x][y] = 2

        else:
            self.bunny.rotate(com)

class loop():
    def __init__(self, loops, commands):
        self.loops = loops
        self.commands = [*commands]

    def __str__(self):
        return "loop({}, {})".format(self.loops, list(self.commands))

    def __repr__(self):
        return str(self)


def rejectRedundantCode(code):
    if isSnippetRedundant(code):
        return False

    if type(code[-1]) is str:
        if code[-1] in "LR":
            return False
    else:
        if len(code[-1].commands) == 1:
            print(code)
            if code[-1].commands[-1] in "LR":
                return False

    return True


def isSnippetRedundant(code):
    joined = "".join(str(com) for com in code)

    if any(redCode in joined for redCode in ["FFF", "RL", "LR", "RRR", "LLL"]):
        return True

    for com in code:
        if type(com) is not str:
            if len(com.commands) == 1:
                if com.loops == 2:
                    return True

                if type(com.commands[0]) is not str:
                    return True

                if com.commands[0] in "LR":
                    return True

            if len(com.commands) > 1 and len(set(com.commands)) == 1:
                return True

            if isSnippetRedundant(com.commands):
                return True

    for i in range(len(code)):
        if type(code[i]) is not str and len(code[i].commands) == 1:
            if i > 0 and code[i].commands[0] == code[i-1]:
                return True
            if i < len(code) - 1 and code[i].commands[0] == code[i+1]:
                return True

        if type(code[i]) is not str:
            if i > 0 and type(code[i-1]) is not str and code[i].commands == code[i-1].commands:
                return True
            if i < len(code) - 1 and type(code[i+1]) is not str and code[i].commands == code[i+1].commands:
                return True

            if len(code[i].commands) > 3 and all(type(com) is str for com in code[i].commands):
                return True

    return False

def flatten(code):
    flat = ""
    for com in code:
        if type(com) is str:
            flat += com
        else:
            flat += flatten(com.commands) * com.loops

    return flat

def newGen(n, topLevel = True):
    maxLoops = 9
    minLoops = 2
    if n < 1:
        yield []

    if n == 1:
        yield from [["F"], ["L"], ["R"]]

    elif n == 2:
        yield from [["F", "F"], ["F", "L"], ["F", "R"], ["L", "F"], ["R", "F"]]

    elif n == 3:
        for innerCode in newGen(n - 1, False):
            for loops in range(minLoops, maxLoops):
                if len(innerCode) != 1 and 0 < innerCode.count('F') < 2:
                    yield [loop(loops, innerCode)]

        for com in "FLR":
            for suffix in newGen(n - 2, False):
                for loops in range(minLoops, maxLoops):
                    if com not in suffix:
                        yield [loop(loops, [com])] + suffix

    else:
        for innerCode in newGen(n - 1, False):
            if topLevel:
                yield [loop(17, innerCode)]
            else:
                for loops in range(minLoops, maxLoops):
                    if len(innerCode) > 1:
                        yield [loop(loops, innerCode)]

        for com in "FLR":
            for innerCode in newGen(n - 2, False):
                for loops in range(minLoops, maxLoops):
                    yield [loop(loops, innerCode)] + [com]
                    yield [com] + [loop(loops, innerCode)]

def codeLen(code):
    l = 0
    for com in code:
        l += 1
        if type(com) is not str:
            l += codeLen(com.commands)

    return l


def test(code, board):
    state = BoardState(board)
    state.hopsLeft = flatten(code).count('F')

    for com in code:
        state.runCom(com)


    return state.finished()

def testAll():
    score = 0
    for i, board in enumerate(boards):
        print("\n\nTesting board {}:".format(i + 1))
        #print('\n'.join(board),'\n')
        start = time.time()

        found = False
        tested = set()

        for maxLen in range(1, 12):
            lenCount = 0
            for code in filter(rejectRedundantCode, newGen(maxLen)):
                testCode = flatten(code)
                if testCode in tested:
                    continue

                tested.add(testCode)

                lenCount += 1
                if test(testCode, board):
                    found = True

                    stop = time.time()
                    print("{} token solution found in {} seconds".format(maxLen, stop - start))
                    print(code)
                    score += maxLen
                    break

            if found:
                break

    print("Final Score: {}".format(score))

def testOne(board):
    start = time.time()
    found = False
    tested = set()
    dupes = 0

    for maxLen in range(1, 12):
        lenCount = 0
        for code in filter(rejectRedundantCode, newGen(maxLen)):
            testCode = flatten(code)
            if testCode in tested:
                dupes += 1
                continue

            tested.add(testCode)

            lenCount += 1
            if test(testCode, board):
                found = True
                print(code)
                print("{} dupes found".format(dupes))
                break

        if found:
            break

        print("Length:\t{}\t\tCombinations:\t{}".format(maxLen, lenCount))

    stop = time.time()
    print(stop - start)

#testAll()
testOne(input().split('\n'))

এই প্রোগ্রামটি একটি একক ইনপুট বোর্ড পরীক্ষা করবে, তবে আমি এই পরীক্ষামূলক ড্রাইভারটিকে আরও দরকারী বলে মনে করি । এটি একই সময়ে প্রতিটি একক বোর্ডের পরীক্ষা করবে এবং সমাধানটি পেতে কতক্ষণ সময় নিয়েছিল তা মুদ্রণ করবে। যখন আমি আমার মেশিনে কোডটি চালনা করি (ইন্টেল আই 7-7700 কে কোয়াড কোর সিপিইউ @ 4.20 গিগাহার্টজ, 16.0 গিগাবাইট র‌্যাম), আমি নিম্নলিখিত আউটপুটটি পাই:

Testing board 1:
2 token solution found in 0.0 seconds
['F', 'F']


Testing board 2:
4 token solution found in 0.0025103092193603516 seconds
[loop(17, [loop(3, ['F']), 'R'])]


Testing board 3:
4 token solution found in 0.0010025501251220703 seconds
[loop(17, [loop(3, ['F']), 'L'])]


Testing board 4:
5 token solution found in 0.012532949447631836 seconds
[loop(17, ['F', loop(7, ['F', 'L'])])]


Testing board 5:
5 token solution found in 0.011022329330444336 seconds
[loop(17, ['F', loop(5, ['F', 'L'])])]


Testing board 6:
4 token solution found in 0.0015044212341308594 seconds
[loop(17, [loop(3, ['F']), 'L'])]


Testing board 7:
8 token solution found in 29.32585096359253 seconds
[loop(17, [loop(4, [loop(5, [loop(6, ['F']), 'L']), 'L']), 'F'])]


Testing board 8:
8 token solution found in 17.202533721923828 seconds
[loop(17, ['F', loop(7, [loop(5, [loop(4, ['F']), 'L']), 'F'])])]


Testing board 9:
6 token solution found in 0.10585856437683105 seconds
[loop(17, [loop(7, [loop(4, ['F']), 'L']), 'F'])]


Testing board 10:
6 token solution found in 0.12129759788513184 seconds
[loop(17, [loop(7, [loop(5, ['F']), 'L']), 'F'])]


Testing board 11:
7 token solution found in 4.331984758377075 seconds
[loop(17, [loop(8, ['F', loop(5, ['F', 'L'])]), 'L'])]


Testing board 12:
8 token solution found in 58.620323181152344 seconds
[loop(17, [loop(3, ['F', loop(4, [loop(3, ['F']), 'R'])]), 'L'])]

Final Score: 67

এই শেষ পরীক্ষাটি সবেমাত্র মিনিটের সীমাবদ্ধতার আওতায় পড়ে।

পটভূমি

এটি আমি দিয়েছি সবচেয়ে মজার চ্যালেঞ্জগুলির মধ্যে একটি! আমার একটি বিস্ফোরণ ধরণের শিকার ছিল এবং জিনিসগুলি হ্রাস করার জন্য হিউরিস্টিক্সের সন্ধান করছিলাম।

সাধারণত, এখানে পিপিসিজিতে আমি তুলনামূলক সহজ প্রশ্নের উত্তর দিতে ঝোঁক। আমি বিশেষত ট্যাগকে খুব পছন্দ করি কারণ এটি সাধারণত আমার ভাষার জন্য বেশ উপযুক্ত। একদিন, প্রায় দুই সপ্তাহ আগে, আমি আমার ব্যাজগুলি সন্ধান করছিলাম এবং আমি বুঝতে পারি যে আমি পুনরুদ্ধার ব্যাজটি কখনই পাইনি । তাই আমি উত্তর না দিয়ে দেখেছিকিছু আমার নজর কেড়েছে কিনা তা দেখতে ট্যাব এবং আমি এই প্রশ্নটি পেয়েছি। আমি সিদ্ধান্ত নিয়েছি যে আমি ব্যয় না করে এর জবাব দেব। এটি যেটুকু ভেবেছিল তার চেয়ে কিছুটা শক্ত হয়ে শেষ হয়েছিল, তবে শেষ পর্যন্ত আমার কাছে এমন একটি নিষ্ঠুর-জবাব পাওয়া গেল যা আমি বলতে পারি যে আমি গর্বিত। তবে এই চ্যালেঞ্জটি আমার পক্ষে পুরোপুরি আদর্শের বাইরে, কারণ আমি সাধারণত একক উত্তরের জন্য এক ঘণ্টার বেশি সময় ব্যয় করি না। এই উত্তরটি আমাকে 2 সপ্তাহের বেশি সময় নিয়েছে এবং অবশেষে এই পর্যায়ে পৌঁছাতে কমপক্ষে 10+ কাজ লেগেছে, যদিও আমি সতর্কতার সাথে নজর রাখছি না।

প্রথম পুনরাবৃত্তিটি একটি খাঁটি উদ্দীপনা সমাধান ছিল। দৈর্ঘ্য N পর্যন্ত সমস্ত স্নিপেট তৈরি করতে আমি নিম্নলিখিত কোডটি ব্যবহার করেছি :

def generateCodeLenN(n, maxLoopComs, maxLoops, allowRedundant = False):
    if n < 1:
        return []

    if n == 1:
        return [["F"], ["L"], ["R"]]

    results = []

    if 1:
        for com in "FLR":
            for suffix in generateCodeLenN(n - 1, maxLoopComs, maxLoops, allowRedundant):
                if allowRedundant or not isSnippetRedundant([com] + suffix):
                    results.append([com] + suffix)

    for loopCount in range(2, maxLoopComs):
        for loopComs in range(1, n):
            for innerCode in generateCodeLenN(loopComs, maxLoopComs, maxLoops - 1, allowRedundant):
                if not allowRedundant and isSnippetRedundant([loop(loopCount, innerCode)]):
                    continue

                for suffix in generateCodeLenN(n - loopComs - 1, maxLoopComs, maxLoops - 1, allowRedundant):
                    if not allowRedundant and isSnippetRedundant([loop(loopCount, innerCode)] + suffix):
                        continue

                    results.append([loop(loopCount, innerCode)] + suffix)

                if loopComs == n - 1:
                    results.append([loop(loopCount, innerCode)])

    return results

এই মুহুর্তে, আমি নিশ্চিত ছিলাম যে প্রতিটি সম্ভাব্য উত্তরের পরীক্ষা করা খুব ধীর হয়ে যাবে, তাই আমি isSnippetRedundantসংক্ষিপ্ত স্নিপেটের সাহায্যে লিখিত হতে পারে এমন স্নিপেটগুলি ফিল্টার করতাম । উদাহরণস্বরূপ, আমি স্নিপেটটি উত্পাদন করতে অস্বীকার করব ["F", "F", "F"]কারণ সঠিক একই প্রভাবগুলি অর্জন করা যেতে পারে [Loop(3, ["F"]), সুতরাং এটি যদি আমরা দৈর্ঘ্য -3 স্নিপেট পরীক্ষা করি এমন স্থানে পৌঁছে যাই তবে আমরা জানি যে কোনও দৈর্ঘ্য -3 স্নিপেট বর্তমান বোর্ডকে সমাধান করতে পারে না। এটি অনেক ভাল স্মৃতিবিজ্ঞান ব্যবহার করেছে, তবে শেষ পর্যন্ত ছিল ওয়ায়ায়েঅত্যন্ত ধীর. টেস্টকেস 12 এই পদ্ধতিটি ব্যবহার করে মাত্র 3,000 সেকেন্ডের বেশি সময় নিয়েছে। এটি পরিষ্কারভাবে উল্লেখযোগ্যভাবে খুব ধীর। তবে প্রতিটি বোর্ডের সংক্ষিপ্ত সমাধানের জন্য এই তথ্য এবং কম্পিউটার চক্রের একগুচ্ছ ব্যবহার করে আমি একটি নতুন প্যাটার্ন খুঁজে পেতে পারি। আমি লক্ষ্য করেছি যে প্রাপ্ত প্রায় প্রতিটি সমাধানই সাধারণত নিম্নলিখিতগুলির মতো দেখায়:

[<com> loop(n, []) <com>]

বেশ কয়েকটি স্তর গভীর নীচে বাসা বেঁধেছে, প্রতিটি পক্ষের একক কমগুলি alচ্ছিক। এর অর্থ এই যে সমাধানগুলি:

["F", "F", "R", "F", "F", "L", "R", "F", "L"]

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

def codeGen(n):
    if n == 1:
        yield each [<com>]

    if n == 2:
        yield each [<com>, <com>]

    if n == 3:
        yield each [loop(n, <com length 2>]
        yield each [loop(n, <com>), <com>]

    else:
        yield each [loop(n, <com length n-1>)]
        yield each [loop(n, <com length n-2>), <com>]
        yield each [<com>, loop(n, <com length n-2>)]

        # Removed later
        # yield each [<com>, loop(n, <com length n-3>), <com>]
        # yield each [<com>, <com>, loop(n, <com length n-3>)]
        # yield each [loop(n, <com length n-3>), <com>, <com>]

এটি দীর্ঘতম পরীক্ষার কেসকে 140 সেকেন্ডে কেটে ফেলেছে, এটি একটি হাস্যকর উন্নতি। তবে এখান থেকে আমার এখনও উন্নত করার জন্য প্রয়োজনীয় কিছু জিনিস ছিল। আমি আরও আক্রমণাত্মকভাবে অপ্রয়োজনীয় / মূল্যহীন কোডগুলি ফিল্টার আউট এবং কোডটি আগে পরীক্ষা করা হয়েছে কিনা তা পরীক্ষা করতে শুরু করেছি। এটি এটি আরও কেটে ফেলেছিল, তবে এটি যথেষ্ট ছিল না। শেষ অবধি, চূড়ান্ত যে অংশটি অনুপস্থিত তা হ'ল লুপ কাউন্টার। আমার অত্যন্ত উন্নত অ্যালগরিদমের মাধ্যমে (পড়ুন: এলোমেলো ট্রায়াল এবং ত্রুটি ) আমি নির্ধারণ করেছি যে লুপগুলিকে চালুর অনুমতি দেওয়ার জন্য সর্বোত্তম পরিসরটি [3-8]। তবে সেখানে একটি বিশাল উন্নতি রয়েছে: আমরা যদি জানি যে [loop(8, [loop(8, ['F', loop(5, ['F', 'L'])]), 'L'])]আমাদের বোর্ডটি সমাধান করতে পারে না, তবে এর উপায় নেই[loop(3, [loop(8, ['F', loop(5, ['F', 'L'])]), 'L'])]বা 3-7 এর যে কোনও লুপ গণনা এটি সমাধান করতে পারে। সুতরাং 3-8 থেকে সমস্ত লুপের আকারের মাধ্যমে পুনরাবৃত্তি না করে, আমরা বাহ্যিক লুপের উপরে লুপের গণনাটি সর্বাধিকতে সেট করি। এটি maxLoop - minLoopএই ক্ষেত্রে 6 বা 6 এর একটি ফ্যাক্টর দ্বারা অনুসন্ধানের স্থানটি কাটা শেষ করবে ।

এটি অনেক সাহায্য করেছিল, তবে স্কোর বাড়িয়ে দিয়েছিল। ব্রুটি ফোর্সের মাধ্যমে আমি আগে পেয়েছি এমন কয়েকটি সমাধানের জন্য বড় লুপ সংখ্যার প্রয়োজন হয় (উদাহরণস্বরূপ, বোর্ড 4 এবং 6)। সুতরাং বাহ্যিক লুপের গণনাটি 8 এ সেট করার পরিবর্তে আমরা বাহ্যিক লুপের গণনা 17 এ সেট করেছিলাম, একটি জাদুকরী সংখ্যাও আমার অত্যন্ত উন্নত অ্যালগরিদম দ্বারা গণনা করা হয়েছে। আমরা জানি আমরা এটি করতে পারি কারণ বহিরাগততম লুপের লুপ সংখ্যা বাড়ানো সমাধানের বৈধতার উপর কোনও প্রভাব ফেলে না। এই পদক্ষেপটি আসলে আমাদের চূড়ান্ত স্কোরকে 13 দ্বারা হ্রাস করেছে। তাই তুচ্ছ পদক্ষেপ নয়।

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