মাইনক্রাফ্ট ইনভেন্টরি ম্যানেজমেন্ট


11

মাইনক্রাফ্ট ইনভেন্টরি পরিচালনা শক্ত। আপনার কাছে 17 টি হীরক রয়েছে, তবে একটি জাদু টেবিল, একটি পিক্স্যাক্স এবং একটি তরোয়াল কারুকাজ করার জন্য আপনার 7 টি দরকার। আপনি কি তাদের বাছাই করেছেন এবং 7 বার ডান ক্লিক করেছেন? অথবা আপনি একবার ডান ক্লিক করুন এবং দুবার ডান ক্লিক করুন এবং 7 টি বামে নেবেন? এটা এত বিভ্রান্ত!

আপনারা যারা এখন বিভ্রান্ত হয়ে পড়েছেন তাদের জন্য চিন্তা করবেন না, আমি এক সেকেন্ডে এগুলি ব্যাখ্যা করব

চ্যালেঞ্জ

একটি স্ট্যাক আইটেমের আকার এবং একটি পছন্দসই পরিমাণ দেওয়া, সেই পরিমাণ পেতে সর্বনিম্ন ক্লিকের সংখ্যা নির্ধারণ করুন। উভয় ইনপুটগুলির জন্য আপনাকে কেবলমাত্র 64 টি পর্যন্ত পরিচালনা করতে হবে এবং আপনি ধরে নিতে পারেন আপনার অসীম ইনভেন্টরি স্লট রয়েছে। আপনি টানা-বিতরণ কৌশলটি ব্যবহার করতে পারবেন না।

সংজ্ঞা

জায় স্লট যেখানে আপনি আইটেম সংরক্ষণ করতে পারেন একটি সংগ্রহ।

একটি স্লট আপনার ইনভেন্টরির একটি স্টোরেজ স্পেস যেখানে আপনি এক ধরণের আইটেম রাখতে পারেন।

একটি স্ট্যাক একই গ্রুপে রাখা বেশ কয়েকটি আইটেম। এই চ্যালেঞ্জের উদ্দেশ্যে, একটি স্ট্যাক কেবল একই জায়গায় আইটেমগুলির একগুচ্ছ (তাই স্ট্যাক-আকার উপেক্ষা করুন)

কার্সার আপনার সূচালো অজানা নয়। Curs কার্সার এটিতে "আইটেম" থাকতে পারে; অন্য পদগুলিতে, আপনি যদি স্লটে ক্লিক করেন এবং আইটেমগুলি বাছাই করেন, আপনি যে আইটেমগুলি তুলেছেন সেগুলি "কার্সারে থাকা" থাকবে যতক্ষণ না আপনি সেগুলি নামিয়ে রাখেন।

বিশেষ উল্লেখ

সম্ভাব্য চারটি পরিস্থিতি রয়েছে। হয় আপনার কার্সারে একটি আইটেম রয়েছে বা আপনার নেই, এবং হয় আপনি বাম ক্লিক বা আপনি ডান ক্লিক করুন।

যদি আপনার কার্সারে কোনও আইটেম না থাকে এবং আপনি একটি স্লটে বাম-ক্লিক করেন, আপনি পুরো স্ট্যাকটি তুলে নেবেন।

যদি আপনার কার্সারে কোনও আইটেম না থাকে এবং আপনি একটি স্লটে ডান ক্লিক করেন তবে আপনি অর্ধেক স্ট্যাকটি বেছে নেবেন ed

যদি আপনার কার্সারে কোনও আইটেম থাকে এবং আপনি একটি স্লটে বাম-ক্লিক করেন, আপনি সমস্ত আইটেম সেই স্লটে রেখে দিন। (আপনি সকল মাইনক্রাফ্ট খেলোয়াড়ের জন্য, আপনার কাছে এই চ্যালেঞ্জের জন্য> 64 টি আইটেম থাকবে না এবং সেগুলি সবগুলি 64-স্ট্যাকেবল এবং আপনার কেবলমাত্র এক ধরণের রয়েছে যাতে আইটেম সোয়াপটি এখানে প্রয়োগ হয় না)

যদি আপনার কার্সারে কোনও আইটেম থাকে এবং আপনি একটি স্লটে ডান ক্লিক করেন তবে আপনি একটি আইটেম সেই স্লটে রেখে দিন।

সুতরাং, আপনি প্রদত্ত সমস্ত আইটেম (প্রথম ইনপুট, বা দ্বিতীয়; আপনি অর্ডারটি বেছে নিতে পারেন) দিয়ে স্লটটিতে শুরু করুন এবং আপনি আপনার কার্সারে পছন্দসই পরিমাণ (অন্যান্য ইনপুট) রেখে শেষ করতে চান।

একটি উদাহরণ দিয়ে চালানো যাক। বলুন যে আপনি 17 টি আইটেম দিয়ে শুরু করেছেন এবং আপনি চান 7. প্রথমে, আপনি স্ট্যাকের উপর ডান ক্লিক করুন, যার অর্থ আপনি 9 বাছাই করেছেন এবং সেখানে 8 জন রয়েছে sl তারপরে, আপনি যদি আবার স্ট্যাকের উপর ডান-ক্লিক করেন, আপনি একটি আইটেমটি স্লটে ফিরিয়ে রাখুন এবং আপনাকে 8 দিয়ে এবং স্লটটি 9 দিয়ে রেখেছেন, শেষ পর্যন্ত, আপনি আবার ডান ক্লিক করুন এবং আপনার 7 এবং স্লটটি 10 ​​রয়েছে। আপনি ফিরে আসবেন 3(ক্লিকের সংখ্যা)।

যদি আপনি আমাকে-ক্লিক-গল্ফ পরিচালনা করেন তবে দয়া করে আমাকে বলুন এবং আমি উদাহরণটি সম্পাদনা করব: পি

পরীক্ষার কেস

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

Given, Desired -> Output
17, 7 -> 3
64, 8 -> 5
63, 8 -> 5
10, 10 -> 1
10, 0 -> 0 # note this case
25, 17 -> 7

ব্যাখ্যা

এই চ্যালেঞ্জটি নন-মাইনক্রাফ্ট খেলোয়াড়দের পক্ষে জটিল হতে পারে, আমার কোনও ধারণা নেই। এখানে কিছু ব্যাখ্যা আছে।

64, 8 -> 5 কারণ আপনি ডান ক্লিক ব্যবহার করে 32 বাছাই করেছেন, এটিকে নীচে রাখুন, 16 টি বাছাই করুন, এটি নীচে রাখুন, এবং পরে 8 টি বাছাই করুন।

63, 8 -> 5 একই কারণে

25, 17 -> 7 কারণ আপনি ১৩ টি বাছাই করেছেন, এটিকে নীচে রাখুন, বাম পাশের 12 টি থেকে 6 টি বাছাই করুন, 2 টি বাম পাশের স্ট্যাকের মধ্যে রাখুন এবং তারপরে 4টিকে 13 এ কর্সারে রাখুন এবং তারপরে সেগুলি বেছে নিন।

বিধি

  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য
  • আপনি এটা ধরে নিতে পারেন 0 <= desired <= given <= 64
  • আপনি যে কোনও ক্রমে ইনপুট নিতে পারেন এবং কোনও যুক্তিসঙ্গত ফর্ম্যাটে I / O করতে পারেন



2
সুতরাং এটি একটি রাষ্ট্রীয় মেশিন যা একটি রাষ্ট্র দিয়ে শুরু হয় মত 0,[n], রূপান্তর করতে পারেন: থেকে (1) 0,[a,b,...]থেকে a,[b,...], b,[a,...], ceil(a/2),[floor(a/2),b,...], অথবা ceil(b/2),[a,floor(b/2),...]; বা (2) থেকে x,[a,b,...]( x>0) এর x-1,[a+1,b,...], x-1,[a,b+1,...], x-1,[a,b,...,1], 0,[a+x,b,...], 0,[a,b+x,...], 0,[a,b,...,x]। চ্যালেঞ্জটি হ'ল ন্যূনতম সম্ভাব্য ট্রানজিশনগুলি সন্ধান করা 0,[g]যেখানে g কে দেওয়া হয় t,Lযেখানে tকাঙ্ক্ষিত লক্ষ্য এবং Lকোনও তালিকা?
জোনাথন অ্যালান

উত্তর:


2

সি ++ , 498 482 457 বাইট

যদি এই ফাংশনটি কেবল একবার কল করা হয় তবে এটি 455 বাইট হতে পারে।

আমি দেখতে পেয়েছি যে প্রায় প্রতিটি অনলাইন জিসিসি সংকলক (টিআইও সহ) আমাকে ফাংশনের ধরণ বাদ দিতে নিষেধ করে f। তবে, আমার কম্পিউটারের জিসিসি এটির অনুমতি দেয় এবং কেন তা আমি জানি না।

যদি কোনও স্লটে সেই সংখ্যক আইটেম থাকতে পারে তবে এটি বড় ইনপুটগুলি পরিচালনা করতে পারে (যদিও আরও বড় অ্যারের প্রয়োজন এবং সম্ভবত সময়সীমার বাইরে চলে যাবে)।

#import<bits/stdc++.h>
#define t N.first
#define X n.erase(n.find
#define p(c){if(c==r)return l;if(L.emplace(w={n,c},l).second)Q[U++]=w;}
#define T(S,C)n.insert(S);p(C)X(S));
using m=std::multiset<int>;using s=std::pair<m,int>;s Q[99999];int x,l,B,U;int f(int a,int r){if(!r)return 0;std::map<s,int>L;s f({a},B=0),w,N;L[Q[U=1]=f];for(;;){l=L[N=Q[B++]]+1;x=N.second;t.insert(0);for(int i:t){m n=t;X(i));if(x){T(i+x,0)T(i+1,x-1)}if(!x&&i){p(i)T(i/2,i-i/2)}}}}

Ungolfed:

#include <map>
#include <set>
#include <queue>
#include <iostream>

using namespace std;

struct state {
    multiset<int> t; int q;
    bool operator<(const state& i) const { return make_pair(t, q) < make_pair(i.t, i.q); }
};

int f(int a, int target) {
    if (target == 0) return 0;

    map<state, int> len;
    queue<state> qu;
    state first = {{a}, 0};
    qu.push(first);
    len[first] = 0;

    #define push(c) { state a = {n, c}; auto t = len.insert({a, l + 1}); if (t.second) { \
        if (a.q == target) return l + 1; qu.push(a); \
    } } // push new state into queue and check for termination
    #define next(stk, cur) { n.insert(stk); push(cur); n.erase(n.find(stk)); }
    // insert new stack, push new state, erase the stack (for another use)

    while (qu.size()) { // BFS cycle
        state now = qu.front();
        qu.pop();

        int q = now.q;
        int l = len[now];

        multiset<int> n(now.t);
        for (int i : now.t) { // click on non-empty stack
            n.erase(n.find(i));
            if (!q) { // nothing on cursor
                push(i); // click left
                next(i / 2, (i + 1) / 2); // click right
            }
            else { // item on cursor
                next(i + q, 0); // click left
                next(i + 1, q - 1); // click right
            }
            n.insert(i);
        }
        if (q) { // click on empty stack
            next(q, 0); // click left
            next(1, q - 1); // click right
        }
    }
}

1

জেলি , 74 বাইট

Ẏċ⁴¬
HĊ,$Ḟµ€1¦€F€;⁸Ḣ,$€
‘1¦€ṭ€⁹’¤
+1¦€⁹ṭ€0;ç
⁹Ȧ‘Ḥ¤ŀ
Ṫ;0ṙJ$çḢ
Wṭ0WÇ€Ẏ$ÑпL’

প্রথম ইনপুট (3 য় আর্গুমেন্ট) সহ বর্তমান স্ট্যাক এবং দ্বিতীয় ইনপুট (চতুর্থ আর্গুমেন্ট) চেয়েছিল একটি কার্সার সহ একটি সম্পূর্ণ প্রোগ্রাম।

এটি অনলাইন চেষ্টা করুন! বাস্তবায়নের কারণে এটি25, 17পরীক্ষার ক্ষেত্রেsecond০ সেকেন্ডের টিআইওর সময়কে হিট করে। এই by৪ বাইটার (যা শূন্য-আকারের স্ট্যাকগুলি ফিল্টার করে এবংḟ€Ṣ¥0¦€0link লিঙ্কের শেষে থাকা বাক্যগুলিকে বাছাই করে এবং মূলটিতে ব্যবহারেরসাথে প্রতিটি পদক্ষেপে অনন্য রাজ্যগুলিকে রাখেযাব্যবহার করে গল্ফনেসের জন্য রেখে যাওয়া অপ্রয়োজনীয় জিনিসগুলি সরিয়ে দিয়ে প্রতিকার করা যেতে পারেQ$) লিঙ্ক)।

কিভাবে?

প্রোগ্রামটি সংজ্ঞায়িত রাষ্ট্র-মেশিন প্রয়োগ করে।
এটি আসল অবস্থা তৈরি করে [0, [argument 1]]
তারপরে পরবর্তী কোনও সম্ভাব্য রাজ্যগুলিতে বার বার পদক্ষেপগুলি
পাওয়া যায় যতক্ষণ না কোনও মিল খুঁজে পাওয়া যায় [argument 2, [...]]

দ্রষ্টব্য: প্রোগ্রামের এন্ট্রিটি "মূল লিঙ্ক" এ রয়েছে যা নীচেরতমটি ( Wṭ0WÇ€Ẏ$ÑпL’)

Ẏċ⁴¬ - Link 1, test a list of states for not having the desired cursor
Ẏ    - tighten by one
  ⁴  - program's fourth argument (second input) - desired cursor
 ċ   - count occurrences (the stack list will never match, so just inspecting the cursors)
   ¬ - logical negation

HĊ,$Ḟµ€1¦€F€;⁸Ḣ,$€ - Link 2, next states given a 0 cursor: list, rotatedStacks; number currentCursor (unused)
     µ€1¦€         - for each rotation of rotatedStacks apply to the first element:
H                  -   halve
   $               -   last two links as a monad
 Ċ                 -     ceiling
  ,                -     pair
    Ḟ              -   floor (vectorises) -- i.e. n -> [floor(ceil(n/2)),floor(n/2)]
                                                     = [ceil(n/2),floor(n/2)]
          F€       - flatten each -- i.e. each [[c1,f1],s2, s3,...] -> [c1,f1,s2,s3,...]
             ⁸     - chain's left argument, rotatedStacks
            ;      - concatenate -- i.e. [[c1,f1,s2,s3,...],[c2,f2,s3,...,s1],...,[s1,s2,s3,...],[s2,s3,...,s1],...]
                $€ - last two links as a monad for each:
              Ḣ    -   head
               ,   -   pair -- i.e. [c1,f1,s2,s3,...] -> [c1,[f1,s2,s3,...]]

‘1¦€ṭ€⁹’¤ - Link 3, next states given a non-0 cursor and a right-click: list, rotatedStacks; number currentCursor
 1¦€      - for each rotation of rotatedStacks apply to the first element:
‘         -   increment -- i.e. place an item into the first stack of each rotation
        ¤ - nilad followed by link(s) as a nilad:
      ⁹   -   chain's right argument -- currentCursor
       ’  -   decrement
    ṭ€    - tack each -- i.e. [s1-1,s2,s2,...] -> [currentCursor-1,[s1-1,s2,s2,...]]

+1¦€⁹ṭ€0;ç - Link 4, next states given a non-0 cursor: list, rotatedStacks; number currentCursor
 1¦€       - for each rotation of rotatedStacks apply to the first element:
    ⁹      -   chain's right argument -- currentCursor
+          -   add
     ṭ€0   - tack each to zero -- i.e. [s1+currentCursor,s2,s3,...] -> [0,[s1+currentCursor,s2,s3,...]]
         ç - call the last link (3) as a dyad -- get the right-click states
        ;  - concatenate

⁹Ȧ‘Ḥ¤ŀ - Link 5, next states: list, rotatedStacks; number currentCursor
     ŀ - call link at the given index as a dyad...
    ¤  -   nilad followed by link(s) as a nilad:
⁹      -     chain's right argument -- currentCursor
 Ȧ     -     any & all -- for our purposes zero if zero, one if not
  ‘    -     increment
   Ḥ   -     double
       - -- i.e. call link 2 if currentCursor is zero else call link 4

Ṫ;0ṙJ$çḢ - Link 6, next states: currentState  e.g. [cc, [s1, s2, s3, ...]]
Ṫ        - tail -- get the stacks, [s1, s2, s3, ...]
 ;0      - concatenate a zero - add an empty stack to the options for use
     $   - last two links as a monad for each:
    J    -   range(length)
   ṙ     -   rotate left by -- i.e. [[s2,s3,0,...,s1],[s3,0,...,s1,s2],[0,...,s1,s2,s3],[...,s1,s2,s3,0],...[s1,s2,s3,0,...]]
       Ḣ - head -- get the currentCursor, cc
      ç  - call the last link (5) as a dyad

Wṭ0WÇ€Ẏ$ÑпL’ - Main link: initialStack, requiredCursor
W             - wrap -- [initialStack]
 ṭ0           - tack to zero -- [0, [initialStack]]
   W          - wrap -- [[0, [initialStack]]]
         п   - loop while, collecting the results:
        Ñ     - ...condition: call next link (1) as a monad -- cursor not found
       $      - ...do: last two links as a monad:
    ǀ        -   call the last link (6) as a monad for each
      Ẏ       -   flatten the resulting list by one level
           L  - length
            ’ - decremented (the collect while loop keeps the input too)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.