3 ve 5 Litrelik Sürahi Yapboz


14

Bunu Die Hard'da görmüş olabilirsiniz : İntikam ile ... Bu soru ünlü 3 ve 5 Litrelik Sürahi Puzzle'a dayanıyor, ancak biraz farklı bir eğime sahip.

1 ve 100 arasında bir tamsayı verildiğinde, 3 litrelik bir sürahi ve 5 litrelik bir sürahi kullanarak bir tanka, bir çeşmeden karşılık gelen litre su miktarını ölçmek için en hızlı talimatları sağlayacak bazı kodları golf.

Sürahilerden hiçbirinde derecelendirme yoktur; çeşme, su temininde bol miktarda bulunur ve tankın, kodun her yürütülmesinin başlangıcında boşaltıldığı varsayılır.

Tanka girdikten sonra tanktan suya erişemezsiniz.

Yürütme biçimi aşağıdaki gibidir:

Giriş:

4 Örneğin.

Çıktı

Her numaralandırılmış adımı, gösterildiği gibi, ardından 5L sürahi, 3L sürahi ve tankın hacimlerini takip edin. Tally formatı da aşağıda gösterilmiştir. Adım sayısı, adımların sonunda da verilmelidir.

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

ÖRNEK 2

Giriş: 8

Çıktı:

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

Sözleşmeler

  1. Fill xL jug - ilgili sürahiyi çeşmeden tepeye doldurur
  2. Empty xL jug - ilişkili sürahinin içeriğini çeşmeye boşaltır
  3. Pour from xL jug into yL jug - xL sürahisinin içeriğini yL sürahisine dökür
  4. Pour from xL jug into tank - xL sürahinin içeriğini tanka döküyor

En kısa kod kazanır.



4
@Howard, eski soru kötü belirtilmiş (kazanan kriter yok) ve terk edildi, bu yüzden bu daha iyi olduğunu düşünüyorum ve kapatılmamalıdır.
Victor Stafusa

Bana deli deyin, ama en uygun çözüm 1 olacak. Mümkün olduğunca çok 5L ekleyin, 2. Gerekirse 3L ekleyin, 3. Zaten çözülmüş bir 2L veya 1L bölümü ekleyin?

1
@LegoStormtroopr Her şey kaynadığında, doğru. Ama ben buna göre kod golfed bekliyoruz.
WallyWest

3
@LegoStormtroopr Ben de düşündüm, ama 6 ve 9 karşı örnek değil mi?
Paul Prestidge

Yanıtlar:


6

Yakut, 407 376 365 331 324 323

Bunu okumak biraz zorlaşıyor ...

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 üzerine girdi alır. N = 10 için örnek çalışma:

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
"Bu okuması biraz zorlaşıyor ..." - Dostum, bu kod golf noktası değil mi ...? ;)
WallyWest

4
@WallyWest Hayır. Bunlar için bir [gizleme] etiketimiz var! Benim düşünceme göre, aynı uzunlukta iki codegolf çözümü, en okunabilir olanı en iyisi olurdu.
Bay Lister

@MrLister Fuarı yeterli, ancak bazen şaşırtmak istenen büzülmeyi elde etmenin tek yoludur ...
WallyWest

5

T-SQL 2012: 1410 1302

SQL'de bir soruya başka bir quixotic girişimi, ancak bu, 2012 sürümündeki bazı yeni pencere işlevi seçenekleriyle oynamak için keyifli bir fırsat sundu. Buna ek olarak, çoğu programlama dilinde etkileyici olmayan hiçbir şey olmayan özyinelemeli CTE'lerden yararlanıyor, özyineleme SQL'de at ve arabacıdan Ferrari'ye geçmeye benzer.

Bunun kalbindeki motor, sorunu çözmek için gereken sayıların çoğunun bir tablosunu oluşturmak için özyinelemeli bir CTE ve bir pencere işlevi kullanan 5-12 satırlarındadır. Özellikle 3, 4, 6 veya 9 için olan teste dikkat edin. (Teknik olarak, 3-1 yaklaşımı ile 2-2 arasında 4'lük bir kravat, ancak bu şekilde yapmak bana birçok karakter getirdi.) O zaman farklı adımlar için en uygun adımların bir arama tablosuna katılmak basit bir mesele. sorun yığınları ve adımları düzgün numaralandırmak için başka bir pencere işlevi kullanın.

Eğer etrafta MS SQL yoksa , SQLFiddle'da onunla oynayın.

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

Giriş 42 için sonuçlar:

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 

Düzenle:

Tarafından iyi bir puan iyileştirme Golf

  • CTE'nin ilk sırasında gereksiz bir +5 ve gerektirdiği WHERE maddesini ortadan kaldırmak
  • VALUES tablolarını astarlamak, maliyetli DECLARE ifadelerini kaydetmek
  • Windows çift baytlı CRLF'leri bu kez Unix stiline dönüştürmeyi unutmayın.

Cesaret için + 1, ahbap ... Çok etkileyici ve MS SQL keman bağlantısı için teşekkürler!
WallyWest

1
Haha, teşekkürler dostum! Aslında ben bu başladı ve özyinelemeli çekirdek sorgu vardı kazanılabilir olabilir inanıyordu. Ancak kapsamlı dize golf ile bile, gerekli tüm metinleri eklemenin ayrıntısı, son çözümümü mahkum etti. :)
Jonathan Van Matre

"En yaratıcı" bir ödül
yapabilseydim

+1 beni LOL yapmak için. T-SQL kesinlikle kod golf çantanızda taşımak için garip bir kulüp.
Komintern

5

Javascript: 481

Golf için ilk deneme, tavsiye takdir

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

Bazı sayılarla karıştırır, çünkü 3 veya 5 dökmenin daha iyi olup olmadığını kontrol etmez, örnek: 9 6 yerine 9 dönüş verir, daha sonra düzeltebilirim

Konsola yapıştır

@WallyWest sayesinde 553 ila 481 arası


1
Deneyebilirsiniz: 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 karakter için ...
WallyWest

@WallyWest teşekkürler, ifs yerine mantıksal operatörleri kullanmayı düşünmedim
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))}}

Sumedh'in çözümünü aldım ve golf oynadım. Yorumlara koymak istedim ama itibarım yeterli değil :(.% 40 daha az, en azından paylaşılması gerektiğini düşünüyorum.

İşte ungolfed:

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

Not: sadece ilk çalıştırmada çalışır. Tekrar çalıştırın ve sonuç yanlış olacaktır (global bir değişken nedeniyle).

Aşağıdaki sürüm güvenlidir, ancak 610'dan 612'ye kadar 2 karakter kaybediyoruz:

    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 için örnek çıktı:

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

İşte kod

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

Giriş komut satırından. örneğin: java X 4


Başka bir yere yorum yapamam, bu yüzden burada yorum yapıyorum. @Lego Stormtroopr, alternatif bir optimum çözüm var, burada 4L kalan için, 2L (3 adım) için olanla aynı şeyi yapın, sonra 3L sürahiyi boşaltın ve kalan 2L için tekrarlayın, böylece 7 adımda tamamlayın. Bu, 4L'nin bölündüğü çözümünüz için aynıdır: 3L tanka (2 adım) ve kalan 1L için 5 adımlık bir yöntem.
Sumedh

@ Chron, kodunuz, N% 5'in 1 veya 4 olduğu N değerleri için çalışıyor mu? Yakut anlamıyorum, bu yüzden kendim test edemedim ...
Sumedh

örneğin, burada N = 11'e bakmalıdır : ideone.com/3ZDuOS Sol üstteki düzenlemeye basabilir ve kontrol etmek isterseniz STDIN'i diğer değerlerle değiştirebilirsiniz.
Paul Prestidge

Vay canına, benimkinden daha optimum bir çözümünüz var .... 5L'yi ne zaman durduracağınıza ve 3L'yi ne zaman kullanmaya karar veriyorsunuz? Yani, giriş 81 ise, 5L kullanarak 75L'ye kadar çıkın ve sonra 3L'yi kullanın. ip 89 ise, 80L'ye kadar 5L kullanılır ve kalan 3L'dir.
Sumedh

Bazı karakter kaydet: main(String[]s), int n=Integer.parseInt(s[0]),t=0,c=0;, java.io.PrintStream q=System.out;. Ayrıca, birinciyi whilebir veya iki karakter daha kısa olarak yazmak da mümkün olabilir for. Ayrıca, Strings tekrarlayan, tekrarlayan parçaları değişkenlerde depolamak veya sadece bir prefabrik kullanarak onları inşa fonksiyonları oluşturmak için çalışabilirsiniz String.
Victor Stafusa

2

Python 2.7-437

En kısa kod değil, ama bu çözmenin en uygun yolu olduğunu düşünüyorum.

Yorumlarda belirttiğim gibi, bunu hesaplamanın en uygun yolu:

  1. Mümkün olduğunca çok sayıda 5L alın - divmod(amount,5). Bu size kalan 4,3,2,1'den birini verecektir.
  2. Kalandan 3 (mümkünse) alın.
  3. Kalan 1 veya 2 bırakır. Önceden bilinebilecek her ikisi için de en uygun çözümü kullanın:

    1. 1L, 5 adım: 3L -> 5L, 3L -> 5L, 1L'yi 3L, 3L'de (1L tutarak) -> tankta bırakır
    2. 2L, 3 adım: 5L -> 3L, 5L, 5L (2L tutarak) -> tankta 2L bırakır

Kod:

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)

Ve 7 adımda 4L için bir çıktı:

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

Bir int için o atarsınız ve sonra bir liste eklemeye çalışırsınız. Sanırım 5. hatta o, t = [], f * 5 atamak
istediniz

1
, Range ve if ifadeleri için bunları kaybettiğinizde tek satırda 399'a kadar indirebilirsiniz: j, T = "% dL sürahi", "tank"; A = "\ n5L:% d, 3L:% d, T :% d "; F, P =" Dolgu "+ j + A," "+ j +" 'dan% s "+ A'ya dökün; f, r = divmod (giriş (), 5); t, o = f * 5, []; o = [% F (5,5,0,5 * ı), 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)] * ([1,4] 'de r); "\ n" .join (o), "\ n% d cinsinden ölçülen hacim"% len (o)
psion5mx

1
Etkileyici manipülasyon ... @ psion5mx Python'da bu tür bir programlamanın mümkün olduğunu düşünmedim mi? Aralık, özyineleme veya if ifadeleri yok mu?
WallyWest

Listelerin gücü. Bir listeyi bir tamsayı ile çarpmak 'döngülerin' yerini alır. Bir boole ile çarpılması, 'ifs' yerine geçer.
psion5mx

Ayrıca - tek bir boşluğa (tırnak işaretleri dışında) indirmeyi başardım, ancak ([1,4] 'de r) yerine (r% 5in [1,4] ile değiştirerek bir karakteri pahasına olan tüm boşlukları ortadan kaldırabilirim ) bu durumda.
psion5mx

2

Smalltalk (Smalltalk / X), 568 560 516

n olarak giriş:

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

oğlum bu şimdiye kadar yazdığım en şaşkın program ...

Düzenleme: Bazı diğer Smalltalks otomatik beyan edilen çalışma alanı değişkenlerine izin vermeyebilir ve bildirimlerin önüne başlamanız gerekir. Ayrıca bindWith: farklı olabilir (expandWith: '<p>').

n = 17 için örnek çıktı:

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

önceki geçersiz sürüm:

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

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

Bu 9 için en uygun çözümü vermez (8 tur, 6 olmalıdır - 3L'yi 3 kez doldurun ve boşaltın).
Komintern

Ayrıca 1 girişi için de işe yaramıyor.
Comintern

1 için çalışmıyor mu? Yazık ... Ama takdire şayan bir çaba ... :)
WallyWest

Evet, bazı hatalar var ve çözüm her zaman optimal değil. ama 8 adımda 1 L yapar ...
VX

Çift golf ipuçları - int N, T, i değiştirerek 6 bayt kaydedebilirsiniz; N, T, i, a, b ile; ve int a = 0, b = 0; a = b = 0 ile; De görebilirsiniz (Printf tanımına ekleyerek 3 bayt olsun gerçi en büyük kazanç iç içe bir üçlü geçiş deyimini azaltılması olacağını düşünüyorum -. Vaka ve kırılma ifadeleri gerçekten ekleyin.
Komintern'i

2

C ( 480 465 bayt)

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

En iyi sürüm (10 bayt ekler)

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

Muhtemelen burada daha fazla golf yapılacak - çıktı fonksiyonları beni öldürüyordu. Bu en uygun çözümü vermelidir (en az adım). Buradaki diğer koda benzer şekilde, 5L sürahileri 5'in altına düşene kadar doldurur ve boşaltır ve daha sonra 3L sürahilere geçer. 2 özel durumu (6 ve 9) test eder ve bulursa 3L sürahiye geçer. 1L ve 2L alma talimatları sabit kodlanmıştır.

Daha okunabilir versiyon:

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

Düzenlemeler:

  • OP'nin açıklamasına göre puanlanan sürüm için en iyi performansı veren 10 bayt kaldırıldı.
  • İşlevi tanımlamaya dönüştürerek 5 bayt tıraş edin.

N = 11 için test çıkışı (optimum sürüm):

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

Neden 11'i özel bir vaka olarak saymıyorsunuz? 14 için ne yaparsın? Bir beş, üç üçlü (8) iki beşi yenecek ve diğer dört litreyi (dört turda yapılamaz) oluşturacak.
Bill Woodger

11 ve 14'ün her ikisi de özel durumları içerir. İlk 5L'yi çıkardıktan sonra sırasıyla 6 ve 9'dan ayrılırlar ve bunlar özel durumlar tarafından ele alınır. 9, sadece 3L sürahi kullanılarak daha az adımda yapılabilecek en büyük sayıdır . 14 girişi 8 adımlı çözümü verir, 11 için çıkış yukarıdadır.
Komintern

2

T-SQL (2012): 794 689 580

Esinlenerek Jonathan-Van-Matre @ 'ile birlikte s T-SQL cevap Lego Stormtroopr @ s algoritması'. Bunu yapmak istedim çünkü 99 Şişe Bira meydan okumasından çok keyif aldım .

OVERMath / bool işlevlerinin tercihine göre window ( ) işlevlerini minimumda tutmaya çalıştım .

SQLFiddle burada .

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

Giriş: 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

İnsan tarafından okunabilir:

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

Bazı örnek çıktılarınız var mı?
Bill Woodger

@BillWoodger için çıktı eklediinput = 8
comfortablydrei

Teşekkürler. 8 oldukça kolaydır. Bir ila 11 kod iyi bir streç verir :-) Ben upvoting, bu yüzden geri gelmek ve bana işe yaramaz söyle.
Bill Woodger

@ Fatura Teşekkürler. Değiştirildiinput = 11
comfortablydrei

@comfortablydrei T-SQL kullanarak şaşırtıcı şeyler ... Jonathon'un kitabından bir sayfa alıyor ...
WallyWest

1

Python 3 (417 karakter)

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

Açıklaması

4 nesnemiz olduğunu, yani 3L sürahi, 5L sürahi, tank ve çeşme olduğunu unutmayın. Yapabileceğimiz tek işlem suyu nesneden nesneye ataşımaktır b. Kodumdaki işlev budur o(a, b), suyu hareket ettirir ve yazdırır ve saymaya devam eder.

Hileler

  • N=['3L jug','5L jug','tank',0]. Burada kaçınmak için son elemente ihtiyacım var IndexError. Ayrıca, geniş kapsamlı globalanahtar kelime olmadan genel sayma değişkeni olarak kullanılabilir . Örneğin,N[3] += 1

  • Yana 0 <= a < 4, 0 <= b < 4fonksiyonunda o(a, b), biz kodlayabilir (a, b)kullanarak bir altıgen basamak halinde (a << 2) | b, ve kullanarak çözmek divmod(x, 4). Bu hile ile, tüm 5 çözüm ( reminder=0, 1, 2, 3, 4), ['','c1c12','d46','c2','d434d46']orijinal biçiminden biraz daha kısa olan diziye kodlanabilir :

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

Örnek Çıkışı (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) 72 karakterden oluşan 192 satır

Bu soru için bir kavram kanıtıdır ve Golf-COBOL için bir kanıtıdır :-)

Soru en çabuk soruyor. Yani, paralellik uygulayın. Bir kişi bile bir 3L sürahiyi ve bir 5L sürahiyi aynı anda kolayca doldurabilir.

Girdiyi sekize bölün ve kalanını da bırakın. Sekiz tam olarak kaç kez sığacak kadar hızlı 5L / 3L dolum yapın, sonra kalan bir ila yedi litre ile ilgilenin.

Kalanın en ilginç olanı dört litredir. Bir litre artı üç litre olarak yapmak, çok daha az su iter, diğer olasılıklar için sadece 18 litre vs 23.

Kod (çalışıyor)

   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

Bu, kodun yanlış yerde başlaması ve gerekli tam durdurmaların eksik olması için tanılama mesajlarının mutlak bir yükünü alır.

Teşhislerin hiçbiri nesne kodu üzerinde herhangi bir etki göstermez. Yani, yakalanmış bir RC = 8 olmasına rağmen, nesnenin iyi olacağını biliyorum, bu yüzden onu bağladı ve çalıştırdı.

İşte bir ila sekiz litrelik çıkışlar. Bundan sonra, tüm sonuçlar sezgisel olabilir. 17 ve 100 paralellik örnekleri olarak dahil edilmiştir.

Programı karakterlerle sıkıştırmak için yapılabilecek çok şey var, ilk önce doğru çıktı önemliydi. Karakterleri sabit uzunluktaki çizgilerdeyken saymak tamamen başka bir şeydir.

Örnek çıktı:

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 

Takdire şayan bir yaklaşım, @ BillWoodger; Ancak mevcut talimatlar içinde "her iki sürahiyi doldur" komutunu ayarlamadım ... wonfderful çalışma ve a) COBOL kullanarak, b) en hızlı yöntem yolu ile gidiyor .
WallyWest

1
@WallyWest Teşekkürler. Ben iş spec geliştirilebilir düşünüyorum, ben her zaman bunu :-). Ben de "çeşme içine boş" gerek yoktu, bu yüzden iki yeni ve iki kullanılmayan - çift başarısızlık!
Bill Woodger
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.