Câu đố bình 3 và 5 lít


14

Bạn có thể đã thấy câu này trong Die Hard: With a Vengeance ... Câu hỏi này dựa trên Câu đố Jug 3 và 5 lít nổi tiếng, nhưng với một góc nghiêng hơi khác.

Chơi một số mã mà khi được cung cấp một số nguyên từ 1 đến 100 sẽ cung cấp cho bạn các hướng dẫn nhanh nhất để đo ra một bể, số lít nước tương ứng từ một đài phun nước, sử dụng bình 3 lít và bình 5 lít.

Không có sự chuyển màu trên một trong hai bình; đài phun nước có nguồn cung cấp nước dồi dào và bể được giả sử sẽ được dọn sạch khi bắt đầu mỗi lần thực thi mã.

Bạn không thể tiếp cận nước từ bể sau khi nó vào bể.

Định dạng thực hiện như sau:

Đầu vào:

4 ví dụ.

Đầu ra

Xuất ra từng bước được đánh số, như được hiển thị, theo sau là một khối lượng của bình 5L, bình 3L và bình. Định dạng kiểm đếm cũng được hiển thị dưới đây. Số lượng các bước cũng phải được xuất ra ở cuối các bước.

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

Ví dụ 2

Đầu vào: 8

Đầu ra:

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

Công ước

  1. Fill xL jug - đổ đầy bình liên kết lên đỉnh từ đài phun nước
  2. Empty xL jug - làm trống các nội dung của bình liên quan vào đài phun nước
  3. Pour from xL jug into yL jug - Đổ nội dung của bình xL vào bình yL
  4. Pour from xL jug into tank - Đổ nội dung của bình xL vào bể

Mã ngắn nhất sẽ thắng.


có thể trùng lặp vấn đề Xô nước
Howard

4
@Howard, câu hỏi cũ không rõ ràng (không có tiêu chí chiến thắng) và đã bị bỏ qua, vì vậy tôi nghĩ rằng câu hỏi này tốt hơn và không nên bị đóng.
Victor Stafusa

Gọi tôi là điên, nhưng không phải là giải pháp tối ưu sẽ là 1. Thêm càng nhiều 5L càng tốt, 2. Thêm 3L nếu cần, 3. Thêm một phần 2L hoặc 1L đã được giải quyết theo yêu cầu?

1
@LegoStormtroopr Khi tất cả sôi sục, đúng. Nhưng tôi hy vọng nó sẽ được chơi golf phù hợp.
WallyWest

3
@LegoStormtroopr Tôi cũng nghĩ vậy, nhưng không phải là 6 và 9 mẫu?
Paul Prestidge

Câu trả lời:


6

Hồng ngọc 407 376 365 331 324 323

Điều này đang trở nên khó đọc ...

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"

Đưa đầu vào vào STDIN. Ví dụ chạy cho N = 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
"Điều này đang trở nên khó đọc ..." - Anh bạn, đó không phải là điểm của môn đánh gôn ...? ;)
WallyWest

4
@WallyWest Không. Chúng tôi có một thẻ [obfuscation] cho những người đó! Ý kiến ​​khiêm tốn của tôi sẽ là hai giải pháp codegolf có cùng độ dài, giải pháp dễ đọc nhất sẽ là tốt nhất.
Ông Lister

@MrLister Đủ công bằng, nhưng đôi khi che giấu là cách duy nhất để đạt được độ co rút mong muốn ...
WallyWest

5

T-SQL 2012: 1410 1302

Một nỗ lực tinh túy khác cho một câu hỏi trong SQL, nhưng lần này cung cấp một cơ hội thú vị để chơi với một số tùy chọn chức năng cửa sổ mới trong phiên bản 2012. Ngoài ra, nó khai thác các CTE đệ quy, có thể không có gì ấn tượng trong hầu hết các ngôn ngữ lập trình, nhưng đệ quy trong SQL giống như chuyển từ ngựa và xe lôi sang một chiếc Ferrari.

Động cơ ở trung tâm của điều này là trong các dòng 5-12, sử dụng CTE đệ quy và hàm cửa sổ để xây dựng một bảng gồm hầu hết các số cần thiết để giải quyết vấn đề. Đặc biệt lưu ý thử nghiệm cho 3, 4, 6 hoặc 9, đảm bảo cách tiếp cận tối ưu cho giải pháp trong 3 giây từ những số đó trở đi. (Về mặt kỹ thuật, đó là một sự ràng buộc cho 4 giữa cách tiếp cận 3-1 và 2-2, nhưng thực hiện theo cách này đã khiến tôi chơi rất nhiều nhân vật.) Sau đó, việc tham gia vào bảng tra cứu các bước tối ưu cho các bước khác nhau là một vấn đề đơn giản. các phần của vấn đề và sử dụng một chức năng cửa sổ khác để đánh số đúng các bước.

Nếu bạn không có MS SQL nằm xung quanh, hãy chơi với nó trên SQLFiddle.

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

Kết quả cho đầu vào 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 

Biên tập:

Đánh bại một sự cải thiện điểm số bằng cách

  • loại bỏ +5 không cần thiết trong hàng đầu tiên của CTE và mệnh đề WHERE cần thiết
  • xếp hàng các bảng GIÁ TRỊ, tiết kiệm các báo cáo KHAI THÁC tốn kém
  • nhớ chuyển đổi CRLF hai byte của Windows sang kiểu Unix lần này.

+1 cho sự dũng cảm, anh chàng ... Rất ấn tượng và cảm ơn vì liên kết fiddle MS SQL!
WallyWest

1
Haha, cảm ơn người đàn ông! Tôi thực sự tin rằng cái này có thể thắng được khi tôi bắt đầu và có truy vấn cốt lõi đệ quy. Nhưng ngay cả với việc chơi golf chuỗi rộng rãi, tính dài dòng của việc thêm tất cả các văn bản cần thiết đã làm thất bại giải pháp cuối cùng của tôi. :)
Jonathan Van Matre

Nếu tôi có thể làm một tiền thưởng "sáng tạo nhất", bạn sẽ nhận được nó ...
WallyWest

+1 để biến tôi thành LOL. T-SQL chắc chắn là một câu lạc bộ kỳ lạ để mang theo trong túi golf mã của bạn.
Quốc tế cộng sản

5

Javascript: 480

Nỗ lực đầu tiên trong việc chơi golf, lời khuyên đánh giá cao

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")

Nó gây rối với một số số vì nó không kiểm tra xem tốt hơn là đổ 3 hoặc 5, ví dụ: 9 cho 9 lượt thay vì 6, tôi có thể sửa nó sau

Dán nó trong bàn điều khiển

Từ 553 đến 481 nhờ @WallyWest


1
Bạn có thể thử: 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") cho
480

@WallyWest cảm ơn, đã không nghĩ về việc sử dụng các toán tử logic thay vì ifs
Sam

3

Java, 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))}}

Tôi lấy giải pháp của Sumedh và đánh golf nó. Tôi muốn đưa nó vào các bình luận nhưng danh tiếng của tôi không đủ :(. Nó ít hơn 40%, tôi nghĩ ít nhất nó cũng nên được chia sẻ.

Đây là vô căn cứ:

    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));
    }
}

NB: nó chỉ hoạt động trên lần chạy đầu tiên. Chạy lại nó và kết quả sẽ sai (do một biến toàn cục).

Phiên bản sau đây an toàn, nhưng chúng tôi mất 2 char, đi từ 610 đến 612:

    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));
    }
}

Sản lượng mẫu cho N = 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

Java: 984

Đây là mã

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");}}

Đầu vào là từ dòng lệnh. ví dụ: java X 4


Tôi không thể bình luận bất cứ nơi nào khác, vì vậy tôi đang bình luận ở đây. @Lego Stormtroopr, có một giải pháp tối ưu thay thế, trong đó đối với 4L còn lại, bạn có thể làm tương tự như đối với 2L (3 bước) sau đó làm trống bình 3L, và sau đó lặp lại cho 2L còn lại, do đó hoàn thành trong 7 bước .... Điều này tương tự với giải pháp của bạn trong đó 4L được chia thành: 3L vào bể (2 bước) và phương pháp 5 bước cho 1L còn lại.
Sumedh

@ Chron, mã của bạn có hoạt động với các giá trị của N không, trong đó N% 5 là 1 hoặc 4? Tôi không hiểu ruby, đó là lý do tại sao tôi không thể tự kiểm tra nó ...
Sumedh

ví dụ, bạn nên xem tại N = 11: ideone.com/3ZDuOS Bạn có thể nhấn chỉnh sửa ở góc trên bên trái và thay đổi STDIN thành các giá trị khác nếu bạn muốn kiểm tra.
Paul Prestidge

Ồ, bạn đã có giải pháp tối ưu hơn của tôi .... làm thế nào để bạn quyết định khi nào nên dừng 5L và sử dụng 3L thay thế? Ý tôi là, nếu đầu vào là 81, thì bạn nhận được tới 75L khi sử dụng 5L, và sau đó sử dụng 3L. nếu ip là 89, thì 5L được sử dụng tối đa 80L và còn lại là 3L.
Sumedh

Tiết kiệm một số ký tự: main(String[]s), int n=Integer.parseInt(s[0]),t=0,c=0;, java.io.PrintStream q=System.out;. Ngoài ra, có thể viết đầu tiên whiledưới dạng một hoặc hai ký tự for. Hơn nữa, Strings của bạn là lặp đi lặp lại, bạn có thể cố gắng lưu trữ các phần lặp đi lặp lại trong các biến hoặc tạo các hàm xây dựng chúng chỉ bằng một prefab String.
Victor Stafusa

2

Con trăn 2.7 - 437

Không phải là mã ngắn nhất, nhưng tôi nghĩ đây là cách tối ưu nhất để giải quyết điều này.

Như tôi đã nêu trong các ý kiến, cách tối ưu nhất để tính toán điều này:

  1. Lấy càng nhiều khối 5L càng tốt - divmod(amount,5). Điều này sẽ cung cấp cho bạn một trong số 4,3,2,1 như phần còn lại.
  2. Lấy 3 (nếu có thể) từ phần còn lại.
  3. Mà để lại 1 hoặc 2 là phần còn lại. Sử dụng giải pháp tối ưu cho cả hai có thể được biết trước như sau:

    1. 1L, 5 bước: 3L -> 5L, 3L -> 5L, để lại 1L trong 3L, 3L (giữ 1L) -> bình
    2. 2L, 3 bước: 5L -> 3L, để lại 2L trong bình 5L, 5L (giữ 2L) ->

Mật mã:

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)

Và một đầu ra cho 4L trong 7 bước:

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

Bạn đang gán một int cho o và sau đó cố gắng thêm một danh sách. Tôi nghĩ bạn có nghĩa là gán o, t = [], f * 5 trên dòng 5.
psion5mx

1
Mất các câu lệnh cho, phạm vi và nếu các câu lệnh và bạn có thể giảm xuống 399 trên một dòng: j, T = "% dL jug", "tank"; A = "\ n5L:% d, 3L:% d, T :% d "; F, P =" Điền "+ j + A," Đổ từ "+ j +" vào% s "+ A; f, r = divmod (input (), 5); t, o = f * 5, []; o = [F% (5,5,0,5 * i), P% (5, T, 0,0,5 * i + 5)] * f + [F% (3,0, 3, t), P% (3, T, 0,0, t + 3)] * (r> 2) + [F% (5,5,0, t), P% (5, j% 3, 2,3, t), P% (5, T, 0,3, t + 2)] * (r == 2) + [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)] * (r in [1,4]); in "\ n" .join (o), "\ nVolume tính bằng% d lần lượt"% len (o)
psion5mx

1
Thao tác ấn tượng ... @ psion5mx Tôi không nghĩ loại lập trình này có thể có trên Python? Không có phạm vi, đệ quy hoặc nếu báo cáo?
WallyWest

Sức mạnh của danh sách. Nhân một danh sách với một số nguyên thay thế 'vòng lặp'. Nhân với một boolean thay thế 'ifs'.
psion5mx

Ngoài ra - Tôi đã quản lý để đưa nó xuống một khoảng trống (bên ngoài dấu ngoặc kép), nhưng có thể loại bỏ tất cả các khoảng trắng với chi phí của một ký tự bằng cách thay thế (r trong [1,4]) bằng (r% 5in [1,4] ) trong trường hợp này.
psion5mx

2

Smalltalk (Smalltalk / X), 568 560 516

đầu vào trong n:

    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]]

Cậu bé này chắc chắn là chương trình khó hiểu nhất mà tôi từng viết ...

Chỉnh sửa: Một số Smalltalk khác có thể không cho phép các biến không gian làm việc được tự động hóa và bạn sẽ phải trả trước các khai báo. Ngoài ra bindWith: có thể khác nhau (extendWith: '<p>').

sản lượng mẫu cho 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

C, 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);}

phiên bản không hợp lệ trước đó:

#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);}

và đây là đoạn mã khử:

#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);
}

Điều này không đưa ra giải pháp tối ưu cho 9 (8 lượt, nên là 6 - điền và làm trống 3L 3 lần).
Quốc tế cộng sản

Cũng không làm việc ở tất cả cho một đầu vào của 1.
Quốc tế cộng sản

Không làm việc cho 1? Đáng tiếc ... Nhưng nỗ lực đáng ngưỡng mộ ... :)
WallyWest

vâng, có một số lỗi và giải pháp không phải là tối ưu. nhưng nó tạo ra 1 L trong 8 bước ...
VX

Vài mẹo chơi gôn - Bạn có thể lưu 6 byte bằng cách thay thế int N, T, i; với N, T, i, a, b; và int a = 0, b = 0; với a = b = 0;. Bạn cũng có được 3 byte bằng cách thêm (để định nghĩa printf của bạn tôi nghĩ rằng tăng mạnh nhất sẽ được giảm tuyên bố chuyển sang một ternary lồng nhau mặc dù -. Trường hợp và báo cáo đột phá thực sự thêm lên.
Quốc tế cộng sản

2

C ( 480 465 byte)

#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);}

Phiên bản tối ưu (thêm 10 byte)

#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);}

Có khả năng chơi gôn nhiều hơn ở đây - các chức năng đầu ra đang giết chết tôi. Điều này sẽ cung cấp giải pháp tối ưu (số bước ít nhất). Tương tự như các mã khác ở đây, nó lấp đầy và làm trống bình 5L cho đến khi nó xuống dưới 5 và sau đó chuyển sang bình 3L. Nó kiểm tra 2 trường hợp đặc biệt (6 và 9) và nếu phát hiện ra chúng chuyển sang bình 3L. Các hướng dẫn để có được 1L và 2L được mã hóa cứng.

Phiên bản dễ đọc hơn:

#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);
}

Chỉnh sửa:

  • Đã xóa 10 byte mang lại hiệu suất tối ưu cho phiên bản được ghi dựa trên sự làm rõ của OP.
  • Cạo 5 byte bằng cách chuyển đổi chức năng sang định nghĩa.

Đầu ra thử nghiệm cho n = 11 (phiên bản tối ưu):

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

Tại sao bạn không tính 11 như một trường hợp đặc biệt? Bạn làm gì cho 14? Một năm, ba chục (8) sẽ đánh bại hai người vợ và tạo ra bốn lít còn lại (không thể thực hiện trong bốn lượt).
Bill Woodger

11 và 14 cả hai bao gồm các trường hợp đặc biệt. Sau khi bạn trừ đi 5L đầu tiên, chúng lần lượt để lại 6 và 9 và chúng được xử lý bởi các trường hợp đặc biệt. 9 là số lớn nhất có thể được thực hiện trong ít bước hơn chỉ bằng cách sử dụng bình 3L. Đầu vào 14 cho giải pháp 8 bước, đầu ra cho 11 ở trên.
Quốc tế cộng sản

2

T-SQL (2012): 794 689 580

Lấy cảm hứng từ câu trả lời T-SQL của @ Jonathan-Van-Matre kết hợp với thuật toán của @ Lego-Stormtroopr . Tôi muốn làm điều này bởi vì tôi rất thích thử thách 99 Chai Bia .

Tôi đã cố gắng giữ các hàm window ( OVER) ở mức tối thiểu theo sở thích của các hàm math / bool.

SQLFiddle ở đây .

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

Đầu vào: 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

Người có thể đọc được:

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

Bạn có một số đầu ra mẫu?
Bill Woodger

@BillWoodger đã thêm đầu ra choinput = 8
thoải

Cảm ơn. 8 là khá dễ dàng. Một đến 11 cho mã kéo dài tốt :-) Tôi đang nâng cấp, vì vậy đừng quay lại và nói với tôi rằng nó không hoạt động.
Bill Woodger

@Bill Cảm ơn. Thay đổi thànhinput = 11
thoải

@easureinglydrei Công cụ tuyệt vời khi sử dụng T-SQL ... Lấy một trang từ cuốn sách của Jonathon ...
WallyWest

1

Python 3 (417 ký tự)

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')

Giải thích

Lưu ý rằng chúng ta có 4 đối tượng, cụ thể là bình 3L, bình 5L, bình và foutain. Các hoạt động duy nhất chúng ta có thể làm là di chuyển nước từ vật này asang vật khác b. Đây là chức năng o(a, b)làm trong mã của tôi, nó di chuyển nước và in nó và tiếp tục đếm.

Thủ thuật

  • N=['3L jug','5L jug','tank',0]. Ở đây tôi cần yếu tố cuối cùng để tránh IndexError. Ngoài ra, nó có thể được sử dụng làm biến đếm toàn cầu, không có globaltừ khóa mở rộng . Ví dụ,N[3] += 1

  • 0 <= a < 4, 0 <= b < 4trong chức năng o(a, b), chúng ta có thể mã hóa (a, b)thành một chữ số hex bằng cách sử dụng (a << 2) | bvà giải mã nó bằng cách sử dụng divmod(x, 4). Với thủ thuật này, tất cả 5 giải pháp ( reminder=0, 1, 2, 3, 4), có thể được mã hóa thành mảng ['','c1c12','d46','c2','d434d46'], ngắn hơn một chút so với dạng ban đầu của nó:

    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)) ]

Đầu ra mẫu (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

COBOL (IBM Enterprise COBOL) 192 dòng gồm 72 ký tự

Đây là Bằng chứng về Khái niệm cho Câu hỏi và là khởi đầu của Câu hỏi về Golf-COBOL :-)

Câu hỏi yêu cầu nhanh nhất. Vì vậy, thực hiện song song. Thậm chí một người có thể dễ dàng đổ đầy một bình 3L và một bình 5L cùng một lúc.

Đơn giản chỉ cần chia đầu vào cho tám, cũng để lại phần còn lại. Thực hiện một số cách nhanh chóng 5L / 3L cho số lần tám lần khớp chính xác, sau đó xử lý từ một đến bảy lít còn lại.

Điều thú vị nhất của phần còn lại là cho bốn lít. Làm như một lít cộng với ba lít đẩy ít nước hơn rất nhiều, chỉ 18 lít so với 23 cho các khả năng khác.

Quy tắc (làm việc)

   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

Điều này nhận được tải tuyệt đối các thông báo chẩn đoán cho mã bắt đầu ở sai vị trí và thiếu các điểm dừng đầy đủ cần thiết.

Không có chẩn đoán nào cho thấy bất kỳ tác động nào đến mã đối tượng. Vì vậy, mặc dù nó là một RC bị vỡ = 8 tôi biết đối tượng sẽ ổn, vì vậy đã liên kết nó và chạy nó.

Dưới đây là các đầu ra cho một đến tám lít. Sau đó, tất cả các kết quả có thể được trực quan. 17 và 100 được đưa vào làm ví dụ về sự song song.

Vẫn còn nhiều điều có thể được thực hiện để ép chương trình xuống bằng các ký tự, đầu ra chính xác là điều quan trọng đầu tiên. Đếm các ký tự khi chúng ở trên các dòng có độ dài cố định là một điều hoàn toàn khác.

Đầu ra mẫu:

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 

Cách tiếp cận đáng ngưỡng mộ, @BillWoodger; Tuy nhiên, tôi đã không đặt lệnh "điền cả hai bình" trong các hướng dẫn có sẵn ... công việc có ích và đạo cụ cho a) bằng cách sử dụng COBOL, b) đi theo lộ trình phương pháp nhanh nhất .
WallyWest

1
@WallyWest Cảm ơn. Nếu tôi nghĩ rằng thông số kỹ thuật có thể được cải thiện, tôi luôn làm như vậy :-). Tôi cũng không cần "đổ vào đài phun nước", vì vậy hai cái mới và hai cái không được sử dụng - thất bại kép!
Bill Woodger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.