3과 5 리터 주전자 퍼즐


14

당신은 Die Hard : Vengeance와 함께 이것을 보았을 것입니다 .

1에서 100 사이의 정수가 주어지면 탱크에서 3 리터짜리 주전자와 5 리터짜리 주전자를 사용하여 분수에서 나오는 물의 리터 수를 측정하는 가장 빠른 지침을 제공하는 코드를 작성하십시오.

주전자 중 하나에 그라데이션이 없습니다. 분수대에는 물이 풍부하고 코드가 실행될 때마다 탱크가 비운 것으로 가정합니다.

탱크로 들어가면 탱크의 물에 접근 할 수 없습니다.

실행 형식은 다음과 같습니다.

입력:

4 예를 들어.

산출

그림과 같이 번호가 매겨진 각 단계를 출력 한 다음 5L 주전자, 3L 주전자 및 탱크의 부피를 집계합니다. 탈리 형식도 아래에 나와 있습니다. 단계의 끝에서도 단계 수를 출력해야합니다.

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 -xL 용기의 내용물을 yL 용기에 붓습니다.
  4. Pour from xL jug into tank -xL 용기의 내용물을 탱크에 붓습니다.

가장 짧은 코드가 승리합니다.



4
@Howard, 이전 질문은 잘못 지정되어 (승리 기준이 없음) 포기 되었으므로이 질문이 더 좋으며 닫혀서는 안된다고 생각합니다.
Victor Stafusa

미치겠 지 만 최적의 솔루션은 1이 아닙니다. 가능한 한 많은 5L을 추가하십시오. 2. 필요한 경우 3L을 추가하십시오. 3. 필요에 따라 이미 해결 된 2L 또는 1L 부분을 추가 하시겠습니까?

1
@LegoStormtroopr 모든 것이 사라지면 사실입니다. 그러나 그에 따라 코드 골프가 될 것으로 기대합니다.
WallyWest

3
@LegoStormtroopr 저도 그렇게 생각했지만 6과 9가 아닙니다.
Paul Prestidge

답변:


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에서 입력을받습니다. 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
"이것은 읽기 어려워지고 있습니다 ..."-야, 코드 골프의 요점이 아닌가 ...? ;)
WallyWest

4
@WallyWest Nope. 이를위한 [난독 화] 태그가 있습니다! 저의 겸손한 의견은 길이가 같은 두 개의 코드 골프 솔루션에 대한 것입니다. 가장 읽기 쉬운 것이 가장 좋습니다.
Mr Lister

@MrLister 공정하지만 충분히 난독 화는 원하는 축소를 달성하는 유일한 방법입니다 ...
WallyWest

5

T-SQL 2012 : 1410 1302

SQL의 질문에 대한 또 다른 빠른 시도이지만 버전 2012의 새로운 창 기능 옵션 중 일부를 재생할 수있는 즐거운 기회를 제공했습니다. 또한 재귀 CTE를 활용합니다. 이는 대부분의 프로그래밍 언어에서는 인상적이지 않지만 재귀입니다. SQL에서 말과 버기에서 페라리로 전환하는 것과 같습니다.

이 엔진의 핵심은 5-12 행에 있으며 재귀 CTE와 창 함수를 사용하여 문제를 해결하는 데 필요한 대부분의 숫자 테이블을 만듭니다. 특히 3, 4, 6 또는 9에 대한 테스트를 참고하십시오. 그러면 3에서 4까지 솔루션에 대한 최적의 접근 방식이 보장됩니다. (기술적으로는 3-1 접근 방식과 2-2 접근 방식 사이에 4를 묶는 것이지만 이런 식으로 그렇게하면 많은 캐릭터가 골프를 쳤습니다.) 그러면 다른 단계에 대한 최적의 단계를 조회 테이블에 조인하는 것이 간단합니다. 문제를 해결하고 다른 창 기능을 사용하여 단계의 번호를 올바르게 지정하십시오.

MS SQL이없는 경우 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

입력 결과 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 

편집하다:

로 좋은 점수 향상을 골프

  • CTE의 첫 번째 행에서 불필요한 +5를 제거하고 필요한 WHERE 절
  • VALUES 테이블을 인라인하여 비용이 많이 드는 DECLARE 문 저장
  • 이번에는 Windows 더블 바이트 CRLF를 유닉스 스타일로 변환하는 것을 기억했습니다.

용기, 친구에게 +1 ... MS SQL 바이올린 링크에 대해 매우 인상적이고 감사합니다!
WallyWest

1
하하, 고마워! 나는 실제로 이것을 시작하고 재귀적인 핵심 쿼리를 받았을 때 이것이 가능할 것이라고 믿었다. 그러나 광범위한 문자열 골프를 사용하더라도 필요한 모든 텍스트를 추가하는 것이 장황한 해결책이었습니다. :)
Jonathan Van Matre 2013

내가 "가장 창조적 인"현상금을 할 수 있다면, 당신은 그것을 얻을 것입니다.
WallyWest

나를 LOL로 만든 +1 T-SQL은 확실히 당신의 코드 골프 백을 가지고 다니는 이상한 클럽입니다.
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를 따르는 것이 더 나은지 확인하지 않기 때문에 일부 숫자가 엉망입니다. 예 : 9는 6 대신 9 회전을 제공합니다. 나중에 고칠 수 있습니다.

콘솔에 붙여 넣기

@WallyWest 덕분에 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자를 위해 ...
WallyWest

@WallyWest 감사, ifs 대신 논리 연산자를 사용하는 것에 대해 생각하지 않았다
Sam

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 의 해결책을 가져 갔다 를 쳤다. 나는 의견에 그것을 넣고 싶었지만 내 명성은 충분하지 않다 :

골퍼가 없습니다 :

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

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

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

명령 행에서 입력합니다. 예를 들어 : java X 4


다른 곳에서는 말할 수 없으므로 여기에 의견을 말하고 있습니다. @ LEGO Stormtroopr에는 대체 최적 솔루션이 있습니다 .4L 남은 경우 2L (3 단계)과 동일한 작업을 수행 한 다음 3L 주전자를 비운 다음 나머지 2L 동안 반복하여 7 단계로 완료하십시오 .... 이는 4L이 3L 탱크 (2 단계) 및 5L 방법으로 나뉘어져있는 솔루션과 동일합니다.
Sumedh

@Chron, N 값에 대해 코드가 작동합니까? N % 5는 1 또는 4입니까? 나는 루비를 이해하지 못한다. 그래서 나는 그것을 스스로 테스트 할 수 없었다.
Sumedh

예를 들어 여기에서 N = 11을 확인해야합니다. ideone.com/3ZDuOS 왼쪽 상단에서 편집을 누르고 확인하려면 STDIN을 다른 값으로 변경할 수 있습니다.
Paul Prestidge 2013

와우, 당신은 내 것보다 더 최적의 솔루션을 가지고 있습니다 .... 어떻게 5L을 중지하고 대신 3L을 사용할지 결정합니까? 입력이 81 인 경우 5L을 사용하여 최대 75L을 얻은 다음 3L을 사용하십시오. ip가 89 인 경우 5L은 최대 80L로 사용되고 나머지는 3L입니다.
Sumedh

일부 문자를 저장 : main(String[]s), int n=Integer.parseInt(s[0]),t=0,c=0;, java.io.PrintStream q=System.out;. 또한 첫 번째 while문자를 한두 문자 더 짧게 쓸 수도 있습니다 for. 또한 String반복적이므로 반복적 인 부분을 변수에 저장하거나 하나의 prefab 만 사용하여 빌드하는 함수를 만들 수 있습니다 String.
Victor Stafusa

2

파이썬 2.7-437

가장 짧은 코드는 아니지만 이것이 이것을 해결하는 가장 최적의 방법이라고 생각합니다.

주석에서 언급했듯이 이것을 계산하는 가장 최적의 방법은 다음과 같습니다.

  1. 가능한 한 많은 5L 청크를 섭취하십시오 divmod(amount,5). 그러면 나머지로 4,3,2,1 중 하나가 제공됩니다.
  2. 나머지에서 가능한 경우 3을 가져옵니다.
  3. 나머지는 1 또는 2로 남습니다. 다음과 같이 미리 알려진 최적의 솔루션을 사용하십시오.

    1. 1L, 5 단계 : 3L-> 5L, 3L-> 5L, 3L, 3L (1L 유지)-> 탱크에 1L 유지
    2. 2L, 3 단계 : 5L-> 3L, 5L, 2L에서 2L 유지-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

int를 o에 할당 한 다음 목록을 추가하려고합니다. 5 번 줄에 o, t = [], f * 5를 할당한다고 생각합니다.
psion5mx

1
for, range 및 if 문을 잃어 버리면 한 줄에 399로 줄 수 있습니다. j, T = "% dL jug", "tank"; A = "\ n5L : % d, 3L : % d, T : % d "; F, P =" "+ j + A 채우기", "+ j +"에서 % 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)의 [1,4]) 인쇄 "\ n".join (O), LEN % (O) "\ nVolume은 % d 개의 권선에서 측정"
psion5mx

1
인상적인 조작 ... @ psion5mx 파이썬에서 이런 종류의 프로그래밍이 가능하다고 생각하지 않았습니까? 범위, 재귀 또는 if 문이 없습니까?
WallyWest

목록의 힘. 리스트에 정수를 곱하면 '루프'가 대체됩니다. 부울을 곱하면 'ifs'가 바뀝니다.
psion5mx

또한-따옴표를 제외하고 하나의 공백으로 줄일 수 있었지만 (r in [1,4])를 (r % 5in [1,4]로 바꾸면 캐릭터 비용으로 모든 공백을 제거 할 수있었습니다 이 경우).
psion5mx

2

스몰 토크 (스몰 / X) 568 560 516

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

이건 내가 쓴 것 중 가장 난독 화 된 프로그램이다.

편집 : 다른 스몰 토크는 자동 선언 된 작업 공간 변수를 허용하지 않을 수 있으며 선언을 앞에 추가해야합니다. 또한 bindWith :는 다를 수 있습니다 (expandWith : '<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

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

이전 유효하지 않은 버전 :

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

다음 코드는 degolfed입니다.

#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의 입력에 대해서는 전혀 작동하지 않습니다.
Comintern

1에서 작동하지 않습니까? 동정 ... 그러나 훌륭한 노력 ... :)
WallyWest

네, 몇 가지 버그가 있으며 솔루션이 항상 최적의 것은 아닙니다. 그러나 그것은 8 단계로 1 L를 만듭니다 ...
VX

커플 골프 팁-int N, T, i를 교체하여 6 바이트를 절약 할 수 있습니다. N, T, i, a, b와 함께; int a = 0, b = 0이고; a = b = 0 ;. (printf 정의에 ()를 추가하여 3 바이트를 얻습니다. 가장 큰 이득은 switch 문을 중첩 된 삼항으로 줄이는 것입니다. case 및 break 문은 실제로 더해집니다.
Comintern

2

C ( 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 미만이 될 때까지 5L 주전자를 채우고 비운 다음 3L 주전자로 전환합니다. 두 가지 특수 사례 (6 및 9)를 테스트하고 발견되면 3L 주전자로 전환됩니다. 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);
}

편집 :

  • OP의 설명을 기반으로 스코어링 된 버전에 최적의 성능을 제공하는 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시에 무엇을하십니까? 1 5, 3 3 (8)은 2 5를 이길 것이고 다른 4 리터를 구성 할 것입니다 (4 턴에는 불가능합니다).
Bill Woodger

11과 14는 모두 특별한 경우를 포함합니다. 첫 5L을 빼면 각각 6과 9가 남고 특수한 경우에 처리됩니다. 9는 3L 주전자 사용하여 적은 단계로 수행 할 수있는 가장 큰 수입니다 . 14의 입력은 8 단계 솔루션을 제공하고 11의 출력은 위에 있습니다.
Comintern

2

T-SQL (2012) : 794 689 580

@ Lego-Stormtroopr 알고리즘 과 함께 @ Jonathan-Van-Matre 의 T-SQL 응답에서 영감을 얻었습니다 . 나는 99 병의 맥주를 즐 겼기 때문에 이것을하고 싶었다. 도전을 습니다.

나는 창문을 유지하려고 노력했다.OVER수학 / 부울 함수보다 ) 함수를 최소한 .

SQLFiddle이 여기 있습니다 .

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

샘플 출력이 있습니까?
Bill Woodger

@BillWoodger의 출력은 추가input = 8
comfortablydrei

감사. 8은 매우 쉽습니다. 1 ~ 11은 코드에 좋은 스트레칭을 제공합니다. :-) 내가 upvoting하고 있으므로 돌아와서 작동하지 않는다고 말하지 마십시오.
Bill Woodger 2016 년

@Bill 감사합니다. 로 변경input = 11
comfortablydrei

@comfortablydrei T-SQL을 사용한 놀라운 것들 ... Jonathon의 저서에서 페이지를 가져 오는 중 ...
WallyWest

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

설명

우리는 4L 즉 3L 주전자, 5L 주전자, 탱크 및 foutain을 가지고 있습니다. 우리가 할 수있는 유일한 작업은 물을 물체에서 물체 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)이용한 16 진수로 (a << 2) | b, 그리고 사용하여 디코딩divmod(x, 4) . 이 트릭을 사용하면 5 가지 솔루션 ( reminder=0, 1, 2, 3, 4)을 모두 ['','c1c12','d46','c2','d434d46']원래 형식보다 약간 짧은 array로 인코딩 할 수 있습니다 .

    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

COBOL (IBM Enterprise COBOL) 192 의 72 자

이것은 질문에 대한 개념 증명이며 Golf-COBOL에 대한 개념 증명의 시작입니다 :-)

질문은 가장 빠른 것을 요구합니다. 따라서 병렬 처리를 구현하십시오. 한 사람이라도 동시에 하나의 3L 용기와 하나의 5L 용기를 쉽게 채울 수 있습니다.

입력을 8로 나누면 나머지도 남습니다. 8 개가 정확히 맞는 횟수만큼 5L / 3L을 채우고 남은 1 ~ 7 리터를 처리하십시오.

나머지 중에서 가장 흥미로운 것은 4 리터입니다. 1 리터 + 3 리터로 사용하면 주변의 물이 훨씬 줄어들고 다른 가능성은 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

잘못된 위치에서 코드를 시작하고 필요한 전체 정지가 부족한 경우 진단 메시지가 절대적으로로드됩니다.

어떤 진단도 객체 코드에 영향을 미치지 않습니다. 따라서 RC = 8로 흩어 졌음에도 불구하고 객체가 정상이라는 것을 알고 있으므로 연결하여 실행했습니다.

1 ~ 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 

@BillWoodger; 그러나 나는 사용 가능한 지침 내에서 "둘 다 주전자 채우기"명령을 설정하지 않았습니다 ... 놀라운 작업과 a) COBOL 사용, b) 가장 빠른 방법 경로로 가는 소품 .
WallyWest

1
@WallyWest 감사합니다. 비즈니스 사양을 향상시킬 수 있다고 생각되면 항상 그렇게합니다 :-). 나는 "분수로 비운"것도 필요하지 않았기 때문에 두 가지 새로운 것과 두 가지가 사용되지 않았다-이중 실패!
Bill Woodger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.