স্ট্যাক এক্সচেঞ্জিং


23

সমস্যা

বলুন যে আপনার কাছে এস এন এর মাধ্যমে এস 1 নামক এন স্ট্যাক রয়েছে , যেখানে প্রতিটি এস কে (কে = 1 থেকে এন) কে নম্বরের এন কপি থাকে।

উদাহরণস্বরূপ, যখন এন = 3 স্ট্যাকগুলি দেখতে লাগে:

1  2  3  <- top of stack
1  2  3
1  2  3  <- bottom of stack
=======
1  2  3  <- stack index

এখানে 1, 2 এবং 3 হিসাবে সূচকযুক্ত 3 টি স্ট্যাক রয়েছে এবং প্রত্যেকটিতে তার নিজস্ব সূচির এন উদাহরণ রয়েছে।

লক্ষ্য হ'ল এন স্ট্যাকগুলি পুনরায় সাজানো যাতে এগুলির প্রতিটি স্বতন্ত্রভাবে নীচে থেকে নীচে থেকে N এর মাধ্যমে 1 নম্বর থাকে numbers

উদাহরণস্বরূপ এন = 3 এর জন্য লক্ষ্য হ'ল স্ট্যাকগুলি পুনরায় সাজানো:

1  1  1
2  2  2
3  3  3
=======
1  2  3

আপনি কেবল স্ট্যাকগুলি দিয়ে যে ক্রিয়াটি সম্পাদন করতে পারবেন তা হ'ল স্ট্যাকগুলির মধ্যে একটি (শীর্ষস্থান) শীর্ষস্থান নিয়েছে এবং তাৎক্ষণিকভাবে এটিকে একটি অন্য স্ট্যাকের (পুশিং) শীর্ষে স্থাপন করবে । এটি এই শর্তগুলির সাপেক্ষে:

  • কোনও সংখ্যা কেবল স্ট্যাকের দিকে ঠেলা যায় যদি এটি স্ট্যাকের শীর্ষ সংখ্যার চেয়ে কম বা সমান হয়।

    • উদাহরণস্বরূপ, একটি 1একটি 1, 2বা 3শীর্ষে 2একটি স্ট্যাকের দিকে ঠেলা যায় , তবে একটি কেবল উপরে 2বা একটি 3(বা উচ্চতর) দিয়ে একটি স্ট্যাকের দিকে ঠেলা যায় ।

    • এটির প্রভাব রয়েছে যে স্ট্যাকগুলি সর্বদা একজাতীয়ভাবে উপরে থেকে নীচে বৃদ্ধি পায়

  • যে কোনও নরম্পটি স্ট্যাক থেকে পপ করা যেতে পারে এবং ধরে নেওয়া হয় যে পূর্বের বুলেটটি সন্তুষ্ট, যে কোনও স্ট্যাকের দিকে ধাক্কা দেওয়া যেতে পারে।

  • কোনও সংখ্যা একটি খালি স্ট্যাকের দিকে ঠেলাঠেলি করা যেতে পারে।

  • স্ট্যাকের সর্বোচ্চ উচ্চতার সীমা নেই।

  • স্ট্যাকগুলি তৈরি বা ধ্বংস করা যায় না, সেগুলির মধ্যে সর্বদা N থাকে।

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

(কার্ডের ডেকের সাথে অনুশীলন করা সমস্যার জন্য অনুভূতি পাওয়ার জন্য ভাল উপায়))

চ্যালেঞ্জ

একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইতিবাচক পূর্ণসংখ্যক এন নেবে, 3 বা তার বেশি গ্যারান্টিযুক্ত। প্রারম্ভ বা স্ট্রিংটি ফেরত দিন যা প্রাথমিক অবস্থা থেকে স্ট্যাকগুলি পুনরায় সাজানোর জন্য প্রয়োজনীয় সমস্ত পপ-পুশ ক্রিয়াকে বোঝায়:

1  2  3  4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5
=============
1  2  3  4  5

(এন = 5 কেস)

চূড়ান্ত অবস্থায়:

1  1  1  1  1
2  2  2  2  2
3  3  3  3  3
4  4  4  4  4
5  5  5  5  5
=============
1  2  3  4  5

আপনার আউটপুটে প্রতিটি লাইনে একটি স্পেস দ্বারা পৃথক দুটি সংখ্যা থাকতে হবে। প্রথম সংখ্যাটি স্ট্যাকের থেকে পপ করার সূচক এবং দ্বিতীয় সংখ্যাটি স্ট্যাকের দিকে এগিয়ে যেতে সূচক। সমস্ত লাইনের ক্রিয়া সম্পাদন করার জন্য কোনও নিয়ম ভঙ্গ না করে স্ট্যাকগুলি সঠিকভাবে সাজানো উচিত।

উদাহরণস্বরূপ, এন = 3 কেসের জন্য এখানে একটি সম্ভাব্য বৈধ আউটপুট রয়েছে:

1 2  [move the top number on stack 1 to the top of stack 2]
1 2  [repeat]
1 2  [repeat]
3 1  [move the top number on stack 3 to the top of stack 1]
2 3  [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1

নোট

  • আপনার আউটপুটটি অনুকূল হতে হবে না , কেবল সঠিক। অর্থাৎ আপনাকে পপ এবং পুশ সংখ্যা কমিয়ে আনার দরকার নেই।

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

  • মনে রাখবেন যে স্ট্যাকগুলিতে 1-ভিত্তিক সূচক রয়েছে। 0-ভিত্তিক সূচকের অনুমতি নেই।

  • 9 এর চেয়ে বড় এন অবশ্যই একক অঙ্কের এন হিসাবে অবশ্যই কাজ করবে N

  • যদি ইচ্ছা হয় তবে স্পেস এবং নিউলাইনগুলির জায়গায় আপনি কোনও দুটি স্বতন্ত্র, অ-অঙ্কের মুদ্রণযোগ্য ASCII অক্ষর ব্যবহার করতে পারেন । আউটপুটে একটি ট্রেলিং নিউলাইন (বা নিউলাইন বিকল্প) ভাল।

স্কোরিং

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী। টাইব্রেকার বেশি ভোট দেওয়া উত্তর।

যদি আপনি আপনার অ্যালগোরিদমটি দেখতে পারেন তবে মূল্যহীন ব্রাউনি পয়েন্টগুলি সর্বোত্তম।


"ছোট জিনিসগুলির জন্য অতিরিক্ত পয়েন্টগুলি" বাজে>> _>
ব্যবহারকারীর 858538

18
@ জাইবিন ১০১১ আপনি ব্রাউনিজ এ সবেমাত্র কোনও সুযোগ হারিয়েছেন।
ক্যালভিনের শখ

9
আপনি সর্বদা এমন দুর্দান্ত শিরোনাম নিয়ে আসেন!
লুইস মেন্ডো

@ হেলকাহোম্বা-._(._.)_.-
ব্যবহারকারী 48538

N=3অনুকূল ক্ষেত্রে আপনি যে সম্ভাব্য আউটপুটটি অন্তর্ভুক্ত করছেন তা কি?
আর কাপ,

উত্তর:


9

পাইথ 96 94 বাইট

Mt*Q+++bGdHM|%+y_GHQQg1 2++Qd1g2 3g2 1g3 1++Qd2Vr3QgNtN++QdN;g1QVStQVStQI<NHgnNHnNtH)++nN0dnNH

এখানে চেষ্টা করুন

এটা কিভাবে কাজ করে?

এই ব্যাখ্যাটি এন = 5 ব্যবহার করবে।

পর্ব 1: প্রতিটি স্ট্যাকের নীচের স্তরটি তৈরি করুন

এটির জন্য আলাদা আলাদা আলাদা কোডের প্রয়োজন হওয়ার কারণ হ'ল প্রতিটি স্ট্যাকটি ব্যবহার করা দরকার: প্রথম 4 টিতে তাদের নীচে 5 টি রাখা দরকার এবং শেষ স্ট্যাকটি অবশ্যই 5s সরবরাহ করবে। এর অর্থ এই যে আমরা সমস্ত 4s কোথাও সরিয়ে নিতে পারি না, 5 টি রেখে দিতে পারি এবং 4s পিছনে সরিয়ে নিতে পারি না।

ভিজ্যুয়ালাইজেশন: (প্রথম বন্ধনী মানে কী সরানো হবে)

     _
11111 |
22222 |_ Can't move 4s here, not monotonically increasing
33333_|
(44444)------------??? Where to put the 4s?
55555 <- Must supply the 5 that will be moved

পরিবর্তে, এই প্রথম বিনিময়টি করার জন্য, আমরা প্রথমে সমস্ত 1 টি দ্বিতীয় স্ট্যাকের দিকে নিয়ে যাব, 5 টি প্রথম স্ট্যাকের (যা এখন খালি খালি) স্থানান্তরিত করব, 1s তৃতীয় স্ট্যাকের দিকে নিয়ে যাব, 2sকে প্রথম দিকে সরিয়ে রাখব স্ট্যাক করুন, 1 টি প্রথম স্ট্যাকের দিকে ফিরে যান এবং শেষ পর্যন্ত 5 টি দ্বিতীয় স্ট্যাকের দিকে যান।

(11111)-----.
2222211111<-'
===============================
5<---------.
2222211111 : (from stack 5)
===============================
5
22222(11111)-.
3333311111<--'
===============================
522222<-.
(22222)-'
3333311111
===============================
52222211111<-.
             |
33333(11111)-'
===============================
52222211111
5<-----.
33333  |
44444  |
555(5)-'

এখন যেহেতু আমাদের কাছে স্ট্যাকগুলি সরানোর জন্য একটি ফাঁকা জায়গা রয়েছে (স্ট্যাক 2, যার মধ্যে কেবল একটি 5 রয়েছে যা সঠিক জায়গায় স্থাপন করা হয়), আমরা সমস্ত 3 টি স্ট্যাক 2 তে সরাতে পারি এবং একটি 5 স্ট্যাক 3 এ রাখতে পারি place আমরা তারপরে পুনরাবৃত্তি করতে পারি স্ট্যাক 4 এর জন্য একই জিনিস, এবং এখন আমরা সমস্ত 5s সঠিক জায়গায় পেয়েছি! এবং আরও একটি জিনিস: আমরা সমস্ত 1 টি স্ট্যাক 5 এ সরিয়ে দেব যাতে আমরা পরবর্তী স্ট্যাক এক্সচেঞ্জের জন্য একটি সুন্দর সেটআপ পাই।

522222(11111)-.
533333        |
544444        |
5             |
511111<-------'

পার্ট 2: অন্য সব করুন :)

এটি এখন অনেক সহজ, কারণ এখন আমাদের কাছে অন্যান্য নম্বর সরিয়ে নেওয়ার জন্য সর্বদা একটি ফ্রি স্ট্যাক থাকবে into সুতরাং, প্রথমে আমরা 4 কোথায় আছে তা নির্ধারণ করি। কিছুটা পরীক্ষা দেখিয়ে দেবে যে এটি শুরু হয়েছিল সেখান থেকে সর্বদা 1 বা শেষ স্ট্যাকের উপরে 2 হবে। এখন, আমরা কেবল স্ট্যাকের নিচে চলে যাচ্ছি, এটি নিখরচায় স্ট্যাকের মধ্যে একটি 4 রেখে, বা অন্যটি সংখ্যা 1 স্ট্যাকের উপরে না নিয়ে রাখে যদি তা না হয়। এখন আমরা সব 4s জায়গায় আছে।

522222<------.
533333<----. |
544444-.-.-'-'
5<-----' |
511111<--'
===============================
5433333
54
54
5411111
5422222

এখন, আমরা বুঝতে পারি যে 3s 4 টি উপরে যেখানে 2 টি স্ট্যাক রয়েছে। এর অর্থ হ'ল আমরা 4s এর সাথে ঠিক একই জিনিসটি করতে পারি! এবং এটি সক্রিয় হিসাবে, আমরা যতক্ষণ না স্ট্যাক সূচকটি অন্য দিকে ঘিরে রাখি ততক্ষণ আমরা এটি চালিয়ে যেতে পারি।

5433333-'wrap around 543
54                   543
54                   54311111
5411111 .----------->54322222
5422222 |2 stacks up 543

এবং তাই, আমরা সমস্ত স্ট্যাকের বিনিময় না করা অবধি এই কাজটি চালিয়ে যেতে পারি।

কোড ব্যাখ্যা:

প্রথমত: (গুরুত্বপূর্ণ) পূর্বনির্ধারিত ভেরিয়েবলগুলি।

Q: Evaluated input.
b: The newline character, '\n'
d: A space, ' '

দুটি লাম্বদা সংজ্ঞা রয়েছে।

M           | g(G)(H), used for moving Q numbers at a time.
            | We will call these Q numbers a "(number) block"
 t          | Tail, used to remove beginning newline
  *Q        | Repeat the following Q times
    +++bGdH | '\n' + G + ' ' + H. Just a whole bunch of concatenating.
            |
M           | n(G)(H), used for figuring out which stacks to move from
 |       Q  | If the following code is 0 (false), then use Q instead
  %     Q   | Mod Q
   +   H    | Add H
    y       | Multiply by 2
     _G     | Negate (remember in the explanation part 2? Always 2 stacks above?)

স্ট্যাক এক্সচেঞ্জিং: অংশ 1

g1 2                       | Move the 1 block to stack 2
    ++Qd1                  | Move a Q to stack 1
         g2 3              | Move the 1 block to stack 3
             g2 1          | Move the 2 block to stack 1
                 g3 1      | Move the 1 block back to stack 1
                     ++Qd2 | Move a Q to stack 2
 v---Code-continuation---' |I don't have enough room!!!
Vr3Q                       | For N in range(3, Q)
    gNtN                   | Move the number block in stack N up 1
        ++QdN              | Move a Q to stack N
             ;g1Q          | End for loop; move the 1 block to the last stack

স্ট্যাক এক্সচেঞ্জিং: অংশ 2

VStQ                           | For N in [1, 2, ..., Q - 1]
    VStQ                       | For H in [1, 2, ..., Q - 1]
        I<NH                   | If N < H
            g                  | Number block move
             nNH               |  (find number block)
                nNtH           |  (find the previous stack)
                    )          | End "For H"
                     ++nN0dnNH | Find start, move number to next location down

আমি ইতিমধ্যে জানি আমি ব্রাউন পয়েন্ট পাচ্ছি না, কারণ আমি আরও অনেক দক্ষ এবং আরও জটিল পদ্ধতি দেখতে পাচ্ছি :(

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