হানয় সলভারের টাওয়ার


10

হ্যানয়ের টাওয়ারটি কী তা সম্পর্কিত উল্লেখের জন্য, এটি গুগল করুন বা উইকিপিডিয়া পৃষ্ঠায় সন্ধান করুন ।

আপনার কোডটি 2 টি করতে সক্ষম হবে এবং সেগুলি নিম্নলিখিত:

  • হ্যানয় টাওয়ারের শুরুতে ডিস্কের সংখ্যা নির্দিষ্ট করে এমন ব্যবহারকারী ইনপুট গ্রহণ করুন
  • টাওয়ার ধাঁধাটির সমাধানটি দেখানোর জন্য আপনার পছন্দের ফ্যাশনে আউটপুট তৈরি করুন (এটি কোনওভাবেই যৌক্তিক হিসাবে দীর্ঘ)।

লজিকাল আউটপুট এর উদাহরণ নিম্নলিখিত হবে (4 ডিস্ক স্টার্ট ব্যবহার করে):

L1L2C1L1R-2R-1L1L2C1C-1R-2C1L1L2C1

Lবাম প্যাগটি Cউপস্থাপন করে, কেন্দ্রের খোঁচাকে Rউপস্থাপন করে এবং ডান প্যাগটি উপস্থাপন করে এবং সেই পেগের উপর ডিস্কটি কতদূর সরিয়ে নিয়ে যেতে হবে এবং সংখ্যাগুলি সেগুলির সংখ্যা। ধনাত্মক সংখ্যাগুলি ডানদিকের প্যাগের দিকে অগ্রসর হওয়া পেগের সংখ্যাটি উপস্থাপন করে (কারণ ডিস্কগুলি বামতম খোঁচায় শুরু হয়)।

হ্যানয় টাওয়ার থেকে নিয়ম সহজ:

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

ডিস্কগুলি বামে খোঁচা থেকে শুরু হয়, নীচে বৃহত্তম, শীর্ষে ছোট, প্রাকৃতিকভাবে।


আমাদের কি ইচ্ছামত বড় টাওয়ারগুলি সমাধান করার দরকার আছে, বা 10, 100, 1 কে, 1 এম ডিস্কের মতো আমরা ধরে নিতে পারি এমন কোনও সীমা রয়েছে?
ব্যবহারকারীর অজানা

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

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

উত্তর:


2

কাস্তে , 5 বাইট

↑≠⁰İr

এটি অনলাইন চেষ্টা করুন! আউটপুট এর
প্রতিটি পরবর্তী উপলব্ধ পেগ (চক্রাকারে মোড়ানো) এ nচলন্ত ডিস্ককে উপস্থাপন করে n

ব্যাখ্যা

   İr   The ruler sequence [0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, ...]
↑       Take while...
 ≠⁰     ... not equal to the input.

7

পাইথন, 76 টি অক্ষর

def S(n,a,b):
 if n:S(n-1,a,6-a-b);print n,a,b;S(n-1,6-a-b,b)
S(input(),1,3)

উদাহরণস্বরূপ, এন = 3 এর জন্য এটি ফিরে আসে:

1 1 3  (move disk 1 from peg 1 to peg 3)
2 1 2  (move disk 2 from peg 1 to peg 2)
1 3 2  (move disk 1 from peg 3 to peg 2)
3 1 3  ...
1 2 1
2 2 3
1 1 3

আমি জানি আমি খেলায় কিছুটা দেরি করেছি তবে এটি 13 টি অক্ষর শেভ করেছে: tio.run/##K6gsycjPM/r/…
জেসি

6

পার্ল - 54 টি অক্ষর

for(2..1<<<>){$_--;$x=$_&-$_;say(($_-$x)%3,($_+$x)%3)}

perl -M5.010স্ট্যান্ডিনে ডিস্কের সংখ্যাটি দিয়ে প্রবেশ করুন এবং প্রবেশ করুন।

আউটপুট ফরমেট:

সরানো প্রতি এক লাইন, প্রথম অঙ্কটি পেগ থেকে, দ্বিতীয় সংখ্যাটি প্যাগের (0 থেকে শুরু) হয়

উদাহরণ:

02 -- move from peg 0 to peg 2
01
21
02
10
12
02

ধনুর্বন্ধনী অপসারণ করে 5 টি অক্ষর সংরক্ষণ করুন। $x=--$_&-$_,say(($_-$x)%3,($_+$x)%3)for 2..1<<<>
মেরিনাস

5

গল্ফস্ক্রিপ্ট ( 31 25 24 অক্ষর)

])~{{~3%}%.{)3%}%2,@++}*

ইলমারি করোনেনকে ধন্যবাদ জানাতে যে আমার মূল trগুলি / আদেশগুলি 6 টি দ্বারা সংক্ষিপ্ত করা যেতে পারে। সেগুলিকে দুটি ক্রমের পণ্য হিসাবে দ্রবীভূত করে আমি আরও একটি সংরক্ষণ করতে সক্ষম হয়েছি।

নোট করুন যে 3%একটি চরিত্র দ্বারা বৃদ্ধি দৈর্ঘ্য ফ্যাক্টরিং :

])~{{~}%.{)}%2,@++}*{3%}%

কিছু লোকের কাছে সত্যই জটিল আউটপুট ফর্ম্যাট থাকে। এর ফলে পেগ সরানো হয়েছে (0, 1, 2 নাম্বারযুক্ত) এবং প্যাগটি সরানো হয়েছে। কোন প্যাগটি সরানো হবে তা অনুমানটি বলে না, তাই এটি প্যাগ 1 এ চলে যায়।

যেমন

$ golfscript hanoi.gs <<<"3"
01021201202101

নিঃসন্দেহে সেডে একই যুক্তিটি আরও সংক্ষিপ্ত, তবে আমার সেড ক্ষমতাগুলি এটির উপর নির্ভর করে না।
পিটার টেইলর

1
আপনি এটি 25 টি ])~{.{3^3%}%2,@{2\-}%++}*
অক্ষরে

3

পার্ল, 75 79 টি চর

সম্পূর্ণভাবে কীথ র্যান্ডাল এর আউটপুট বিন্যাস চুরি করছে:

sub h{my($n,$p,$q)=@_;h($n,$p^$q^h($n,$p,$p^$q),$q*say"@_")if$n--}h pop,1,3

সঙ্গে ডাকা -M5.010জন্য say

(আমি মনে করি আপনি যদি ফাংশনটির রিটার্ন ভ্যালুটি কেবল দমন না করে ব্যবহার করার উপায় খুঁজে পান তবে এটির উন্নতি হতে পারে))


[স্টক "কেবল ব্যবহার করুন say" সুপারিশ করুন]
জেবি

ঠিক আছে - তবে আমার চরের গণনার তুলনায় আমাকে কি 5.10 বৈশিষ্ট্যগুলি সক্ষম করার জন্য খরচটি অন্তর্ভুক্ত করতে হবে না?
ব্রেডবক্স

1
আপনি চাইবেন তবে এটি বিনামূল্যে। আপনার প্রোগ্রামটি কীভাবে আবেদন করবেন তা কেবল একটি নোট তৈরি করুন যাতে পার্লের অনুরোধের সুনির্দিষ্ট পদ্ধতিতে সাবলীল লোকেরা যেভাবেই এটিকে শট দিতে পারে।
জেবি

লিঙ্কের জন্য ধন্যবাদ; আমি আগে এই ধরণের জিনিস খুঁজছিলাম।
ব্রেডবক্স

3

এসএমএল, 63

fun f(0,_,_)=[]|f(n,s,t)=f(n-1,s,6-s-t)@[n,s,t]@f(n-1,6-s-t,t);

এর সাথে কল করুন f(n,s,t):

  • ডিস্কের সংখ্যা
  • গুলি শুরু
  • টি লক্ষ্য পয়েন্ট

2

বাশ (rs৪ অক্ষর)

t(){ tr 2$1 $12 <<<$s;};for((i=$1;i--;))do s=`t 1`01`t 0`;done;t

কারণ আমি পুনঃব্যবহার মত GolfScript এক দুইবার দৈর্ঘ্য চেয়ে বেশি থাকা সত্ত্বেও এই এক পোস্ট tহিসেবে সেবা করার জন্য echo $s


2

স্কালা, 92 88 87 অক্ষর

def?(n:Int,a:Int,b:Int){if(n>0){?(n-1,a,a^b)
print(n,a,b);?(n-1,a^b,b)}};?(readInt,1,3)

আউটপুট ফরমেট

ডিস্কের সংখ্যা বলুন = 3 তারপর,

(1,1,3)(2,1,2)(1,3,2)(3,1,3)(1,2,1)(2,2,3)(1,1,3) (disk number,from peg, to peg)
                                                   \---------------------------/       
                                                            Move 1              ... Move n

জোর এর দুর্দান্ত ব্যবহার।
পিটার টেলর

2

সি, 98 92 87 টি চর

সর্বাধিক তুচ্ছ আলগোরিদিম প্রয়োগ করে।
আউটপুট সেই ফর্মটিতে রয়েছে ab ab abযেখানে প্রতিটি জুটির অর্থ "শীর্ষ ডিস্কটি পেগ এ থেকে পেগ বিতে সরিয়ে নেওয়া হয়"।
সম্পাদনা : চালগুলি এখন হেক্স-এ এনকোড করা হয়েছে - 0x12 মানে পেগ 1 থেকে পেগ 2 এ সরানো some
সম্পাদনা : প্যারামিটারের পরিবর্তে স্টিডিন থেকে সংখ্যাটি পড়ে। অপেক্ষাকৃত ছোট।
উদাহরণ:
% echo 3 | ./hanoi
13 12 32 13 21 23 13

n;
h(d){n--&&h(d^d%16*16,printf("%02x ",d,h(d^d/16))),n++;}
main(){scanf("%d",&n);h(19);}

কেউ কি ফাংশন এইচ () এর শরীরের বাক্য গঠনটি ব্যাখ্যা করতে পারেন - বিশেষত এর পুনরাবৃত্ত কল (d ^ d% 16 * 16 এবং প্রিন্টফ (...)) এর আপাতদৃষ্টিতে দুটি যুক্তি এবং শেষ ক্রমটি দৃশ্যত শেষটি স্তব্ধ হয়ে যেতে পারে। আমার জ্ঞানের উপর ভিত্তি করে, সেই ফাংশনে দুটি সিনট্যাক্স ত্রুটি রয়েছে, তবে আমি ইতিমধ্যে জানি যে এটি তৈরি করে (স্টিডিও অন্তর্ভুক্ত করার পরে) এবং সঠিকভাবে সম্পাদন করে।
গ্রিফিন

1
ফাংশন যতটা চায় তার চেয়ে বেশি পরামিতি পাস করা সম্ভব। তাদের মান কোথাও যায় না। h(x,printf(...))কল printfকরার আগে কেবল কল করার একটি উপায় h। অন্তিম রিটার্ন n++পরে শেষ করা হয় h। এটি প্রাথমিকটি পূর্বাবস্থায় ফেলার জন্য ব্যবহৃত হয় n--
ugoren

ধন্যবাদ, এটি উপলব্ধি করে (এন ++ এর উদ্দেশ্যটি স্পষ্ট ছিল)। কেন একটি অর্ধকোলন পূর্ববর্তী ক + ক + এর পরিবর্তে এন ++ নেই, বা এটি কোনও পার্থক্য করে?
গ্রিফিন

@ গ্রিফিন, আসলে ;এখানে একই হবে। ,প্রায়শই দরকারী (উদাহরণস্বরূপ if(x)a,b;প্রতিস্থাপন if(x){a;b;}), তবে এখানে কোনও সুবিধা নেই।
ugoren

2

জেলি , 5 বাইট

2*Ṗọ2

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

0ক্ষুদ্রতম ডিস্কের এক স্থান ডান দিকে সরান (প্রয়োজনে আবার শুরুতে মোড়ানো)
1দ্বিতীয়-বৃহত্তমতম ডিস্কটিকে কেবলমাত্র অন্যান্য আইনী কলামে
2সরান তৃতীয়-ক্ষুদ্রতম ডিস্কটিকে কেবল অন্য আইনী কলামে সরান
ইত্যাদি etc.

অ্যালগরিদম

আমরা হ্যানয় সমস্যার টাওয়ারগুলির সমাধান পুনরাবৃত্তভাবে দেখতে পাই; আকারের একটি স্ট্যাক সরাতে এন থেকে একজন থেকে বি , আকার একটি স্ট্যাক সরাতে এন -1 থেকে একটি থেকে সি , তারপর আকারের ডিস্ক এন থেকে একজন থেকে বি , তারপর আকারের একটি স্ট্যাক সরাতে এন -1 থেকে বি থেকে সি । এটি নিম্নলিখিত ফর্মের একটি প্যাটার্ন তৈরি করে (এই প্রোগ্রামটি দ্বারা ব্যবহৃত আউটপুট ফর্ম্যাটে):

0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2 …

আমরা পর্যবেক্ষণ করতে পারি যে এই ক্রমটি OEIS এ A007814 । অনুক্রমের আরেকটি সম্ভাব্য সংজ্ঞা হ'ল "সিক্যুয়েন্সের কে- থ (1-ভিত্তিক) উপাদানটি বাইনারিতে লেখা হয় তখন k এর সংখ্যার শেষে শূন্যের সংখ্যা "। এবং এটি এখানে প্রোগ্রাম গণনা করা হয়।

ব্যাখ্যা

প্রথমত, আমরা দ্রবণটির চালগুলির সংখ্যা গণনা করি, 2 এন -1। এটি কেবলমাত্র একটি অতিরিক্ত পদক্ষেপ গণনা করতে এবং পরে এটিকে বাতিল করতে সংক্ষিপ্ত হতে দেখা যায়, সুতরাং এটি 2*অর্থাত্ কোনও কিছুর শক্তিতে 2। (আমরা এখনও অবধি কেবলমাত্র ইনপুটটি নিয়েছি তা হ'ল কমান্ড লাইন আর্গুমেন্ট, যাতে এটি ডিফল্টরূপে ব্যবহৃত হয়))

এর পরে, আমরা বেস মধ্যে একটি সংখ্যা শেষে শূন্যর সংখ্যা গণনা করার জন্য জেলি এর builtin ব্যবহার ; যে । আমরা যেমন বাইনারি গণনা করছি, এটি । আমাদের যা করতে হবে তা হ'ল 1 থেকে 2 এন -1 সহ সংখ্যায় এই বিল্টিনটিকে প্রয়োগ করা ।bọ2

সেখানে জেলি সংখ্যা একটি সীমার পুনরুক্তি উপর দুই কিছু সহজ উপায়, এবং R, এবং এই সমস্যা আমার আগের প্রচেষ্টা এই এক ব্যবহার করা হয়েছে। তবে, এই ক্ষেত্রে সামান্য খাটো হওয়া সম্ভব: যখন কোনও সংখ্যাকে ইনপুট হিসাবে দেওয়া হয়, তখন আপনাকে একটি পুনরাবৃত্তি করতে দেয় যা একটি উপাদানকে সংক্ষেপে থামিয়ে দেয় (সাধারণভাবে, কোনও কিছুর এক উপাদান ছাড়া সমস্ত প্রক্রিয়াজাত করতে ব্যবহৃত একটি অন্তর্নিহিত)। ঠিক যে আমরা এই ক্ষেত্রে কি আপনি চান (কারণ 2*এক অনেকগুলি elments উত্পন্ন), তাই লিঙ্ক এটি ব্যবহার 2*এবং ọ2মধ্যে 2*Ṗọ2আমাদের সমস্যার একটি 5-বাইট সমাধান দেয়।



1

বাশ স্ক্রিপ্ট, 100 96 টি অক্ষর

t(){ [[ $1<1 ]] && return
t $(($1-1)) $2 $(($2^$3))
echo $@
t $(($1-1)) $(($2^$3)) $3
}
t $1 1 3

আউটপুট ফর্ম্যাট কীথ র্যান্ডাল এর মতো।

1 1 3
2 1 2
1 3 2
3 1 3
1 2 1
2 2 3
1 1 3

সম্পাদনা : পিটারের মন্তব্যে 4 টি অক্ষর সংরক্ষণ করা হয়েছে


1
প্রতিধ্বনিত করে আপনি শূণ্যস্থান যোগ করতে এবং কয়েকটি অক্ষর সংরক্ষণ করতে পারেন$@
পিটার টেলর

@ পিটারটেলর: ভালো কথা। আমাকে এটি আপডেট করতে দিন।
যুবরাজ জন ওয়েসলি

1

জে, 23 বাইট

বাইনারি সংখ্যা সমাধান

2&(+/@:~:/\)@#:@i.@^~&2

এই সমাধানটিতে এই ভিডিওতে বর্ণিত বাইনারি গণনা পদ্ধতি ব্যবহার করা হয়েছে ।

কোনটা বলা হল, আমি বাইনারি ডিজিট উৎপন্ন থেকে 1আপ 2^n, তারপর 2 দৈর্ঘ্যের infixes গ্রহণ করা এবং পূর্ববর্তী সংখ্যা সংশ্লিষ্ট বিট প্রতিটি বিট তুলনা, এবং যদি তারা অসম চেক করুন। অসম বিটের সংখ্যা হ'ল এই পদক্ষেপের আউটপুট।

আউটপুট, উদাহরণস্বরূপ, 3 টি ডিস্কের জন্য, যেখানে সবচেয়ে ছোট ডিস্ককে 1 টি লেবেলযুক্ত:

1 2 1 3 1 2 1

1 মানে "ক্ষুদ্রতম ডিস্কটি এক পেগ ডানদিকে সরান, প্রয়োজনে প্রথম পেগের দিকে ফিরে লুপিং করুন"

n, অন্য সকলের জন্য n, " nএকটি আইনী পেগতে ডিস্ক সরান" এর অর্থ (সর্বদা একদম ঠিক থাকবে)

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

পুনরাবৃত্তির সমাধান

((],[,])$:@<:)`]@.(1=])

উপরের সমাধান হিসাবে একই আউটপুট, কিন্তু যুক্তি এখানে সমস্যা পুনরাবৃত্ত প্রকৃতি পরিষ্কার করে তোলে।

এটি একটি গাছ হিসাবে দৃশ্যমান করা এই বিষয়টিকেও জোর দেয়:

              4
             / \
            /   \
           /     \
          /       \
         /         \
        /           \
       /             \
      3               3      
     / \             / \    
    /   \           /   \
   /     \         /     \ 
  2       2       2       2  
 / \     / \     / \     / \
1   1   1   1   1   1   1   1

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


1
আপনার প্রশ্নটি মূল প্রশ্নটি উত্থাপিত হওয়ার ৪০ বছরেরও বেশি সময় পরে আপনার উত্তর জমা দেওয়ার কাকতালীয় প্রকৃতি যা আমি এই প্রশ্নের উত্তরগুলি পর্যালোচনা করতে ফিরে এসেছি যে আমি 5 বছর আগে জমা দিয়েছিলাম ... বাহ! +1
কার্টার পেপ



0

আর , 73 বাইট

মানচিত্রে আর লাগানো। সরলিকৃত ইনপুট সহ [কীথ র্যান্ডাল এর উত্তর] [1] দ্বারা অনুপ্রাণিত, কেবল প্রিন্ট করুন এবং 2 বাইট সংরক্ষণ করতে পেগ শুরু করুন। 0-ইনডেক্সড পেগসও।

f=function(n,s=0,e=2){if(n){f(n-1,s,3-s-e)
print(c(s,e))
f(n-1,3-s-e,e)}}

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


0

জাভাস্ক্রিপ্ট (ES6), 45 বি

h=(n,f,a,t)=>n?h(--n,f,t,a)+f+t+h(n,a,f,t):''

যেমন কলিং h(4, 'A', 'B', 'C')(সহায়ক পেগ বি ব্যবহার করে পেগ এ থেকে পেগ সিতে 4 টি ডিস্ক সরান)

প্রত্যাবর্তন 'ABACBCABCACBABACBCBACABCABACBC'(পেগ এ থেকে পেগ বিতে একটি ডিস্ক স্থানান্তরিত করুন, পেগ এ থেকে পেগ সিতে একটি ডিস্ক স্থানান্তর করুন, পেগ বি থেকে পেগ সিতে একটি ডিস্ক স্থানান্তর করুন ইত্যাদি)


1
খুশী হলাম। আমি ভাবছি যে, f, a, t পরামিতিগুলি ফাংশন সংজ্ঞাতে অন্তর্ভুক্ত হওয়া উচিত? অন্যথায় জমা দেওয়ার ক্ষেত্রে অতিরিক্ত আরগগুলিতে স্বেচ্ছাসেবীর ডেটা অন্তর্ভুক্ত থাকতে পারে। যদিও আমি একজন নবাগত, তাই আরও অভিজ্ঞ কাউকে পরামর্শ দেওয়া উচিত।
জন রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.