3 এবং 5 লিটার জগ ধাঁধা


14

আপনি ডাই হার্ড এটিকে দেখে থাকতে পারেন : একটি প্রতিশোধ নিয়ে ... এই প্রশ্নটি বিখ্যাত 3 এবং 5 লিটার জগ ধাঁধাটির উপর ভিত্তি করে, তবে কিছুটা আলাদা ত্রুটিযুক্ত।

কিছু কোড গল্ফ আপ করুন যে 1 এবং 100 এর মধ্যে একটি পূর্ণসংখ্যা দেওয়া হলে 3 লিটার জগ এবং 5 লিটার জগ ব্যবহার করে ঝর্ণা থেকে কোনও ট্যাঙ্ক, সমান সংখ্যক লিটার জল মাপার দ্রুত নির্দেশাবলী আপনাকে সরবরাহ করবে with

জগগুলির কোনওটিতেই কোনও গ্রেডেশন নেই; ঝর্ণা জলের সরবরাহে প্রচুর পরিমাণে, এবং কোডটির প্রতিটি সম্পাদন শুরু হওয়ার পরে ট্যাঙ্কটি খালি করে ধরা হয়।

একবার ট্যাঙ্কে প্রবেশের পরে আপনি ট্যাঙ্ক থেকে জল অ্যাক্সেস করতে পারবেন না।

মৃত্যুদন্ড কার্যকর করার বিন্যাসটি নিম্নরূপ:

ইনপুট:

4 উদাহরণ স্বরূপ.

আউটপুট

5L জগ, 3 এল জগ এবং ট্যাঙ্কের ভলিউমের একটি টেল অনুসারে প্রতিটি সংখ্যাযুক্ত পদক্ষেপ আউটপুট করুন। ট্যালি ফর্ম্যাটটি নীচেও দেখানো হয়েছে। পদক্ষেপের শেষে পদক্ষেপের সংখ্যাও আউটপুট করা আবশ্যক।

1) Fill 5L jug

5L: 5, 3L: 0, T: 0

2) Pour from 5L jug into 3L jug

5L: 2, 3L: 3, T: 0

3) Empty 3L jug

5L: 2, 3L: 0, T: 0

4) Pour from 5L jug into 3L jug

5L: 0, 3L: 2, T: 0

5) Fill 5L jug

5L: 5, 3L: 2, T: 0

6) Pour from 5L jug into 3L jug

5L: 4, 3L: 3, T: 0

7) Pour from 5L jug into tank

5L: 0, 3L: 3, T: 4

Volume measured out in 7 turns

উদাহরণ 2

ইনপুট: 8

আউটপুট:

1) Fill 5L jug

5L: 5, 3L: 0, T: 0

2) Pour from 5L jug into tank

5L: 0, 3L: 0, T: 5

3) Fill 3L jug

5L: 0, 3L: 3, T: 5

4) Pour from 3L jug into tank

5L: 0, 3L: 0, T: 8

Volume measured out in 4 turns

কনভেনশন

  1. Fill xL jug - ঝর্ণা থেকে সম্পর্কিত জগটি শীর্ষে পূরণ করে
  2. Empty xL jug - ঝর্ণায় সম্পর্কিত জগের বিষয়বস্তু খালি করে
  3. Pour from xL jug into yL jug - এক্সএল জগের বিষয়বস্তুগুলিকে yL জগতে oursালুন
  4. Pour from xL jug into tank - এক্সএল জগের সামগ্রীগুলি ট্যাঙ্কে oursেলে দেয়

সংক্ষিপ্ততম কোড জিতেছে।



4
@ হওয়ার্ড, পুরানো প্রশ্নটি নির্ধারিত (কোনও জয়ের মানদণ্ড নেই) এবং তা পরিত্যাগ করা হয়েছে, সুতরাং আমি মনে করি যে এটি ভাল এবং এটি বন্ধ করা উচিত নয়।
ভিক্টর স্টাফুসা

আমাকে পাগল বলুন, তবে সর্বোত্তম সমাধানটি 1 হতে চলেছে না possible যতটা সম্ভব 5L যোগ করুন, 2. প্রয়োজনে 3L যোগ করুন, 3. প্রয়োজনীয় হিসাবে ইতিমধ্যে সমাধান হওয়া 2L বা 1L অংশ যুক্ত করুন?

1
@ লেগোস্টোরমাট্রোপ্র যখন এগুলি সমস্ত সিদ্ধ হয়, সত্য। তবে আমি এটি অনুসারে কোড-গল্ফ হওয়ার আশা করছি।
ওয়ালিওয়েস্ট

3
@ লেগোস্টোরমট্রোপ্র আমিও ভেবেছিলাম, তবে 6 এবং ৯ টি প্রতিবিম্ব নয়?
পল প্রেস্টিজ

উত্তর:


6

রুবি, 407 376 365 331 324 323

এটি পড়তে একরকম কষ্ট হচ্ছে ...

x=y=n=d=0
g=gets.to_i
"#{[43435,102,t=45,t,12,t,12,t,t][g+~d]||12}".chars{|c|n+=1
puts [eval(["x-=t=[3-y,x].min;y+=t"+t=";'Pour from 5L jug into 3L jug'","x=5;'Fill 5L jug'","d+=x;x=0"+t.sub(/3.+/,"tank'")][c.ord%3].tr t='35xy',c<?3?t:'53yx'),"5L: #{x}, 3L: #{y}, T: #{d}"]}while g>d
$><<"Volume measured out in #{n} turns"

STDIN এ ইনপুট নেয়। এন = 10 এর জন্য রান উদাহরণ:

Fill 5L jug
5L: 5, 3L: 0, T: 0
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
Fill 5L jug
5L: 5, 3L: 0, T: 5
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 10
Volume measured out in 4 turns

2
"এটি পড়তে একরকম কষ্ট হচ্ছে ..." - ডুড, কোড গল্ফের বিন্দু কি তাই না ...? ;)
ওয়ালিওয়েস্ট

4
নিবন্ধন করুন তাদের জন্য আমাদের একটি [অবরুদ্ধ] ট্যাগ রয়েছে! আমার নম্র মতামতটি হবে একই দৈর্ঘ্যের দুটি কোডগল্ফ সমাধানগুলির মধ্যে, সবচেয়ে পঠনযোগ্য একটি সেরা হবে।
মিস্টার লিস্টার

@ মিস্টারলিস্টার ফেয়ার পর্যাপ্ত, তবে কখনও কখনও
অনাকাঙ্ক্ষিত

5

টি-এসকিউএল 2012: 1410 1302

এসকিউএল-এর একটি প্রশ্নে আরও একটি কুইক্সোটিক প্রচেষ্টা, তবে এটি একটি সংস্করণ ২০১২-এ নতুন কিছু উইন্ডো ফাংশন বিকল্পের সাথে খেলতে একটি উপভোগ করার সুযোগ দিয়েছে addition এছাড়াও, এটি পুনরাবৃত্ত সিটিই ব্যবহার করে, যা বেশিরভাগ প্রোগ্রামিং ভাষায় আকর্ষণীয় কিছু নাও হতে পারে, তবে পুনরাবৃত্তি এসকিউএল হ'ল ঘোড়া এবং বগি থেকে ফেরারিতে স্যুইচ করার মতো।

এর কেন্দ্রস্থলে ইঞ্জিনটি 5-12 লাইনে রয়েছে, যা সমস্যাটি সমাধানের জন্য প্রয়োজনীয় সংখ্যার একটি টেবিল তৈরি করতে পুনরাবৃত্ত সিটিই এবং একটি উইন্ডো ফাংশন ব্যবহার করে। বিশেষত 3, 4, 6, বা 9 এর জন্য পরীক্ষাটি নোট করুন, যা সেই সংখ্যার পরে 3s দ্বারা সমাধানের সর্বোত্তম পদ্ধতির নিশ্চয়তা দেয়। (প্রযুক্তিগতভাবে, এটি 3-1 পদ্ধতির এবং 2-2 এর মধ্যে 4 এর জন্য একটি টাই, তবে এটি এভাবে চালিয়ে আমাকে প্রচুর চরিত্রের গল্ফ করে তুলেছে)) তারপরে বিভিন্নটির জন্য সর্বোত্তম পদক্ষেপগুলির অনুসন্ধানের টেবিলে যোগ দেওয়া সাধারণ বিষয় matter সমস্যার অংশ এবং সঠিকভাবে পদক্ষেপগুলি সংখ্যার জন্য অন্য উইন্ডো ফাংশন ব্যবহার করুন।

আপনার যদি এমএস এসকিউএল পড়ে না থাকে তবে এটি এসকিউএলফিডেলে খেলুন।

DECLARE @i INT=42,@l VARCHAR(9)='L jug ',@k VARCHAR(99)='into tank
5L: 0, 3L: 0, T: ',@o VARCHAR(99)='
5L: 5, 3L: 0, T: ',@n CHAR(1)='
',@5 VARCHAR(99)=') Pour from 5',@3 VARCHAR(99)=') Pour from 3'
;WITH t AS (SELECT @i i,(@i-@i%5)%5 j
UNION ALL
SELECT i-5,(i-i%5)%5+5 FROM t WHERE i>=5 AND i NOT IN(6,9)
UNION ALL
SELECT i-3,3FROM t WHERE i in(3,4,6,9)
UNION ALL
SELECT i-i,i FROM t WHERE i<3 AND i>0)
SELECT t.i,t.j,v.s,ROW_NUMBER()OVER(PARTITION BY t.j ORDER BY t.i DESC)x,SUM(t.j)OVER(ORDER BY t.i DESC ROWS UNBOUNDED PRECEDING)y INTO #q FROM(VALUES(1,5),(2,3),(3,2),(5,2))v(i,s) JOIN t ON t.j = v.i
SELECT z.b FROM(SELECT ROW_NUMBER()OVER(ORDER BY q.i DESC,w.s)a,CAST(ROW_NUMBER()OVER(ORDER BY q.i DESC,w.s)AS VARCHAR)+w.v+CAST(y-CASE WHEN q.s!=w.s THEN q.j ELSE 0 END AS VARCHAR)b
FROM(VALUES(5,1,') Fill 5'+@l+@o),(5,2,@5+@l+@k),(3,1,') Fill 3'+@l+@n+'5L: 0, 3L: 3, T: '),(3,2,@3+@l+@k),(2,1,') Fill 5'+@l+@o),(2,2,@5+@l+' into 3'+@l+@n+'5L: 2, 3L: 3, T: '),(2,3,@5+@l+@k),(1,1,') Fill 3'+@l+@n+'5L: 0, 3L: 3, T: '),(1,2,@3+@l+'into 5'+@l+@n+'5L: 3, 3L: 0, T: '),(1,3,') Fill 3'+@l+@n+'5L: 3, 3L: 3, T: '),(1,4,@3+@l+'into 5'+@l+@n+'5L: 5, 3L: 1, T: '),(1,5,@3+@l+'into tank'+@o))w(i,s,v)JOIN #q q ON w.i=q.j
UNION
SELECT 99,'Volume measured out in '+CAST(COUNT(*)AS VARCHAR)+' turns'
FROM #q)z

ইনপুট 42 এর ফলাফল:

1) Fill 5L jug 
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 5L jug 
5L: 5, 3L: 0, T: 5
4) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 10 
5) Fill 5L jug 
5L: 5, 3L: 0, T: 10 
6) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 15 
7) Fill 5L jug 
5L: 5, 3L: 0, T: 15 
8) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 20 
9) Fill 5L jug 
5L: 5, 3L: 0, T: 20 
10) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 25 
11) Fill 5L jug 
5L: 5, 3L: 0, T: 25 
12) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 30 
13) Fill 5L jug 
5L: 5, 3L: 0, T: 30 
14) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 35 
15) Fill 5L jug 
5L: 5, 3L: 0, T: 35 
16) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 40 
17) Fill 5L jug 
5L: 5, 3L: 0, T: 40 
18) Pour from 5L jug  into 3L jug 
5L: 2, 3L: 3, T: 40 
19) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 42 
Volume measured out in 9 turns 

সম্পাদনা:

দ্বারা একটি শালীন স্কোর উন্নতি আউট

  • সিটিইর প্রথম সারিতে একটি অপ্রয়োজনীয় +5 অপসারণ করা এবং যেখানে এটির প্রয়োজনীয়তা রয়েছে
  • ব্যয়বহুল বিবরণী সাশ্রয় করে VALUES টেবিলগুলি ইন-আস্তরণ করা
  • উইন্ডোজ ডাবল-বাইট সিআরএলএফসকে এবার ইউনিক্স স্টাইলে রূপান্তর করার কথা মনে আছে।

সাহসিকতার জন্য +1, বন্ধু ... খুব চিত্তাকর্ষক এবং এমএস এসকিউএল ফিডল লিঙ্কটির জন্য ধন্যবাদ!
ওলিওয়েস্ট

1
হাহাহা, থ্যাঙ্কস ম্যান! আমি যখন বিশ্বাস করি যে আমি যখন এটি শুরু করি এবং পুনরাবৃত্তির মূল ক্যোয়ারী ছিল তখন এটি সম্ভবত জয়যুক্ত। তবে বিস্তৃত স্ট্রিং গল্ফিংয়ের পরেও সমস্ত প্রয়োজনীয় পাঠ্য যুক্ত করার ভার্বোসটি আমার চূড়ান্ত সমাধানটিকে নষ্ট করে দিয়েছে। :)
জোনাথন ভ্যান মাত্রে

যদি আমি একটি "সর্বাধিক সৃজনশীল" অনুগ্রহ করতে পারি তবে আপনি এটি পেয়েছেন ...
ওয়াল ওয়েস্ট ওয়েস্ট

আমাকে LOL করার জন্য +1। আপনার কোড-গল্ফ ব্যাগটি বহন করার জন্য টি-এসকিউএল অবশ্যই একটি বিজোড় ক্লাব।
Comintern

5

জাভাস্ক্রিপ্ট: 481

গল্ফিং এ প্রথম প্রচেষ্টা, পরামর্শ প্রশংসা করেছে

n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns")

এটি কিছু সংখ্যার সাথে গণ্ডগোল করে কারণ এটি 3 বা 5 pourালা ভাল কিনা তা যাচাই করে না উদাহরণস্বরূপ: 9 টি 6 এর পরিবর্তে 9 টার্ন দেয়, আমি পরে এটি ঠিক করতে পারি

এটি কনসোলে আটকান

553 থেকে 481 অবধি @ ওয়েল ওয়েস্টকে ধন্যবাদ


1
আপনি চেষ্টা করতে পারেন: n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns") 481 টি অক্ষরের জন্য ...
ওলিওয়েস্ট

@ ওয়েল ওয়েস্ট ধন্যবাদ, ifএস
স্যাম

3

জাভা, 610

class X{int n,c=0,t=0;public void static main(String[]a){n=Integer.parseInt(a[0]);String s,b,f,k,m,u;b="5L";s="3L";k="tank";u="Fill %s jug\n5L: %d, 3L: %d, T: %d";m="\nPour from %s jug into %s\n5L: %d, 3L: %d, T: %d";f=u+m;for(;n>4;)z(f,2,5,b,5,0,t,b,k,0,0,t+=5);while(n!=0){if(n==1)z(f+f+m,5,1,s,0,3,t,s,b,3,0,t,s,3,3,t,s,b,5,1,t,s,k,5,0,t+1);if(n==3)z(f,2,3,s,0,3,t,s,k,0,0,t+3);z(f+m,3,2,b,5,0,t,b,s,2,3,t,b,k,0,3,t+=2);if(n==2)z("Empty 3L jug\n5L: 0, 3L: 0,T: %d",1,0,t)}z("Volume measured out in %d turns",0,0,c)}void z(String s,int o,int w,Object...a){c+=o;n-=w;System.out.println(String.format(s,a))}}

এর সমাধান নিয়েছি Sumedh এবং এটি golfed। আমি এটি মন্তব্যগুলিতে রাখতে চেয়েছিলাম তবে আমার খ্যাতি যথেষ্ট নয় :( এটি 40% কম, আমার মনে হয় এটি কমপক্ষে ভাগ করা উচিত Still তবে এখনও প্রথম থেকে অনেক দূরে ...

এখানে অবারিত:

    class X{
    int n,c=0,t=0;
    public void static main(String[] a){
        n=Integer.parseInt(a[0]);
        String s,b,f,k,m,u;
        b="5L";
        s="3L";
        k="tank";
        u="Fill %s jug\n5L: %d, 3L: %d, T: %d";
        m="\nPour from %s jug into %s\n5L: %d, 3L: %d, T: %d";
        f=u+m;
        for(;n>4;)z(f,2,5,b,5,0,t,b,k,0,0,t+=5);
        while(n!=0)
        {
            if(n==1)z(f+f+m,5,1,s,0,3,t,s,b,3,0,t,s,3,3,t,s,b,5,1,t,s,k,5,0,t+1);
            if(n==3)z(f,2,3,s,0,3,t,s,k,0,0,t+3); 
            z(f+m,3,2,b,5,0,t,b,s,2,3,t,b,k,0,3,t+=2);
            if(n==2)z("Empty 3L jug\n5L: 0, 3L: 0,T: %d",1,0,t);
        }
        z("Volume measured out in %d turns",0,0,c);
    }
    void z(String s,int o, int w,Object... a){
        c+=o;
        n-=w;
        System.out.println(String.format(s,a));
    }
}

বিশেষ দ্রষ্টব্য: এটি কেবল প্রথম রানেই কাজ করে। এটি পুনরায় চালু করুন এবং ফলাফলটি ভুল হবে (বিশ্বব্যাপী ভেরিয়েবলের কারণে)।

নিম্নলিখিত সংস্করণটি নিরাপদ, তবে আমরা 610 থেকে 612 এ গিয়ে 2 চর হারিয়ে ফেলছি:

    class X{
    int n,c,t;
    public void static main(String[] a){
        n=Integer.parseInt(a[0]);
        String s,b,f,k,m,u;
        t=c=0;
        b="5L";
        s="3L";
        k="tank";
        u="Fill %s jug\n5L: %d, 3L: %d, T: %d";
        m="\nPour from %s jug into %s\n5L: %d, 3L: %d, T: %d";
        f=u+m;
        for(;n>4;)z(f,2,5,b,5,0,t,b,k,0,0,t+=5);
        while(n!=0)
        {
            if(n==1)z(f+f+m,5,1,s,0,3,t,s,b,3,0,t,s,3,3,t,s,b,5,1,t,s,k,5,0,t+1);
            if(n==3)z(f,2,3,s,0,3,t,s,k,0,0,t+3); 
            z(f+m,3,2,b,5,0,t,b,s,2,3,t,b,k,0,3,t+=2);
            if(n==2)z("Empty 3L jug\n5L: 0, 3L: 0,T: %d",1,0,t);
        }
        z("Volume measured out in %d turns",0,0,c);
    }
    void z(String s,int o, int w,Object... a){
        c+=o;
        n-=w;
        System.out.println(String.format(s,a));
    }
}

এন = 69 এর জন্য নমুনা আউটপুট:

Fill 5L jug
5L: 5, 3L: 0, T: 0
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
Fill 5L jug
5L: 5, 3L: 0, T: 5
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 10
Fill 5L jug
5L: 5, 3L: 0, T: 10
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 15
Fill 5L jug
5L: 5, 3L: 0, T: 15
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 20
Fill 5L jug
5L: 5, 3L: 0, T: 20
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 25
Fill 5L jug
5L: 5, 3L: 0, T: 25
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 30
Fill 5L jug
5L: 5, 3L: 0, T: 30
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 35
Fill 5L jug
5L: 5, 3L: 0, T: 35
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 40
Fill 5L jug
5L: 5, 3L: 0, T: 40
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 45
Fill 5L jug
5L: 5, 3L: 0, T: 45
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 50
Fill 5L jug
5L: 5, 3L: 0, T: 50
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 55
Fill 5L jug
5L: 5, 3L: 0, T: 55
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 60
Fill 5L jug
5L: 5, 3L: 0, T: 60
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 65
Fill 5L jug
5L: 5, 3L: 0, T: 65
Pour from 5L jug into 3L
5L: 2, 3L: 3, T: 65
Pour from 5L jug into tank
5L: 0, 3L: 3, T: 67
Empty 3L jug
5L: 0, 3L: 0,T: 67
Fill 5L jug
5L: 5, 3L: 0, T: 67
Pour from 5L jug into 3L
5L: 2, 3L: 3, T: 67
Pour from 5L jug into tank
5L: 0, 3L: 3, T: 69
Volume measured out in 33 turns

2

জাভা: 984

এখানে কোড

class X{public static void main(String[] s){int n=Integer.parseInt(s[0]);int t=0;int c=0;while(n>4){n-=5;System.out.println("Fill 5L jug\n5L: 5, 3L: 0, T: "+t+"\nPour from 5L jug into tank\n5L: 0, 3L: 0, T: "+(t+5));t+=5;c+=2;}while(n!=0){switch(n){case 1:System.out.println("Fill 3L jug\n5L: 0, 3L: 3, T: "+t+"\nPour from 3L jug into 5L jug\n5L: 3, 3L: 0, T: "+t+"\nFill 3L jug\n5L: 3, 3L: 3, T: "+t+"\nPour from 3L jug into 5L jug\n5L: 5, 3L: 1, T: "+t+"\nPour from 3L jug into tank\n5L: 5, 3L: 0, T: "+(t+1));n=0;c+=5;break;case 3:System.out.println("Fill 3L jug\n5L: 0, 3L: 3, T: "+t+"\nPour from 3L jug into tank\n5L: 0, 3L: 0, T: "+(t+3));n=0;c+=2;break;default:System.out.println("Fill 5L jug\n5L: 5, 3L: 0, T: "+t+"\nPour from 5L jug into 3L jug\n5L: 2, 3L: 3, T: "+t+"\nPour from 5L jug into tank\n5L: 0, 3L: 0, T: "+(t+2));n-=2;c+=3;t+=2;if(n==2){System.out.println("Empty 3L jug\n5L: 0, 3L: 0,T: "+t);c++;}break;}}System.out.println("Volume measured out in "+c+" turns");}}

ইনপুটটি কমান্ড লাইন থেকে। উদাহরণস্বরূপ: জাভা এক্স 4


আমি অন্য কোথাও মন্তব্য করতে পারি না, তাই আমি এখানে মন্তব্য করছি। @ লেগো স্টর্মট্রোপ্র, একটি বিকল্প সর্বোত্তম সমাধান রয়েছে, যেখানে 4L এর জন্য, আপনি 2L (3 ধাপ) এর জন্য খালি 3L জগের মতো একই কাজ করতে পারবেন, এবং তারপরে অবশিষ্ট 2L এর জন্য পুনরাবৃত্তি করুন, এভাবে এটি 7 টি পদক্ষেপে সম্পূর্ণ করে তুলবে .... যা আপনার সমাধানের জন্য একই যেখানে 4L এর মধ্যে বিভক্ত: 3L ট্যাঙ্কে (2 পদক্ষেপ) এবং 1L বাকী 5 টি ধাপের পদ্ধতি।
সুমেধ

@ ক্রোন, আপনার কোড কি এন এর মানগুলির জন্য কাজ করে, যেখানে এন% 5 1 বা 4? আমি রুবি বুঝতে পারি না, কেন আমি নিজে এটি পরীক্ষা করতে পারছি না ...
সুমেধ

এটির উদাহরণস্বরূপ এখানে এন = 11 এ এক নজর দেওয়া উচিত: ideone.com/3ZDuOS আপনি উপরের-বামে সম্পাদনাটি হিট করতে পারেন এবং যদি আপনি চেক করতে চান তবে STDIN অন্যান্য মানগুলিতে পরিবর্তন করতে পারেন।
পল প্রেস্টিজ

বাহ, আপনি আমার চেয়ে সর্বোত্তম সমাধান পেয়েছেন .... কখন 5L থামাতে হবে এবং পরিবর্তে 3L ব্যবহার করবেন কীভাবে আপনি সিদ্ধান্ত নিবেন? মানে, যদি ইনপুটটি 81 হয় তবে আপনি 5L ব্যবহার করে 75L পর্যন্ত পেতে পারেন এবং তারপরে 3L ব্যবহার করুন। যদি আইপি 89 হয়, তবে 5 এল 80L অবধি ব্যবহার করা হবে, এবং বাকী 3L থাকবে।
সুমেধ

কিছু অক্ষর সংরক্ষণ করুন: main(String[]s), int n=Integer.parseInt(s[0]),t=0,c=0;, java.io.PrintStream q=System.out;। এছাড়াও, whileএক বা দুটি চরিত্রের সংক্ষিপ্ত হিসাবে প্রথমটি লেখা সম্ভব হতে পারে for। তদুপরি, আপনার Stringগুলি পুনরাবৃত্তিযোগ্য, আপনি পুনরাবৃত্ত অংশগুলিকে ভেরিয়েবলগুলিতে সঞ্চয় করার চেষ্টা করতে পারেন বা কেবল একটি প্রিফ্যাব ব্যবহার করে সেগুলি তৈরি করে এমন ফাংশন তৈরি করতে পারেন String
ভিক্টর স্টাফুসা

2

পাইথন 2.7 - 437

সংক্ষিপ্ততম কোড নয়, তবে আমি মনে করি এটি এটি সমাধানের সর্বাধিক অনুকূল উপায়।

আমি মন্তব্যগুলিতে যেমন বলেছি, এটি গণনার সর্বাধিক অনুকূল উপায়:

  1. যতটা সম্ভব 5L এর বেশি অংশ নিন - divmod(amount,5) । এটি আপনাকে বাকী হিসাবে 4,3,2,1 এর মধ্যে একটি দেবে।
  2. বাকী থেকে 3 (সম্ভব হলে) নিন।
  3. যা বাকি 1 বা 2 হিসাবে ছেড়ে যায়। যে কোনওটির জন্য সর্বোত্তম সমাধানটি ব্যবহার করুন যা আগে সময়ের হিসাবে জানা যাবে:

    1. 1 এল, 5 টি পদক্ষেপ: 3 এল -> 5 এল, 3 এল -> 5 এল, 3 এল, 3 এল (1 এল রাখা) -> ট্যাঙ্কে 1L রেখে
    2. 2 এল, 3 পদক্ষেপ: 5 এল -> 3 এল, 2 এল 5 এল, 5 এল (2L ধরে) -> ট্যাঙ্কে ছেড়ে যায়

কোড:

j,T="%dL jug","tank"
A="\n5L: %d, 3L: %d, T: %d"
F,P="Fill "+j+A,"Pour from "+j+" into %s"+A
f,r=divmod(input(),5)
o,t=f*5,[]
for i in range(f):o+=[F%(5,5,0,5*i),P%(5,T,0,0,5*i+5)]
if r>2:o+=[F%(3,0,3,t),P%(3,T,0,0,t+3)];r-=3;t+=3
if r==2:o+=[F%(5,5,0,t),P%(5,j%3,2,3,t),P%(5,T,0,3,t+2)]
if r==1:o+=[F%(3,0,3,t),P%(3,j%5,3,0,t),F%(3,3,3,t),P%(3,j%5,5,1,t),P%(3,T,5,0,t+1)]
print"\n".join(o),'\n',"Volume measured out in %d turns"%len(o)

এবং 7 টি ধাপে 4L এর জন্য একটি আউটপুট:

Fill 3L jug
5L: 0, 3L: 3, T: 0
Pour from 3L jug into tank
5L: 0, 3L: 0, T: 3
Fill 3L jug
5L: 0, 3L: 3, T: 3
Pour from 3L jug into 5L jug
5L: 3, 3L: 0, T: 3
Fill 3L jug
5L: 3, 3L: 3, T: 3
Pour from 3L jug into 5L jug
5L: 5, 3L: 1, T: 3
Pour from 3L jug into tank
5L: 5, 3L: 0, T: 4
Volume measured out in 7 turns

আপনি ওকে একটি ইনট নিযুক্ত করছেন এবং তারপরে একটি তালিকা যুক্ত করার চেষ্টা করছেন। আমার মনে হয় আপনি 5, লাইন 5 এ o, টি = [], এফ * 5 অর্পণ করতে চেয়েছিলেন
psion5mx

1
রেঞ্জের জন্য, হার এবং যদি বিবৃতিগুলি হারান এবং আপনি এটি এক লাইনে 399-তে নামিয়ে নিতে পারেন: j, T = "% dL jug", "ট্যাঙ্ক"; এ = "\ n5L:% d, 3L:% d, T :% d "; এফ, পি =" পূরণ "+ জে + এ," "+ জ + +" থেকে% এস "+ এ; এফ, আর = ডিভোড (ইনপুট (), 5); টি, ও = এফ * 5, []; O = [এফ% (5,5,0,5 * ঝ), পি% (5, টি, 0,0,5 * আমি + 5)] * চ [এফ% (3,0, 3, T), পি% (3, টি, 0,0, টি +3)] * (দ> 2) [এফ% (5,5,0, টি), পি% (5, ঞ% 3, 2,3, টি), পি% (5, টি, 0,3, টি + + 2)] * (R == 2) [এফ% (3,0,3, টি), পি% (3, ঞ % 5,3,0, টি), এফ% (3,3,3, টি), পি% (3, ঞ% 5,5,1, টি), পি% (3, টি, 5,0, টি +1)] * ([১,৪] এ); প্রিন্ট "\ n"। জোইন (ও), "\ n ভলিউম% d টার্নে পরিমাপ করা হয়েছে"% লেন (ও)
psion5mx

1
চিত্তাকর্ষক হেরফের ... @ psion5mx আমি কি পাইনি পাইথনে এই ধরণের প্রোগ্রামিং সম্ভব হয়েছিল? কোন সীমা, পুনরাবৃত্তি বা বিবৃতি যদি?
ওয়ালিওয়েস্ট

তালিকার শক্তি। একটি পূর্ণসংখ্যা দ্বারা একটি তালিকা গুণমান 'লুপগুলি' প্রতিস্থাপন করে। বুলিয়ান দিয়ে গুণ করলে 'ifs' প্রতিস্থাপন করা হয়।
psion5mx

এছাড়াও - আমি এটিকে একটি একক জায়গায় (উদ্ধৃতিগুলির বাইরে) নামাতে সক্ষম হয়েছি, তবে (r [5] [r 1 5in [1,4] এর সাহায্যে ([1,4]) প্রতিস্থাপন করে একটি অক্ষর ব্যয় করে সমস্ত স্থান সরিয়ে ফেলতে পারি ) এক্ষেত্রে.
psion5mx

2

স্মার্টটাক (স্মলটালক / এক্স), 568 560 516

এন ইনপুট:

    T:=j:=J:=c:=0.m:={'Pour from'.' into'.' 3L jug'.' 5L jug'.[j:=j+3.'Fill'].[J:=J+5.'Fill'].[t:=j.j:=0.''].[t:=J.J:=0.''].[r:=j min:5-J.j:=j-r.J:=J+r.''].[r:=J min:3-j.J:=J-r.j:=j+r.''].[T:=T+t.' into tank'].[c:=c+1.'\5L: %1 3L: %2 T: %3\'bindWith:J with:j with:T].['Volume measured out in %1 turns'bindWith:c]}.[n>=0]whileTrue:[s:=n.n:=0.(s caseOf:{0->[n:=-1.'<'].1->'42;02813;42;02813;062:;'.2->'53;03912;073:;'.3->'42;062:;'.4->[n:=1.'42;062:;']}otherwise:[n:=s-5.'53;073:;'])do:[:c|(m at:c-$/)value withCRs print]]

ছেলে এটি অবশ্যই আমি এখনও লেখা সবচেয়ে অবহেলিত প্রোগ্রাম ...

সম্পাদনা করুন: কিছু অন্যান্য ছোট-বড় কাজগুলি অটোডিক্লেয়ারড ওয়ার্কস্পেস ভেরিয়েবলগুলিকে মঞ্জুরি দিতে পারে না এবং আপনাকে ঘোষণাগুলি পুনরায় ব্যয় করতে হবে। এছাড়াও বাইন্ড উইথ: পৃথক হতে পারে (প্রসারিতউথ: '<p>')।

n = 17 এর জন্য নমুনা আউটপুট:

Fill 5L jug 
5L: 5, 3L: 0, T: 0
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
Fill 5L jug 
5L: 5, 3L: 0, T: 5
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 10
Fill 5L jug 
5L: 5, 3L: 0, T: 10
Pour from 5L jug into tank
5L: 0, 3L: 0, T: 15
Fill 5L jug 
5L: 5, 3L: 0, T: 15
Pour from 5L jug into 3L jug 
5L: 2, 3L: 3, T: 15
Pour from 5L jug into tank
5L: 0, 3L: 3, T: 17
Volume measured out in 9 turns

2

সি, 567 609

#define r printf
#define l r("5L: %d, 3L: %d, T: %d\n", a, b, T);
#define j(x,y,z,w) r("%d) "#x" %dL jug\n", i++, y),z=w,l
#define e j(Empty,3,b,0)
#define f j(Fill,5,a,5)
#define g j(Fill,3,b,3)
#define o(x,y,z,w) r("%d) Pour from %dL jug into "x"\n", i++, y,z),w;l
#define t(x,y) T+=x,o("tank",y,0,x=0)
#define p(x) o("%dL jug",5,3,(a-=x,b+=x))
int N,T,i;q(x){int a=0,b=0;switch(x){case 5:f t(a,5) break;case 3:g t(b,3) break;case 1:case 2:case 4:f if(x-2){e p(2)f p(1)if(x-4){e p(3)}}t(a,5)}N-=x;}main(){T=0,i=1,scanf("%d",&N);while(N>5)q((N-6)&&(N-9)?5:3);q(N);r("Volume measured out in %d turns",i-1);}

পূর্ববর্তী অবৈধ সংস্করণ:

#define r printf
#define l r("5L: %d, 3L: %d, T: %d\n", a, b, T);
#define j(x,y,z,w) r("%d) "#x" %dL jug\n", i++, y),z=w,l
#define e j(Empty,3,b,0)
#define f j(Fill,5,a,5)
#define g j(Fill,3,b,3)
#define o(x,y,z,w) r("%d) Pour from %dL jug into "x"\n", i++, y,z),w;l
#define t o("tank",5,0,a=0)
#define p(x) o("%dL jug",5,3,(a-=x,b+=x))
int N,T,i;q(x){int a=0,b=0;switch(x){case 5:f t break;case 3:g t break;case 1:case 2:case 4:f if(x-2){e p(2)f p(1)if(x-4){e p(3)}}t}N-=x;}main(){T=0,i=1,scanf("%d",&N);while(N>5)q(5);q(N);r("Volume measured out in %d turns",i-1);}

এবং এখানে কোড অবহেলা করা হয়েছে:

#define r printf
#define l r("5L: %d, 3L: %d, T: %d\n", a, b, T);
#define j(x,y,z,w) r("%d) "#x" %dL jug\n", i++, y),z=w,l
#define e j(Empty,3,b,0)
#define f j(Fill,5,a,5)
#define g j(Fill,3,b,3)
#define o(x,y,z,w) r("%d) Pour from %dL jug into "x"\n", i++, y,z),w;l
#define t o("tank",5,0,a=0)
#define p(x) o("%dL jug",5,3,(a-=x,b+=x))
int N,T,i;
q(x)
{
    int a=0,b=0;
    switch(x)
    {
        case 5:
            f
            t 
            break;
        case 3:
            g
            t
            break;
        case 1:
        case 2:
        case 4:
            f
            if(x-2)
            {
                e
                p(2)
                f
                p(1)
                if(x-4)
                {
                    e
                    p(3)
                }
            }
            t
    }
    N-=x;
}
main()
{
    T=0,i=1,scanf("%d",&N);
    while(N&gt;
    5)q(5);
    q(N);
    r("Volume measured out in %d turns",i-1);
}

এটি 9 এর জন্য সর্বোত্তম সমাধান দেয় না (8 টার্ন, 6 হওয়া উচিত - 3L 3 বার পূরণ করুন এবং খালি করুন)।
Comintern

এছাড়াও 1 এর
ইনপুটটির

1 এর জন্য কাজ করে না? করুণা ... তবে প্রশংসনীয় প্রচেষ্টা ... :)
ওয়েলওয়েস্ট

হ্যাঁ, কিছু বাগ রয়েছে এবং সমাধানটি সর্বোত্তম নয়। তবে এটি 8 টি ধাপে 1 এল তৈরি করে ...
ভিএক্স

দম্পতি গল্ফ টিপস - আপনি এন, টি, আই প্রতিস্থাপন করে 6 বাইট সংরক্ষণ করতে পারেন; এন, টি, আই, এ, বি সহ; এবং int a = 0, b = 0; a = b = 0 ;. সহ এছাড়াও আপনি (আপনার printf, সংজ্ঞা যোগ করে 3 বাইট ফিরে ভাবতে সবচেয়ে বড় লাভ একটি নেস্টেড তিন সুইচ বিবৃতি হ্রাস করা হবে যদিও -। কেস এবং বিরতি বিবৃতি সত্যিই যোগ করুন।
Comintern

2

সি ( 480 465 বাইট)

#define P printf(
#define O(x) P"%d) Pour from %dL jug into "x"\n"
#define S P"5L: %d, 3L: %d, T: %d\n",F,H,g);}
F,H,s,g,x;l(j){P"%d) Fill %dL jug\n",++s,j);St(j,o,m){O("%dL jug"),++s,j,(j^5)?5:3);Se(j,i){O("tank"),++s,j);Smain(){scanf("%d",&x);while(x>4){x-=5;l(F=5);g+=5;e(5,F=0);}while(x>2){x-=3;l(H=3);g+=3;e(3,H=0);}(x^2)?(x^1)?0:(l(H=3),t(3,H=0,F=3),l(H=3),t(3,H=1,F=5),g++,e(3,H=0)):(l(F=5),t(5,F=2,H=3),g+=2,e(5,F=0));P"Volume measured out in %d turns",s);}

অনুকূল সংস্করণ (10 বাইট যুক্ত)

#define P printf(
#define O(x) P"%d) Pour from %dL jug into "x"\n"
#define S P"5L: %d, 3L: %d, T: %d\n",F,H,g);}
F,H,s,g,x;l(j){P"%d) Fill %dL jug\n",++s,j);St(j,o,m){O("%dL jug"),++s,j,(j^5)?5:3);Se(j,i){O("tank"),++s,j);Smain(){scanf("%d",&x);while(x>4&&x^6&&x^9){x-=5;l(F=5);g+=5;e(5,F=0);}while(x>2){x-=3;l(H=3);g+=3;e(3,H=0);}(x^2)?(x^1)?0:(l(H=3),t(3,H=0,F=3),l(H=3),t(3,H=1,F=5),g++,e(3,H=0)):(l(F=5),t(5,F=2,H=3),g+=2,e(5,F=0));P"Volume measured out in %d turns",s);}

সম্ভবত এখানে আরও গল্ফ করা হবে - আউটপুট ফাংশনগুলি আমাকে হত্যা করছিল। এটি সর্বোত্তম সমাধান দেওয়া উচিত (পদক্ষেপের ন্যূনতম সংখ্যা)। এখানকার অন্যান্য কোডের মতো, এটি 5L জগগুলি পূরণ করে এবং এটি 3 টি জগতে স্যুইচ না করা পর্যন্ত খালি করে। এটি 2 টি বিশেষ ক্ষেত্রে (6 এবং 9) পরীক্ষা করে এবং যদি এটি 3L জগগুলিতে স্যুইচ করে finds 1L এবং 2L পাওয়ার নির্দেশাবলী কঠোর কোডে রয়েছে।

আরও পঠনযোগ্য সংস্করণ:

#define P printf(
#define O(x) P"%d) Pour from %dL jug into "x"\n"
#define S P"5L: %d, 3L: %d, T: %d\n",F,H,g);}
F,H,s,g,x;
l(j)
{
    P"%d) Fill %dL jug\n",++s,j);S

t(j,o,m)
{
    O("%dL jug"),++s,j,(j^5)?5:3);S

e(j,i)
{
    O("tank"),++s,j);S

main()
{
    scanf("%d",&x);
    //while(x>4&&x^6&&x^9)     <--optimal version
    while(x>4)
    {
        x-=5;l(F=5);g+=5;e(5,F=0);
    }
    while(x>2)
    {
        x-=3;l(H=3);g+=3;e(3,H=0);
    }
    (x^2)?
        (x^1)?  
            0
             :
            (l(H=3),t(3,H=0,F=3),l(H=3),t(3,H=1,F=5),g++,e(3,H=0))
             :(l(F=5),t(5,F=2,H=3),g+=2,e(5,F=0));
    P"Volume measured out in %d turns",s);
}

সম্পাদনা:

  • অপ্টের স্পষ্টির উপর ভিত্তি করে 10 টি বাইট সরিয়ে নেওয়া হয়েছে যা স্কোর সংস্করণটির জন্য সর্বোত্তম কার্যকারিতা দিয়েছে।
  • ফাংশনকে সংজ্ঞাতে রূপান্তর করে 5 বাইট শেভ করুন।

N = 11 (অনুকূল সংস্করণ) এর জন্য পরীক্ষার আউটপুট:

11
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 3L jug
5L: 0, 3L: 3, T: 5
4) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 8
5) Fill 3L jug
5L: 0, 3L: 3, T: 8
6) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 11
Volume measured out in 6 turns

আপনি 11 কে একটি বিশেষ কেস হিসাবে গণনা করছেন না কেন? 14 এর জন্য আপনি কী করেন? এক পাঁচ, তিন ত্রিশ (8) দুই পাঁচটি মারতে চলেছে এবং অন্য চার লিটার তৈরি করছে (যা চারটি পালটে করা যায় না)।
বিল উড্ডার

11 এবং 14 উভয়ই বিশেষ মামলার অন্তর্ভুক্ত। আপনি প্রথম 5 এল বিয়োগের পরে, তারা যথাক্রমে 6 এবং 9 ছেড়ে যায় এবং এগুলি বিশেষ কেস দ্বারা পরিচালিত হয়। 9 হ'ল বৃহত্তম সংখ্যা যা কেবলমাত্র 3L জগ ব্যবহার করে কম পদক্ষেপে করা যায় । 14 এর ইনপুটটি 8 টি পদক্ষেপ সমাধান দেয়, 11 এর আউটপুট উপরে।
কমিন্টার্ন

2

টি-এসকিউএল (2012): 794 689 580

@ লেগো-স্টর্মট্রোপ্রের অ্যালগরিদমের সাথে মিলিয়ে @ জোনাথন-ভ্যান-ম্যাট্রির টি-এসকিউএল উত্তর দ্বারা অনুপ্রাণিত । আমি এটি করতে চেয়েছিলাম কারণ আমি 99 টি বোতল বিয়ার চ্যালেঞ্জ উপভোগ করেছি ।

আমি OVERগণিত / বুল ফাংশনগুলির অগ্রাধিকারের ক্ষেত্রে উইন্ডো ( ) ফাংশনগুলি সর্বনিম্ন রাখার চেষ্টা করেছি ।

এসকিউএলফিডেল এখানে রয়েছে

WITH n AS(SELECT 11 n UNION ALL SELECT n-IIF(n>4,5,3)FROM n WHERE n>2)SELECT n, a,LEN(a)L,i=IDENTITY(INT,1,1),'L jug'j INTO #t FROM n JOIN(VALUES(3303),(33900),(5550),(55900),(2550),(259323),(25903),(1303),(139530),(1333),(139551),(13950))x(a)ON RIGHT(LEFT(12335,n),1)=LEFT(a,1)ORDER BY n DESC SELECT LTRIM(i)+') '+REPLACE(IIF(L=4,'Fill ','Pour ')+RIGHT(a/100,L-3),9,j+' into ')+IIF(L=5,'tank',j)  +'
5L: '+LTRIM((A%100)/10)+', 3L: '+LTRIM(A%10)+', T: '+LTRIM(SUM(IIF(L=5,LEFT(a,1),0))OVER(ORDER BY i))FROM #t UNION SELECT 'Volume measured out in ' +LTRIM(MAX(i))+' turns'FROM #t

ইনপুট: 11

1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 5L jug
5L: 5, 3L: 0, T: 5
4) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 10
5) Fill 3L jug
5L: 0, 3L: 3, T: 10
6) Pour from 3L jug into
5L jug 5L: 0, 3L: 3, T: 10
7) Fill 3L jug
5L: 3, 3L: 3, T: 10
8) Pour from 3L jug into 5L jug
5L: 5, 3L: 1, T: 10
9) Pour from 3L jug into tank
5L: 5, 3L: 0, T: 11
Volume measured out in 9 turns

মানব পাঠযোগ্য:

WITH n AS(
  SELECT 11 n
    UNION ALL
  SELECT n-IIF(n>4,5,3)
  FROM n
  WHERE n>2
)
SELECT n, a,LEN(a) L, i = IDENTITY(INT,1,1), 'L jug'j
INTO #t
FROM n
JOIN(VALUES
     (3303),(33900),
     (5550),(55900),
     (2550),(259323),(25903),
     (1303),(139530),(1333),(139551),(13950)
    )x(a)
ON RIGHT(LEFT(12335,n),1) = LEFT(a,1)
ORDER BY n DESC

 SELECT LTRIM(i)+') '
  + REPLACE(IIF(L=4,'Fill ','Pour ')
  + RIGHT(a/100,L-3),9,j+' into ')+IIF(L=5,'tank',j)
  +'
5L: ' + LTRIM((A%100)/10) + ', 3L: ' + LTRIM(A%10) + ', T: '
  + LTRIM(SUM(IIF(L=5,LEFT(a,1),0))OVER(ORDER BY i)) FROM #t
UNION ALL
 SELECT 'Volume measured out in ' +LTRIM(MAX(i))+' turns'FROM #t
 DROP TABLE #t

আপনার কি কিছু নমুনা আউটপুট আছে?
বিল উড্ডার

@ বিলডুডগার input = 8
স্বাচ্ছন্দ্যের

ধন্যবাদ। 8 বেশ সহজ। এক থেকে 11 কোডটি একটি ভাল প্রসারিত করে :-) আমি উত্সাহিত করছি, সুতরাং ফিরে আসবেন না এবং বলুন যে এটি কাজ করে না।
বিল উড্ডার

@ বিল ধন্যবাদ এ পরিবর্তন করেছেinput = 11
comfortablydrei

@ কমফোর্টেড্রেই টি-এসকিউএল ব্যবহার করে আশ্চর্যজনক স্টাফ ... জোনাথনের বই থেকে একটি পৃষ্ঠা
নিচ্ছেন

1

পাইথন 3 (417 টি অক্ষর)

P=print
D=divmod
N=['3L jug','5L jug','tank',0]
M=999
R=[0,0,0,M]
F=[3,5,M,M]
def o(a,b):k=a==3;P(['Pour from %s into %s','Empty %s','Fill %s'][k*2+(b==3)]%[(N[a],N[b]),(N[b])][k]);d=min(R[a],F[b]-R[b]);R[a]-=d;R[b]+=d;P('5L:',R[1],'3L:',R[0],'T:',R[2]);N[3]+=1
k,r=D(int(input()),5)
for i in'0'*k:o(3,1);o(1,2)
for x in['','c1c12','d46','c2','d434d46'][r]:o(*D(int(x,16),4))
P('Volume measured out in',N[3],'turns')

ব্যাখ্যা

নোট করুন যে আমাদের 4 টি অবজেক্ট রয়েছে, যথা, 3 এল জগ, 5 এল জগ, ট্যাঙ্ক এবং ফুটেন। একমাত্র অপারেশন যা আমরা করতে পারি তা হ'ল জলকে বস্তু aথেকে বস্তুতে সরিয়ে নেওয়া b। এটি কি ফাংশনo(a, b) আমার কোডে , এটি জল সরিয়ে নিয়ে প্রিন্ট করে এবং গণনা চালিয়ে যায়।

ঠাট

  • N=['3L jug','5L jug','tank',0]। এড়াতে এখানে আমার শেষ উপাদানটি দরকার IndexError। এছাড়াও, এটি বিস্তৃত ছাড়াই বৈশ্বিক গণনা পরিবর্তনশীল হিসাবে ব্যবহার করা যেতে পারেglobal কীওয়ার্ড । উদাহরণ স্বরূপ,N[3] += 1

  • যেহেতু 0 <= a < 4, 0 <= b < 4ফাংশনে o(a, b), আমরা এনকোড করতে (a, b)ব্যবহার করে একটি হেক্স অঙ্ক মধ্যে (a << 2) | b, এবং ব্যবহার করে এটি ডিকোড divmod(x, 4)। এই কৌশলটি দিয়ে, সমস্ত 5 টি সমাধান ( reminder=0, 1, 2, 3, 4), অ্যারেতে এনকোড করা যায় ['','c1c12','d46','c2','d434d46']যা এটি আসল ফর্মের চেয়ে কিছুটা ছোট:

    A=[ (), ((3,0),(0,1),(3,0),(0,1),(0,2)), ((3,1),(1,0),(1,2)), ((3,0),(0,2)), ((3,1),(1,0),(0,3),(1,0),(3,1),(1,0),(1,2)) ]

নমুনা আউটপুট (n = 17)

17
Fill 5L jug
5L: 5 3L: 0 T: 0
Pour from 5L jug into tank
5L: 0 3L: 0 T: 5
Fill 5L jug
5L: 5 3L: 0 T: 5
Pour from 5L jug into tank
5L: 0 3L: 0 T: 10
Fill 5L jug
5L: 5 3L: 0 T: 10
Pour from 5L jug into tank
5L: 0 3L: 0 T: 15
Fill 5L jug
5L: 5 3L: 0 T: 15
Pour from 5L jug into 3L jug
5L: 2 3L: 3 T: 15
Pour from 5L jug into tank
5L: 0 3L: 3 T: 17
Volume measured out in 9 turns

1

কোবল (আইবিএম এন্টারপ্রাইজ কোবল) 192 টি অক্ষরের লাইন

এটি প্রশ্নের ধারণার একটি প্রমাণ এবং গল্ফ-কোবলের জন্য এটির শুরু :-)

প্রশ্নটি দ্রুত চেয়েছে। সুতরাং, সমান্তরালতা বাস্তবায়ন। এমনকি একজন ব্যক্তি একই সাথে একটি 3 এল জগ এবং একটি 5 এল জগ সহজেই পূরণ করতে পারে।

বাকীটিও রেখে কেবল আটটি করে ইনপুট ভাগ করুন। আটবারের মতো ঠিক কতটা দ্রুত 5 এল / 3 এল পূরণ করে তা শেষ করুন, তারপরে সাত লিটার বাকী একটি দিয়ে ডিল করুন।

বাকীটির মধ্যে সবচেয়ে আকর্ষণীয় চার লিটারের জন্য। এক লিটার প্লাস তিন লিটার হিসাবে এটি করা চারপাশে প্রচুর পরিমাণে কম জল দেয়, অন্যান্য সম্ভাবনার জন্য কেবল 18 লিটার বনাম 23।

কোড (কাজ)

   ID DIVISION
   PROGRAM-ID
   DATA DIVISION
   WORKING-STORAGE SECTION
   1.
   88 g1 VALUE ' '.
   2  PIC X
   88 H VALUE 'F'.
   88 I VALUE 'E'.
   88 J VALUE 'T'.
   2 PIC X
   88 K VALUE 'F'.
   88 L VALUE 'E'.
   88 M VALUE 'T'.
   1 R
   2 A1 PIC 999
   2 B PIC 99
   2 C PIC 9
   1 E
   2 e2 PIC X(120) VALUE "  ) Fill both jugs"
   2 e3 PIC X(120)
   88 O VALUE "5L: 0, 3L: 0, T: 000".
   2 e4 PIC X(120) VALUE "  ) Empty both jugs"
   2 e5 PIC X(120)
   2 e1 occurs 32 depending on p pic x(240)
   2 e6 pic x(99)
   1 F PIC 999 VALUE 0
   1 P PIC 99 VALUE 0
   1 P1 PIC 99
   PROCEDURE DIVISION
   ACCEPT A1
   DIVIDE A1 BY 8 GIVING B REMAINDER C
   set o to true
   move e3 to e5
   move 5 to e3(5:1)
   move 3 to e3(12:1)
   PERFORM D1 B TIMES
   EVALUATE C
   WHEN 1
   MOVE ZERO TO R
   SET K TO TRUE
   PERFORM N
   SET M TO TRUE
   PERFORM N
   SET K TO TRUE
   PERFORM N
   SET M TO TRUE
   PERFORM N
   SET L TO TRUE
   PERFORM N
   WHEN 2
   MOVE ZERO TO R
   SET H TO TRUE
   PERFORM N
   SET J TO TRUE
   PERFORM N
   SET I TO TRUE
   PERFORM N
   WHEN 3
   MOVE ZERO TO R
   SET K TO TRUE
   PERFORM N
   SET L TO TRUE
   PERFORM N
   WHEN 4
   MOVE ZERO TO R
   SET K TO TRUE
   PERFORM N
   SET M TO TRUE
   PERFORM N
   SET K TO TRUE
   PERFORM N
   SET M TO TRUE
   PERFORM N
   SET L TO TRUE
   PERFORM N
   SET K TO TRUE
   PERFORM N
   SET L TO TRUE
   PERFORM N
   WHEN 5
   MOVE ZERO TO R
   SET H TO TRUE
   PERFORM N
   SET I TO TRUE
   PERFORM N
   WHEN 6
   MOVE ZERO TO R
   SET K TO TRUE
   PERFORM N
   SET L TO TRUE
   PERFORM N
   SET K TO TRUE
   PERFORM N
   SET L TO TRUE
   PERFORM N
   WHEN 7
   MOVE ZERO TO R
   SET H TO TRUE
   PERFORM N
   SET I TO TRUE
   PERFORM N
   SET H TO TRUE
   PERFORM N
   SET J TO TRUE
   PERFORM N
   SET I TO TRUE
   PERFORM N
   END-EVALUATE
   string "Volume measured out in " delimited size P " turns"
   delimited size into e6
   if  e6(24:1) = 0
   move e6(25:) to e6 (24:)
   end-if
   move p to p1
   perform d2 p times
   DISPLAY E(481:)
   GOBACK
   D1
   ADD 1 TO P
   MOVE P TO E(1:2)
   move e2 to e1(p)
   move e3 to e1(p)(121:)
   ADD 1 TO P
   MOVE P TO E(241:2)
   ADD 8 TO F
   MOVE F TO E(378:3)
   move e4 to e1(p)
   move e5 to e1(p)(121:)
   MOVE F TO E(138:3)
   N
   ADD 1 TO P
   SET O TO TRUE
   EVALUATE TRUE
   WHEN K

   MOVE 3 TO B
   string p delimited size ") Fill 3L jug" delimited by size
   into e1(p)
   WHEN M
   COMPUTE C = C + B
   IF  C > 5
   COMPUTE B = C - 5
   MOVE 5 TO C
   ELSE
   MOVE 0 TO B
   END-IF
   string  P delimited size ") Pour from 3L jug into 5L jug"
   delimited size into e1(p)
   WHEN L
   ADD B TO F
   MOVE 0 TO B
   string  P delimited size ") Empty 3L jug into tank"
   delimited size into e1(p)
   END-EVALUATE
   EVALUATE TRUE
   WHEN H
   MOVE 5 TO C
   string  P delimited size ") Fill 5L jug"
   delimited size into e1(p)
   WHEN J
   COMPUTE B = C + B
   IF  B > 3
   COMPUTE C = B - 3
   MOVE 3 TO B
   ELSE
   MOVE 0 TO C
   END-IF
   string  P delimited size ") Pour from 5L jug into 3L jug"
   delimited size into e1(p)
   WHEN I
   ADD C TO F
   MOVE 0 TO C
   string  P delimited size ") Empty 5L jug into tank"
   delimited size into e1(p)
   END-EVALUATE
   string  "5L: " delimited size
       C delimited size ", 3L: " delimited size B(2:)
   ", T: " delimited size F delimited size
   into e1(p)(121:)
   SET g1 TO TRUE
   d2
   perform d3 2 times
   if  e1(p1)(1:1) = 0
   move e1(p1)(2:) to e1(p1)(1:120)
   end-if
   subtract 1 from p1
   d3
   if  e1(p1)(138:1) = 0
   move e1(p1)(139:) to e1(p1)(138:)
   end-if

এটি কোডের জন্য ভুল স্থানে এবং প্রয়োজনীয় পূর্ণ-স্টপের অভাবের জন্য ডায়গনিস্টিক বার্তার একটি নিখুঁত শেড-লোড পায়।

ডায়াগনস্টিকসের কোনওটিই অবজেক্ট কোডের কোনও প্রভাব নির্দেশ করে না। সুতরাং, এটি ফাঁকা হওয়া সত্ত্বেও আরসি = 8 হওয়া সত্ত্বেও আমি জানি যে অবজেক্টটি ঠিক থাকবে, তাই এটি সংযুক্ত করুন এবং এটি চালিয়ে যান।

এখানে এক থেকে আট লিটারের আউটপুট রয়েছে। এর পরে, সমস্ত ফলাফল নিবিড় করা যেতে পারে। 17 এবং 100 সমান্তরালতার উদাহরণ হিসাবে অন্তর্ভুক্ত।

প্রোগ্রামটি অক্ষরগুলিতে চেপে ধরে আরও অনেক কিছু করা যায়, প্রথমে সঠিক আউটপুটটি গুরুত্বপূর্ণ জিনিস ছিল। অক্ষরগুলি স্থির-দৈর্ঘ্যের লাইনে থাকা অবস্থায় গণনা করা সম্পূর্ণ অন্য জিনিস।

নমুনা আউটপুট:

1) Fill 3L jug                 
5L: 0, 3L: 3, T: 0             
2) Pour from 3L jug into 5L jug
5L: 3, 3L: 0, T: 0             
3) Fill 3L jug                 
5L: 3, 3L: 3, T: 0             
4) Pour from 3L jug into 5L jug
5L: 5, 3L: 1, T: 0             
5) Empty 3L jug into tank      
5L: 5, 3L: 0, T: 1             
Volume measured out in 5 turns 

1) Fill 5L jug                 
5L: 5, 3L: 0, T: 0             
2) Pour from 5L jug into 3L jug
5L: 2, 3L: 3, T: 0             
3) Empty 5L jug into tank      
5L: 0, 3L: 3, T: 2             
Volume measured out in 3 turns

1) Fill 3L jug                 
5L: 0, 3L: 3, T: 0             
2) Empty 3L jug into tank      
5L: 0, 3L: 0, T: 3             
Volume measured out in 2 turns 

1) Fill 3L jug                 
5L: 0, 3L: 3, T: 0             
2) Pour from 3L jug into 5L jug
5L: 3, 3L: 0, T: 0             
3) Fill 3L jug                 
5L: 3, 3L: 3, T: 0             
4) Pour from 3L jug into 5L jug
5L: 5, 3L: 1, T: 0             
5) Empty 3L jug into tank      
5L: 5, 3L: 0, T: 1             
6) Fill 3L jug                 
5L: 5, 3L: 3, T: 1             
7) Empty 3L jug into tank      
5L: 5, 3L: 0, T: 4             
Volume measured out in 7 turns 

1) Fill 5L jug                
5L: 5, 3L: 0, T: 0            
2) Empty 5L jug into tank     
5L: 0, 3L: 0, T: 5            
Volume measured out in 2 turns

1) Fill 3L jug                 
5L: 0, 3L: 3, T: 0             
2) Empty 3L jug into tank      
5L: 0, 3L: 0, T: 3             
3) Fill 3L jug                 
5L: 0, 3L: 3, T: 3             
4) Empty 3L jug into tank      
5L: 0, 3L: 0, T: 6             
Volume measured out in 4 turns 

1) Fill 5L jug                  
5L: 5, 3L: 0, T: 0              
2) Empty 5L jug into tank       
5L: 0, 3L: 0, T: 5              
3) Fill 5L jug                  
5L: 5, 3L: 0, T: 5              
4) Pour from 5L jug into 3L jug 
5L: 2, 3L: 3, T: 5              
5) Empty 5L jug into tank       
5L: 0, 3L: 3, T: 7              
Volume measured out in 5 turns 



1) Fill both jugs               
5L: 5, 3L: 3, T: 0              
2) Empty both jugs              
5L: 0, 3L: 0, T: 8              
Volume measured out in 2 turns  

1) Fill both jugs               
5L: 5, 3L: 3, T: 0              
2) Empty both jugs              
5L: 0, 3L: 0, T: 8              
3) Fill both jugs               
5L: 5, 3L: 3, T: 8              
4) Empty both jugs              
5L: 0, 3L: 0, T: 16             
5) Fill 3L jug                  
5L: 0, 3L: 3, T: 16             
6) Pour from 3L jug into 5L jug 
5L: 3, 3L: 0, T: 16             
7) Fill 3L jug                  
5L: 3, 3L: 3, T: 16             
8) Pour from 3L jug into 5L jug 
5L: 5, 3L: 1, T: 16             
9) Empty 3L jug into tank       
5L: 5, 3L: 0, T: 17             
Volume measured out in 9 turns  



1) Fill both jugs  
5L: 5, 3L: 3, T: 0 
2) Empty both jugs 
5L: 0, 3L: 0, T: 8 
3) Fill both jugs  
5L: 5, 3L: 3, T: 8 
4) Empty both jugs 
5L: 0, 3L: 0, T: 16
5) Fill both jugs  
5L: 5, 3L: 3, T: 16
6) Empty both jugs 
5L: 0, 3L: 0, T: 24
7) Fill both jugs  
5L: 5, 3L: 3, T: 24
8) Empty both jugs 
5L: 0, 3L: 0, T: 32
9) Fill both jugs  
5L: 5, 3L: 3, T: 32
10) Empty both jugs
5L: 0, 3L: 0, T: 40
11) Fill both jugs 
5L: 5, 3L: 3, T: 40
12) Empty both jugs
5L: 0, 3L: 0, T: 48
13) Fill both jugs 
5L: 5, 3L: 3, T: 48
14) Empty both jugs
5L: 0, 3L: 0, T: 56
15) Fill both jugs 
5L: 5, 3L: 3, T: 56
16) Empty both jugs
5L: 0, 3L: 0, T: 64
17) Fill both jugs 
5L: 5, 3L: 3, T: 64
18) Empty both jugs
5L: 0, 3L: 0, T: 72
19) Fill both jugs               
5L: 5, 3L: 3, T: 72              
20) Empty both jugs              
5L: 0, 3L: 0, T: 80              
21) Fill both jugs               
5L: 5, 3L: 3, T: 80              
22) Empty both jugs              
5L: 0, 3L: 0, T: 88              
23) Fill both jugs               
5L: 5, 3L: 3, T: 88              
24) Empty both jugs              
5L: 0, 3L: 0, T: 96              
25) Fill 3L jug                  
5L: 0, 3L: 3, T: 96              
26) Pour from 3L jug into 5L jug 
5L: 3, 3L: 0, T: 96              
27) Fill 3L jug                  
5L: 3, 3L: 3, T: 96              
28) Pour from 3L jug into 5L jug 
5L: 5, 3L: 1, T: 96              
29) Empty 3L jug into tank       
5L: 5, 3L: 0, T: 97              
30) Fill 3L jug                  
5L: 5, 3L: 3, T: 97              
31) Empty 3L jug into tank       
5L: 5, 3L: 0, T: 100             
Volume measured out in 31 turns 

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

1
@ ওয়েল ওয়েস্ট ধন্যবাদ যদি আমি মনে করি ব্যবসায়ের ক্ষেত্রের উন্নতি হতে পারে তবে আমি সর্বদা এটি করি :-)। আমার "ফাঁকা ইন ঝর্ণা" দরকার নেই, তাই দুটি নতুন এবং দুটি ব্যবহৃত হয়নি - ডাবল ব্যর্থতা!
বিল উড্ডার 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.