গ্রিড চালিয়ে!


11

সারসংক্ষেপ

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

গ্রিড কীভাবে কাজ করে তা এখানে:

আপনি ৪ টি দিকে এগিয়ে যেতে পারেন: উত্তর, দক্ষিণ, পূর্ব বা পশ্চিম। একবার আপনি কোনও ঘর থেকে সরিয়ে নেওয়ার পরে, আপনাকে আবার সেই ঘরে ফিরে যেতে দেওয়া হবে না (এত কার্যকরভাবে এটি মানচিত্রটি মুছে ফেলা হয়েছে)।

একটি "কাউন্টার", যা যায় 1234567890(তাই এটা থেকে যায় 1কাছে 2... সমস্ত পথে 9, তারপর 0ফিরে তারপর 1আবার), যা প্রত্যেক সময় আপনি স্থানান্তর পরিবর্তন।

আপনার কাছে একটি "মান" রয়েছে, যা 0 থেকে শুরু হয়।

একবার আপনি যে কোনও দিকে চলে যান, আপনি কোন দিকে চলেছেন তার উপর নির্ভর করে একটি গাণিতিক ক্রিয়াকলাপ ঘটে:

  • উত্তর: আপনার মান কাউন্টার ( value += counter) দ্বারা বৃদ্ধি পেয়েছে ।
  • পূর্ব: আপনার মান কাউন্টার ( value -= counter) দ্বারা হ্রাস পেয়েছে ।
  • দক্ষিণ: আপনার মান কাউন্টার ( value *= counter) দ্বারা গুণিত হয়েছে ।
  • পশ্চিম: আপনার মান কাউন্টার ( value /= counter) দ্বারা বিভক্ত ।
    • বিভাগটি পূর্ণসংখ্যা বিভাগ, তাই 5/2 -> 2
    • আপনাকে দ্বারা ভাগ করার অনুমতি নেই 0

উদাহরণ:

বটটি 3 বার উত্তর দিকে চলে গেলে:

  • প্রথম "উত্তর" পদক্ষেপটি কাউন্টারকে বাড়িয়ে তোলে 1এবং মানটিতে যোগ করে (যা এখন 1)।
  • দ্বিতীয় "উত্তর" পদক্ষেপটি কাউন্টারকে বাড়িয়ে তোলে 2এবং মানটিতে যোগ করে (যা এখন 3)।
  • তৃতীয় "উত্তর" পদক্ষেপটি কাউন্টারকে বাড়িয়ে তোলে 3এবং মানটিতে যোগ করে (যা এখন 6)।

চূড়ান্ত মান হয় 6

উত্তর, তারপর আবার দক্ষিণে সরান:

  • প্রথম "উত্তর" পদক্ষেপটি কাউন্টারকে বাড়িয়ে তোলে 1এবং মানটিতে যোগ করে (যা এখন 1)।
  • দ্বিতীয় "দক্ষিণ" সরানোর ত্রুটি, কারণ বটটি যে ঘরটি এগিয়ে যাওয়ার চেষ্টা করছে সেটিকে মুছে ফেলা হয়েছে (প্রথম চাল থেকে)।

কোনও চূড়ান্ত মান নেই, কারণ বটটি ভুল হয়েছে।

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল কোনও প্রোগ্রাম লেখার সময়, যখন কোনও নম্বর দেওয়া হয়, বটটি প্রবেশের জন্য উপযুক্ত দিকনির্দেশ দেয় যাতে বটের চূড়ান্ত মানটি সেই সংখ্যার সমান হয়।

সুতরাং সংখ্যাটি যদি হয় তবে তার 6একটি বৈধ সমাধান হবে:

nnn

(বটটি টানা 3 বার উত্তর দিকে চলে যায়)।

আপনার পরীক্ষার মানগুলি হ'ল:

49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553

(এটি 1 থেকে 1 বিলিয়ন পর্যন্ত 50 টি এলোমেলো সংখ্যা are)

আপনার স্কোর হ'ল সমস্ত 50 টি সংখ্যার জন্য মোট চালগুলি - যত কম চালগুলি তত ভাল। টাই করার ক্ষেত্রে, যে ব্যক্তি তাদের কোডটি আগে জমা দিয়েছিল সে জয়ী হয়।

চশমা

  • আপনি ইনপুট জন্য একটি ইতিবাচক পূর্ণসংখ্যা প্রাপ্ত নিশ্চিত।
  • আপনার valueপরিবর্তনশীল আপনার উত্পন্ন পাথের জন্য কোনও পর্যায়ে 2^31-1বা উপরে যেতে হবে না -2^31
  • আপনার চূড়ান্ত প্রোগ্রাম অবশ্যই একটি উত্তরে ফিট করতে হবে (সুতরাং, < 30,000বাইট)।
  • আপনি কেবল হার্ড-কোড 10 নম্বর পেতে পারেন।
  • আপনার প্রোগ্রামটি কোনও পরীক্ষার ক্ষেত্রে যুক্তিসঙ্গত ল্যাপটপে 5 মিনিটের মধ্যে চলতে হবে।
  • প্রতিটি সংখ্যার জন্য প্রোগ্রামটি চালানোর সময় ফলাফলগুলি একই রকম হতে হবে।

এটি কি পারমাণবিক-কোড-গল্ফের পরিবর্তে কোড-চ্যালেঞ্জ হওয়া উচিত নয়? আপনি জমা দেওয়া প্রোগ্রামের আকার দ্বারা স্কোর করছেন না, এমনকি টাই-ব্রেকার হিসাবেও নয়, আপনি আউটপুটটির আকার দ্বারা স্কোর করছেন, এটি এটিকে একটি অ্যালগরিদমিক চ্যালেঞ্জ করে তোলে এবং কোনও কোড গল্ফের সমস্যা নয়।
মেরিনাস

@মারিনাস ফিক্সড আমি ভেবেছিলাম পারমাণবিক কোড গল্ফ প্রোগ্রামটির জন্য ছিল - আমি অবশ্যই বিভ্রান্ত হয়ে পড়েছি।
ক্লিমেজিক

1
এটি সম্ভব হওয়ার কোনও প্রমাণ আছে কি?
ধ্বংসাত্মক লেবু

1
১. আমি মনে করি আপনার একটি বিধি যুক্ত করা উচিত যা স্পেশাল এক্স এবং একটি টাইম ফ্রেম ওয়াইযুক্ত কম্পিউটারে সাবমিশনগুলি চালিত হতে হবে the বর্তমান উত্তরগুলির মধ্যে একটি একটি নিখুঁত স্কোর দাবি করে, তবে আমি সন্দেহ করি যে এটি আসলে এটি গণনা করতে পারে। ২. আপনাকে উপরের মানগুলি গণনা করার অনুমতি নেই [...] যা ভেরিয়েবলকে বোঝায় value, হ্যাঁ? কমপক্ষে আমার কাছে, এটি বাস্তবায়নের উপর আরোপিত কোনও বিধিনিষেধের মতো মনে হচ্ছে, আসল অ্যালগরিদম নয়।
ডেনিস

@ ডেনিস আপনি কি মনে করেন যে 50 টি পরীক্ষার ক্ষেত্রে 10 মিনিটই যথেষ্ট?
clismique

উত্তর:


3

সি ++: স্কোর = 453,324,048

ঠিক আছে, এটি পুনরায় কাজ করতে কিছু সময় প্রয়োজন, তবে আমি এটি সমাধান করার উপায় এখানে।

সমাধান স্থান অধ্যয়ন করার পরে, আমি স্থির করেছিলাম যে আমার কৌশলটি হবে:

  1. লক্ষ্য সংখ্যার কাছাকাছি যাওয়ার জন্য দক্ষিণ পদক্ষেপগুলি ব্যবহার করে
    1. যদি লক্ষ্যটি ইতিবাচক হয় তবে এই পথটি অনুসরণ করুন: nnnesssssessssssss
    2. যদি লক্ষ্যটি নেতিবাচক হয় তবে এই পথটি অনুসরণ করুন: esssssssseessssss গ। যদি লক্ষ্যটি 0 থেকে 20 এর মধ্যে হয় তবে এটি "পুরানো ফ্যাশন পথ" সমাধান করুন (আমরা যতক্ষণ না পৌঁছাচ্ছি ততবার সম্ভাব্য পথের উপর ট্রেইল এবং ত্রুটি)।
    3. একবার আমাদের "সেরা স্থান" হয়ে গেলে ("ওভার" না দিয়ে লক্ষ্যের কাছাকাছি পৌঁছান), আমরা 2 বা 3 দ্বারা গুণ করে আরও কাছে যেতে সক্ষম হতে পারি; সুতরাং 0 থেকে 9 পদক্ষেপের পূর্ব দিকে যান এবং তারপরে দক্ষিণে এক ধাপ। সেই পথটি রাখুন যা আমাদের লক্ষ্যটির সবচেয়ে নিকটতম হয়।
    4. "রান" উত্তর বা পূর্বদিকে ততক্ষণ আমরা লক্ষ্যমাত্রার 45 পয়েন্টের মধ্যে আছি (প্রতি 10 ধাপে উত্তরে, স্কোরের 45 পয়েন্ট যুক্ত করুন, প্রতি 10 ধাপ পূর্বে, স্কোরকে 45 দ্বারা হ্রাস করবে)।
  2. আমরা লক্ষ্যটির 10 পয়েন্টের মধ্যে রয়েছি না কেন একই দিকে আরও কয়েকটি পদক্ষেপ নিন
  3. এই জায়গা থেকে "পুরানো ফ্যাশন উপায়" করুন, এটি এখন এত কঠিন হওয়া উচিত নয়।

এখানে আমার ফলাফল: মোট স্কোর 453324048

এবং পথগুলি:

  0) to reach   49445094, it takes   1311037 steps, by doing: nnnesssssesssssseeeeese(n *     1311010)enen
  1) to reach   71259604, it takes   1320313 steps, by doing: nnnesssssesssssseeeeeese(n *     1320280)nnnnnneee
  2) to reach   78284689, it takes   1956998 steps, by doing: nnnesssssesssssseeeeeees(e *     1956970)eeee
  3) to reach  163586986, it takes   2483885 steps, by doing: nnnesssssessssssse(n *     2483860)nnnnnnn
  4) to reach  171769219, it takes   4302163 steps, by doing: nnnesssssessssssse(n *     4302130)nnnnnnnnnnennnn
  5) to reach  211267178, it takes  13079485 steps, by doing: nnnesssssessssssse(n *    13079460)nnnnnen
  6) to reach  222235492, it takes  15516886 steps, by doing: nnnesssssessssssse(n *    15516860)nnnnnnnn
  7) to reach  249062828, it takes  12390325 steps, by doing: nnnesssssessssssseeees(e *    12390290)eeeeenenneene
  8) to reach  252588742, it takes  11606785 steps, by doing: nnnesssssessssssseeees(e *    11606760)een
  9) to reach  263068669, it takes   9277915 steps, by doing: nnnesssssessssssseeees(e *     9277880)eeeeenennneee
 10) to reach  265657839, it takes   8702543 steps, by doing: nnnesssssessssssseeees(e *     8702510)eeeeenennee
 11) to reach  328787447, it takes   5326312 steps, by doing: nnnesssssessssssseeeese(n *     5326280)nnnnennnn
 12) to reach  344081398, it takes   8724966 steps, by doing: nnnesssssessssssseeeese(n *     8724940)enn
 13) to reach  363100288, it takes  12951386 steps, by doing: nnnesssssessssssseeeese(n *    12951360)enn
 14) to reach  363644732, it takes  13072373 steps, by doing: nnnesssssessssssseeeese(n *    13072340)nnnnnnnnen
 15) to reach  372642304, it takes  15071833 steps, by doing: nnnesssssessssssseeeese(n *    15071800)nnnnnnnenn
 16) to reach  374776630, it takes  15546133 steps, by doing: nnnesssssessssssseeeese(n *    15546100)nnnnnenene
 17) to reach  377945535, it takes  16250331 steps, by doing: nnnesssssessssssseeeese(n *    16250300)nnnnennn
 18) to reach  407245889, it takes  11107325 steps, by doing: nnnesssssessssssseeeees(e *    11107300)ne
 19) to reach  467229432, it takes   2222403 steps, by doing: nnnesssssessssssseeeeese(n *     2222370)nnnnnnnee
 20) to reach  480714605, it takes   5219109 steps, by doing: nnnesssssessssssseeeeese(n *     5219080)neenn
 21) to reach  491955034, it takes   7716983 steps, by doing: nnnesssssessssssseeeeese(n *     7716950)nnnnennnn
 22) to reach  522126455, it takes  14421745 steps, by doing: nnnesssssessssssseeeeese(n *    14421710)nnnnnneneee
 23) to reach  532351066, it takes  16693875 steps, by doing: nnnesssssessssssseeeeese(n *    16693850)n
 24) to reach  542740616, it takes  14866179 steps, by doing: nnnesssssessssssseeeeees(e *    14866150)eeeen
 25) to reach  560336635, it takes  10955953 steps, by doing: nnnesssssessssssseeeeees(e *    10955920)eeeeennen
 26) to reach  563636122, it takes  10222731 steps, by doing: nnnesssssessssssseeeeees(e *    10222700)eeeeene
 27) to reach  606291383, it takes    743785 steps, by doing: nnnesssssessssssseeeeees(e *      743760)e
 28) to reach  621761054, it takes   2693968 steps, by doing: nnnesssssessssssseeeeeese(n *     2693940)nnn
 29) to reach  648274119, it takes   8585761 steps, by doing: nnnesssssessssssseeeeeese(n *     8585730)nnnnnn
 30) to reach  738259135, it takes   5286413 steps, by doing: nnnesssssessssssseeeeeees(e *     5286380)eeneneee
 31) to reach  738287367, it takes   5280141 steps, by doing: nnnesssssessssssseeeeeees(e *     5280110)nneenn
 32) to reach  748624287, it takes   2983042 steps, by doing: nnnesssssessssssseeeeeees(e *     2983010)eeeenee
 33) to reach  753996071, it takes   1789313 steps, by doing: nnnesssssessssssseeeeeees(e *     1789280)eeeennee
 34) to reach  788868538, it takes   5960183 steps, by doing: nnnesssssessssssseeeeeeese(n *     5960150)nnenene
 35) to reach  801184363, it takes   8697033 steps, by doing: nnnesssssessssssseeeeeeese(n *     8697000)nnenene
 36) to reach  807723631, it takes  10150197 steps, by doing: nnnesssssessssssseeeeeeese(n *    10150170)n
 37) to reach  824127368, it takes  13795475 steps, by doing: nnnesssssessssssseeeeeeese(n *    13795440)nnnnnnnne
 38) to reach  824182796, it takes  13807795 steps, by doing: nnnesssssessssssseeeeeeese(n *    13807760)nnnnnenee
 39) to reach  833123975, it takes  15794722 steps, by doing: nnnesssssessssssseeeeeeese(n *    15794690)nennnn
 40) to reach  849666906, it takes  14397917 steps, by doing: nnnesssssessssssseeeeeeees(e *    14397880)eeeeeeeenee
 41) to reach  854952292, it takes  13223389 steps, by doing: nnnesssssessssssseeeeeeees(e *    13223350)eeeeeeeeneeen
 42) to reach  879834610, it takes   7693981 steps, by doing: nnnesssssessssssseeeeeeees(e *     7693950)eeenn
 43) to reach  890418072, it takes   5342102 steps, by doing: nnnesssssessssssseeeeeeees(e *     5342070)eeennn
 44) to reach  917604533, it takes    699395 steps, by doing: nnnesssssessssssseeeeeeeese(n *      699360)nnnneene
 45) to reach  932425141, it takes   3992863 steps, by doing: nnnesssssessssssseeeeeeeese(n *     3992830)nennnn
 46) to reach  956158605, it takes   9266963 steps, by doing: nnnesssssessssssseeeeeeeese(n *     9266930)nnnnen
 47) to reach  957816726, it takes   9635434 steps, by doing: nnnesssssessssssseeeeeeeese(n *     9635400)nnnennn
 48) to reach  981534928, it takes  14906145 steps, by doing: nnnesssssessssssseeeeeeeese(n *    14906110)nnnnnnnn
 49) to reach  987717553, it takes  16280059 steps, by doing: nnnesssssessssssseeeeeeeese(n *    16280030)nn

আমি নিশ্চিত যে কিছু ক্লিভার "দক্ষিণ / পশ্চিম" চাল (4 দ্বারা বিভাজক এবং 5 দ্বারা গুণমান; উদাহরণস্বরূপ) এর মাধ্যমে উন্নতি করার উপায় আছে; তবে এটিকে কোডিং করা এবং নিশ্চিত হওয়া যে আপনি কোলে নেমেছেন না বা আটকা পড়েছেন না তা জটিল y

আর একটি সমাধানের পথ হতে পারে লক্ষ্য থেকে কোনও "যুক্তিসঙ্গত" সংখ্যায় ফিরে যাওয়ার চেষ্টা করা এবং তারপরে কেবল সেই ছোট সংখ্যার পথ খুঁজে পাওয়া; তবে আপনাকে এটি ঠিক "লক্ষ্য" করতে হবে, যাতে পদক্ষেপের সংখ্যাটি মেলে। কৌশলযুক্ত, তবে এটি সমাধানের সেরা উপায় হতে পারে।

যাইহোক, এখানে আমার কোড কোডটি রয়েছে:

#include <stdio.h>
#include <vector>
#include <queue>;

using namespace std;

long long upperLimit;
long long lowerLimit;
bool bDebugInfo = false;
//bool bDebugInfo = true;

//  a point struct (x and y)
struct point
{
    int x;
    int y;

    point():x(0),y(0)
    {
    }

    bool operator ==(const point& other)
    {
        return (x==other.x) && (y==other.y);
    }

    void ApplyDirection(char direction)
    {
        switch (direction)
        {
        case 'n':
            y++;
            break;
        case 'w':
            x--;
            break;
        case 'e':
            x++;
            break;
        case 's':
            y--;
            break;
        }
    }
};

// each state is of this formate
struct botState
{
    int nStep;
    long long number;
    vector<char> path;

    botState()
        :nStep(0),
        number(0)
    {
    }

    botState* clone()
    {
        botState* tmp = new botState();
        tmp->nStep = nStep;
        tmp->number = number;
        tmp->path = path;
        return tmp;
    }

    void clone(botState* other)
    {
        nStep = other->nStep;
        number = other->number;
        path = other->path;
    }

};

bool changeNumberWithDirection(long long &number, char direction, int step)
{
    switch (direction)
    {
    case 'n':
        number += (step%10);
        break;
    case 'w':
        if (step%10)
            number /= (step%10);
        else
            return false;
        break;
    case 'e':
        number -= (step%10);
        break;
    case 's':
        number *= (step%10);
        break;

    default:
        return false;
    }

    return true;
}

bool tryToAddStep(queue<botState*>& queueOfStates, const botState* pState, char direction, char cStarDirection)
{
    botState* pTmpState;
    long long newNumber;
    int newStep = pState->nStep+1;

    newNumber = pState->number;
    if (!changeNumberWithDirection(newNumber, direction, newStep))
        return false;

    if (newNumber > upperLimit)
        return false;

    if (newNumber < lowerLimit)
        return false;

    if ((newNumber == 0) && (newStep%10 == 0))
        return false;                // no need to return back to 0 after 10 or more steps, we already have better ways to do this.

    // build the x,y points of the path up to this point
    point tmpPoint;
    vector<point> pointsInPath;
    pointsInPath.push_back(tmpPoint);

    for (int i=0; i<pState->path.size(); i++)
    {
        if (pState->path.at(i) == '*')
        {
            for (int j=0; j<100; j++)
            {
                tmpPoint.ApplyDirection(cStarDirection);
                pointsInPath.push_back(tmpPoint);
            }
        }
        else
        {
            tmpPoint.ApplyDirection(pState->path.at(i));
            pointsInPath.push_back(tmpPoint);
        }
    }

    tmpPoint.ApplyDirection(direction);

    // check for over lap
    for (int i=0; i<pointsInPath.size(); i++)
    {
        if (tmpPoint == (pointsInPath.at(i)))
            return false;
    }

    pTmpState = new botState();
    pTmpState->nStep = newStep;
    pTmpState->number= newNumber;
    pTmpState->path  = pState->path;

    pTmpState->path.push_back(direction);

    queueOfStates.push(pTmpState);

    return true;
}

bool isBetterNum(long long newNum, long long oldBest, long long target)
{
    long long newDiff = (newNum  > target) ? newNum  - target : target - newNum ;
    long long oldDiff = (oldBest > target) ? oldBest - target : target - oldBest;

    return (newDiff < oldDiff);
}

bool tryToJumpDown(long long num, botState* pState, int& nTimes)
{
    // if where the bot is, we have a clear path to go as far east as we could ever want, we can just do as many sets of eeeeeeeeee (e*10) as needed, til we are close enough to the target
    point tmpPoint;
    vector<point> pointsInPath;
    pointsInPath.push_back(tmpPoint);

    for (int i=0; i<pState->nStep; i++)
    {
        tmpPoint.ApplyDirection(pState->path.at(i));
        pointsInPath.push_back(tmpPoint);
    }

    for (int i=0; i<pointsInPath.size(); i++)
    {
        if ((pointsInPath.at(i).x > tmpPoint.x) && (pointsInPath.at(i).y == tmpPoint.y))
            return false;  // we have a point blocking our path up!
    }

    long long tmpTimes = (pState->number - num)/45;
    if ((tmpTimes>1) && (tmpTimes<upperLimit))
    {
        tmpTimes--;
        tmpTimes*=10;
        nTimes = (int)tmpTimes;
        pState->nStep+=nTimes;
        pState->number-=(tmpTimes/10)*45;
        pState->path.push_back('*');
        return true;
    }

    return false;
}

bool tryToJumpUp(long long num, botState* pState, int& nTimes)
{
    // if where the bot is, we have a clear path to go as far north as we could ever want, we can just do as many sets of nnnnnnnnnn (n*10) as needed, til we are close enough to the target
    point tmpPoint;
    vector<point> pointsInPath;
    pointsInPath.push_back(tmpPoint);

    for (int i=0; i<pState->nStep; i++)
    {
        tmpPoint.ApplyDirection(pState->path.at(i));
        pointsInPath.push_back(tmpPoint);
    }

    for (int i=0; i<pointsInPath.size(); i++)
    {
        if ((pointsInPath.at(i).x == tmpPoint.x) && (pointsInPath.at(i).y > tmpPoint.y))
            return false;  // we have a point blocking our path up!
    }

    long long tmpTimes = (num - pState->number)/45;
    if ((tmpTimes>1) && (tmpTimes<upperLimit))
    {
        tmpTimes--;
        tmpTimes*=10;
        nTimes = (int)tmpTimes;
        pState->nStep+=nTimes;
        pState->number+=(tmpTimes/10)*45;
        pState->path.push_back('*');
        return true;
    }

    return false;
}

typedef char* PChar;

bool buildPath(long long num, PChar& str, int& nLen, int& nScore, botState* startState, int nTimes)
{
    long long nBest = 0;
    int nMaxSteps = 0;
    long long nMax = 0;
    long long nMin = 0;
    int nCleanUpOnStep= 12;
    long long nFromLastCleanUp = 0;
    bool bInCleanUp = false;
    char cDirection = ' ';

    if (nTimes>0)
        cDirection = 'n';
    else if (nTimes<0)
    {
        cDirection = 'e';
        nTimes*=-1;
    }

    if (startState->nStep >= nCleanUpOnStep)
        nCleanUpOnStep= startState->nStep+10;

    str  = NULL;
    nLen = 0;
    botState* bestState = new botState();
    bestState->clone(startState);
    queue<botState*> queueOfStates;
    queueOfStates.push(bestState);  // put the starting state into the queue

    while (!queueOfStates.empty())       // while we still have states in the queue, process them
    {
        botState* pState = queueOfStates.front();
        queueOfStates.pop();             // take a state out of the queue


        if (!str)                        // no solution yet
        {
            if (pState->number == num)   // check if this is a solution
            {
                // we solved it!
                int nOffset=0;
                nLen = pState->nStep - nTimes + 17;
                str = new char[nLen+1];
                if (bDebugInfo)
                    printf("solved!\n");
                nScore = pState->nStep;
                for (int i=0; i<pState->path.size(); i++)
                {
                    if (pState->path.at(i)=='*')
                    {
                        sprintf(str+i, "(%c * %11d)", cDirection, nTimes);
                        if (bDebugInfo)
                            printf("(%c * %11d)", cDirection, nTimes);
                        nOffset=16;
                    }
                    else
                    {
                        str[i+nOffset] = pState->path.at(i);
                        if (bDebugInfo)
                            printf("%c", str[i+nOffset]);// print solution while making the string
                    }
                }
                if (bDebugInfo)
                    printf("\n");
                str[nLen]='\0';
            }
            else
            {                            // no solution yet, we need to go deeper
                if (pState->number < nMin)
                    nMin = pState->number;

                if (pState->number > nMax)
                    nMax = pState->number;

                if ((!bInCleanUp) && (queueOfStates.size()>1000000))
                {
                    nCleanUpOnStep=nMaxSteps+10;
                    bInCleanUp = true;
                }
                if (pState->nStep > nMaxSteps)
                {                        // a little tracing, so we can see progress
                    nMaxSteps = pState->nStep;
//                    printf("current states have %d steps, reached a max of %lld, and a min of %lld\n", nMaxSteps, nMax, nMin);
                    if (nMaxSteps >= nCleanUpOnStep)
                    {
                        nCleanUpOnStep+=10;
                        bInCleanUp = true;
                    }
                }

                if (isBetterNum(pState->number, nBest, num))
                {                        // a little tracing, so we can see progress
                    nBest = pState->number;
                    if (bDebugInfo)
                        printf("Got closer to the target, %lld, with %d steps (target is %lld, diff is %lld)\n", nBest, pState->nStep, num, num-nBest);
                    if (bestState != pState)
                        delete bestState;
                    bestState = pState;
                }

                if (!bInCleanUp)
                {
                    tryToAddStep(queueOfStates, pState, 'n', cDirection);
                    tryToAddStep(queueOfStates, pState, 'e', cDirection);

                    if (!nTimes)  // once we did the "long walk in one direction" don't do the west or south moves any more
                    {
                        tryToAddStep(queueOfStates, pState, 'w', cDirection);
                        tryToAddStep(queueOfStates, pState, 's', cDirection);
                    }
                }
            }
        }
        if (pState!=bestState)
            delete pState;                  // this is not java, we need to keep the memory clear.

        if ((bInCleanUp) && (queueOfStates.empty()))
        {
            queueOfStates.push(bestState);  // put the starting state into the queue
            bInCleanUp = false;
            long long diff = nFromLastCleanUp-bestState->number;
            if (!nTimes)
            {
                if ((diff>0) && (diff<100))
                    if (tryToJumpDown(num, bestState, nTimes))
                        cDirection = 'e';
                if ((diff<0) && (diff>-100))
                    if (tryToJumpUp(num, bestState, nTimes))
                        cDirection = 'n';

                if (nTimes)
                    nCleanUpOnStep = bestState->nStep;
            }
            nFromLastCleanUp = bestState->number;
        }
    }

    delete bestState;                  // this is not java, we need to keep the memory clear.
    return str!=NULL;
}

char* positiveSpine = "nnnesssssessssssss";
char* negativeSpine = "esssssssseessssss";

bool canReachNumber(long long num, PChar& str, int& nLen, int& nScore)
{
    int nTimes = 0;
    botState tmpState;
    if ((num>=0) && (num<=20))
        return buildPath(num, str, nLen, nScore, &tmpState, nTimes);

    botState bestState;
    bestState.clone(&tmpState);

    char* spine = NULL;
    if (num>0)
    {
        spine = positiveSpine;
    }
    else
    {
        spine = negativeSpine;
    }

    for (int i=0; spine[i]; i++)
    {
        tmpState.nStep++;
        tmpState.path.push_back(spine[i]);
        if (!changeNumberWithDirection(tmpState.number, spine[i], tmpState.nStep))
            return false;

        if ((num>0) && (tmpState.number<num))
        {
            bestState.clone(&tmpState);
        }
        else if ((num<0) && (tmpState.number>num))
        {
            bestState.clone(&tmpState);
        }
    }

    if (bestState.number == num)
        return buildPath(num, str, nLen, nScore, &bestState, nTimes);

    botState tryPath;
    tmpState.clone(&bestState);
    for (int i=0; i<9; i++)
    {
        tryPath.clone(&tmpState);
        bool pathOK = true;
        for (int j=0; j<i; j++)
        {
            tryPath.nStep++;
            tryPath.path.push_back('e');
            if (!changeNumberWithDirection(tryPath.number, 'e', tryPath.nStep))
            {
                pathOK = false;
                break;
            }
        }
        tryPath.nStep++;
        tryPath.path.push_back('s');
        if (!changeNumberWithDirection(tryPath.number, 's', tryPath.nStep))
        {
            pathOK = false;
            break;
        }

        if ((pathOK) && (isBetterNum(tryPath.number, bestState.number, num)))
        {
            bestState.clone(&tryPath);
        }
    }

    // in case we'll need to add, but last step was south, move one to the east.
    if ((bestState.path.at(bestState.path.size()-1) == 's') && (bestState.number<num))
    {
        bestState.nStep++;
        bestState.path.push_back('e');
        if (!changeNumberWithDirection(bestState.number, 'e', bestState.nStep))
            return false;
    }

    if (bestState.number<num)
    {
        long long diff = num - bestState.number;
        diff/=45;
        nTimes = (int)diff*10;
        bestState.nStep += nTimes;
        bestState.path.push_back('*');
        bestState.number += 45*diff;
        while (num - bestState.number > 10)
        {
            bestState.nStep++;
            bestState.path.push_back('n');
            if (!changeNumberWithDirection(bestState.number, 'n', bestState.nStep))
                return false;
        }
        return buildPath(num, str, nLen, nScore, &bestState, nTimes);
    }
    else
    {
        long long diff = bestState.number - num;
        diff/=45;
        nTimes = (int)diff*10;
        bestState.nStep += nTimes;
        bestState.path.push_back('*');
        bestState.number -= 45*diff;
        while (bestState.number - num > 10)
        {
            bestState.nStep++;
            bestState.path.push_back('e');
            if (!changeNumberWithDirection(bestState.number, 'e', bestState.nStep))
                return false;
        }
        return buildPath(num, str, nLen, nScore, &bestState, -nTimes);
    }

    return false;
}
long long aVals[] = {49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553};

void main(void)
{
    upperLimit =     2147483647;       //  2^31 - 1
    lowerLimit =-1;       // -2^31
    lowerLimit *=2147483648;       // -2^31
    long long num=0;
    char* str=NULL;
    int nLen = 0;
    int nItems = sizeof(aVals)/sizeof(aVals[0]);
    int nScore = 0;
    long long nTotalScore = 0;
//  nItems=1;

    for(int i=0; i<nItems; i++)
    {
        if (canReachNumber(aVals[i], str, nLen, nScore))  //try to reach it
        {
            printf("%3d) to reach %10lld, it takes %9d steps, by doing: %s\n", i, aVals[i], nScore, str);

            nTotalScore+=nScore;
            delete str;
        }
        else
        {
            if (aVals[i]>0)
                printf("Failed to reach %lld, use nenenenenenen..... ('n', followed by %lld pairs of 'en')\n", aVals[i], aVals[i]-1);
            else
                printf("Failed to reach %lld, use enenenenenene..... ('e', followed by %lld pairs of 'ne')\n", aVals[i], aVals[i]-1);
            nTotalScore+=2*aVals[i]-1;
        }
    }

    printf("done, total score is %lld\n", nTotalScore);
    return;
}

প্রবন্ধের মধ্যে কি নিশ্চিত যে পরিবর্তনশীল ওভারফ্লো নয়? যদি ভি = 1 টি = 1 এর স্ট্রিংটির অর্থ (1 * 2 * 3 * 4 * 5 * 6 * 7-8) * 1 * 2 * 3 * 4 * 5 ইত্যাদি বা এর মতো কিছু
রোজলুপ

@ রোসলুপ এটি -8 নয়। এটি এর মতো আরও রয়েছে: ((-1) * (2 * 3 * 4 * 5 * 6 * 7 * 8 * 9) -0-1) * 2 * 3 * 4 * 5 * 6 * 7 যা -1828920240 যা প্রায় -2 ^ 30.7683 হয় তাই এটি পাস হয় না -2 ^ 31
লেভ

2

পাইথন, স্কোর = 56068747912

def move(n):
    print("n" + "en" * (n - 1))

nenenenenenenen...প্রতিটি সংখ্যার জন্য কেবল প্রিন্ট করুন ।

পরে একটি ব্যাখ্যা যোগ করবে।


1 দ্বারা বন্ধ, তাই না? nen2
edc65

@ edc65 এটি স্থির করে।
ক্লিমেজিক

আসলে এই কোডটি চালিয়ে আপনি কি এই স্কোরটি পেয়েছেন, বা যদি সবকিছু ঠিকঠাক কাজ করে তবে এটি আপনার "অনুমান"?
ইয়াল লেভ

পুনঃটুইট এটি প্রত্যাশার মতো কাজ করা উচিত, যাইহোক - প্রাথমিক "এন" এর পরে প্রতিটি "এন" এর মান 1 দ্বারা বাড়ানো উচিত (যেহেতু মান "-2 + 3-4 + 5 ...- 0 + 1-2 + 3" হয় প্রাথমিক "+1" এর পরে)।
clismique

সমস্যাটি হ'ল প্রয়োজনীয়তাটি এটি 10 ​​মিনিট সময় নেয়। আপনার "আসুন সেগুলি সমস্ত মুদ্রণ করুন" উপায়টি সেই সীমাবদ্ধতার সাথে মিলবে কিনা তা নিশ্চিত নয়।
আইয়াল লেভ

2

মরিচা , স্কোর = 1758 (কোনও পশ্চিমে পাথের মধ্যে অনুকূল নয়)

দ্বি নির্দেশমূলক অনুসন্ধান ব্যবহার করে 50 টি সংখ্যার জন্য মোট 7 সেকেন্ডের মধ্যে চলে ।

use std::collections::HashSet;
use std::io::{self, prelude::*};

#[derive(Debug, Eq, Clone, Copy, Hash, Ord, PartialEq, PartialOrd)]
enum Dir {
    N,
    E,
    S,
}
use Dir::{E, N, S};

fn dir_char(dir: Dir) -> char {
    match dir {
        N => 'n',
        E => 'e',
        S => 's',
    }
}

#[derive(Debug, Eq, Clone, Hash, Ord, PartialEq, PartialOrd)]
struct State {
    counter: i32,
    value: i32,
    next: Dir,
}

fn step(s: &State) -> impl Iterator<Item = State> {
    let (values, nexts): (_, &[Dir]) = match s.next {
        N => (s.value.checked_add(s.counter), &[N, E]),
        E => (s.value.checked_sub(s.counter), &[N, E, S]),
        S => (
            if s.counter != 0 {
                s.value.checked_mul(s.counter)
            } else {
                None
            },
            &[E, S],
        ),
    };
    let counter = (s.counter + 1) % 10;
    values.into_iter().flat_map(move |value| {
        nexts.iter().map(move |&next| State {
            counter,
            value,
            next,
        })
    })
}

fn unstep(s: &State) -> impl Iterator<Item = State> {
    let counter = (s.counter + 9) % 10;
    (match s.next {
        N | E => s.value.checked_sub(counter).map(|value| State {
            counter,
            value,
            next: N,
        }),
        _ => None,
    }).into_iter()
        .chain(s.value.checked_add(counter).map(|value| State {
            counter,
            value,
            next: E,
        }))
        .chain(match s.next {
            E | S if counter != 0 && s.value % counter == 0 => {
                s.value.checked_div(counter).map(|value| State {
                    counter,
                    value,
                    next: S,
                })
            }
            _ => None,
        })
}

fn search(value: i32) -> String {
    let mut lefts: Vec<HashSet<State>> = Vec::new();
    let mut left = [N, E, S]
        .iter()
        .map(|&next| State {
            counter: 1,
            value: 0,
            next,
        })
        .collect::<HashSet<_>>();
    let mut rights: Vec<HashSet<State>> = Vec::new();
    let mut right = (0..10)
        .map(|counter| State {
            counter,
            value,
            next: E,
        })
        .collect::<HashSet<_>>();
    loop {
        if let Some(mid) = left.intersection(&right).min() {
            let mut path = Vec::new();
            let mut mid1 = mid.clone();
            for left in lefts.into_iter().rev() {
                let mid2 = unstep(&mid1)
                    .filter(|mid2| left.contains(mid2))
                    .next()
                    .unwrap();
                mid1 = mid2;
                path.push(mid1.next);
            }
            path.reverse();
            let mut mid1 = mid.clone();
            for right in rights.into_iter().rev() {
                let mid2 = step(&mid1)
                    .filter(|mid2| right.contains(mid2))
                    .next()
                    .unwrap();
                path.push(mid1.next);
                mid1 = mid2;
            }
            return path.into_iter().map(dir_char).collect::<String>();
        }
        if left.len() <= right.len() {
            let left1 = left.iter().flat_map(step).collect::<HashSet<_>>();
            lefts.push(left);
            left = left1;
        } else {
            let right1 = right.iter().flat_map(unstep).collect::<HashSet<_>>();
            rights.push(right);
            right = right1;
        }
    }
}

fn main() {
    let stdin = io::stdin();
    let values = stdin
        .lock()
        .lines()
        .flat_map(|line| {
            line.unwrap()
                .split(", ")
                .map(|s| s.parse().unwrap())
                .collect::<Vec<i32>>()
        })
        .collect::<Vec<_>>();

    for value in values {
        println!("{} {}", value, search(value));
    }
}

এটি অনলাইন চেষ্টা করুন!

আউটপুট

49445094 nennesseseenenesseseeseseeeeseess
71259604 nnnnnnessennnessseeesssenesenesses
78284689 ennnesssseeeneenesenesssseeesese
163586986 ennnesesseneeeeessennesseeseseeneesen
171769219 ennnessenessssessseesesseeseenesee
211267178 sennnnneseeenessssenessssenenneseseee
222235492 ennnnnesseeeneseesseeesseseneesseesee
249062828 nnnnnesseneneseesssenennesseenesse
252588742 nennnessenneeeessesesesseseeseseeseee
263068669 nennnesseessseeessseesseeenesesssen
265657839 nnnesssseneesesssennneenesseeeses
328787447 eennnesssenesseesssesennnneeseenese
344081398 sennnnesennnesesessesesssseeseennnn
363100288 sennnnesseeneseesssenneesessennenee
363644732 nnnesssenneessesseeesseseseesenees
372642304 nnnnesseneseneseesseneneesssennesese
374776630 sennnnesseseesseneseeeseseessenesen
377945535 nnnesssseneeennesseesseeessseeses
407245889 nnnesseneesessseseseeeeessessenenee
467229432 nnnnesesennnnnesessesessesseeneess
480714605 nnnnessennneseesssenenesenesseesesen
491955034 nnnnnessseeneeeessseeeseenesseseeee
522126455 nnnnesssseeneeesesseesesseeeenese
532351066 nennnessenneeenesesesesessessesenesen
542740616 sennnnesseeneenesssesseenesseesesesen
560336635 nnnesssesesesssseeennessseseeneee
563636122 sennnnnesennneseseennesesssesenesenes
606291383 nnnessssenneeeseseseeseseeeeseesese
621761054 nnnessseennessesssenneeseseseess
648274119 nnnnessseneesseseeseenessseeneseeese
738259135 eennnnnesenennnesseneessssssennnees
738287367 nnnessesseessseseseneeesesseennen
748624287 nennnesseesseeenneseessseseeseneseseese
753996071 nnnnessseneeeseesssenesesenennnesesen
788868538 nnnessesseeseeeneeseesesseesseseeseee
801184363 ennnesseseeseeeeseseeeeseeseseessse
807723631 nnnessessessssesseennnnesssen
824127368 nnnnessesenessseseennnessseesesennnnn
824182796 nnnnessesenesssseenesssesssenesee
833123975 ennnnnneseeeennnessesssessseennnneeesse
849666906 sennnessseeeeseesesesssenesseneeeesen
854952292 nnnnnnesenenesssseeneeessessseseeeeeeee
879834610 nennnnesseessseneeseeesessseseneee
890418072 nnnesssennnnessesesennnesessennnnees
917604533 ennnnesseneeseeesesenennesesseeneesse
932425141 ennnnesssesseesesenesssessseeneesen
956158605 nnnnesseseeeeesesssennneseseenesseee
957816726 enennnesseseeseesseessessssenesss
981534928 eennnessennessseesseesessseenessseenn
987717553 nnnessseeneeesssesseesssesennessee

আপনি এত যে একটি সেল ফিরে আসতে না পারে ns, sn, ewএবং weঅবিলম্বে পথে কোনো লুপ ছাড়াও অবৈধ
Veskah

@ ওয়েশকাঃ এটি উল্লেখ করার জন্য ধন্যবাদ। নামঞ্জুর করার দ্বারা নির্ধারিত w, nsএবং sn, যার আইনি পাথ উপেক্ষা ব্যয় এ ছাড়বে শুধুমাত্র আইনি পাথ w
অ্যান্ডারস কাসের্গ

0

পিএইচপি, স্কোর = 1391462099

function manoeuvre($n){
  $i=0;
  $c=0;
  $char='';
  while($i!=$n){
    $c=($c+1)%10;
    if($char!='n' and $c>0 and $i>0 and $i*$c<=$n){
      $char='s';
      $i=$i*$c;
    }
    else if($char!='s' and $i+$c<=$n and ($i-$c<=0 or ($i-$c)*max(($c+1)%10,2)>$n or $c==9)){
      $char='n';
      $i=$i+$c;
    }
    else{
      $char='e';
      $i=$i-$c;
    }
    echo $char;
  }
}

একটি দ্রুত প্রচেষ্টা, পাথ চেকিংকে সহজ করার জন্য পশ্চিমে কখনও যায় না এবং প্রতিটি পদক্ষেপে দিকনির্দেশনার জন্য কয়েকটি বিধি থাকে।

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