Giải câu đố 14-chốt


8

Giới thiệu

Một câu đố phổ biến liên quan đến một bảng hình tam giác với 15 lỗ cho tees / chốt như trong hình dưới đây:

Hình ảnh bảng chốt mẫu

Bắt đầu với tất cả các chốt trong bảng ngoại trừ một lỗ ở trên cùng, điểm của câu đố là nhảy các chốt giống nhau như cờ đam theo cách để lại chính xác một chốt còn lại. Động thái hợp lệ duy nhất là nhảy một chốt qua một chốt liền kề theo bất kỳ hướng nào vào một lỗ trống. Các chốt đã được nhảy sau đó được gỡ bỏ khỏi bảng. Chơi kết thúc khi vẫn không có động thái hợp lệ.

Thông số kỹ thuật

Công việc của bạn là viết một chương trình có thể tìm ra một giải pháp hoàn chỉnh cho câu đố chốt, tức là một chương trình để lại chính xác một chốt còn lại. Có nhiều giải pháp khả thi, vì vậy chương trình của bạn chỉ cần in một.

  • Chương trình của bạn sẽ không nhận được đầu vào. Bạn không được phép đọc dữ liệu từ bất kỳ nguồn bên ngoài nào.
  • In ra danh sách 13 di chuyển cho kết quả còn lại 1 chốt bằng định dạng này:

    Peg 1 jumps Peg 3 to Hole 6.

  • Các lỗ / chốt được đánh số từ trên xuống dưới, từ trái sang phải, sao cho chốt / lỗ trên cùng là 1, đánh số cho đến khi phía dưới bên phải là 15.
  • Chương trình của bạn phải tìm giải pháp trong thời gian chạy . In ra một giải pháp trực tiếp bằng bất kỳ phương tiện nào khác ngoài việc giải quyết nó trong chương trình là việc không đủ tiêu chuẩn.
  • Phần thưởng : nhận 10 điểm thưởng nếu bạn có thể xuất nhiều giải pháp duy nhất (chỉ có thể in cách nhau bằng các dòng trống).
  • Phần thưởng : nhận 5 điểm thưởng nếu số 15đó không xuất hiện trong mã nguồn của bạn.

Chấm điểm

Đây là môn đánh gôn, vì vậy giải pháp ngắn nhất (tính theo số byte) in ra câu trả lời đúng sẽ là người chiến thắng. Điểm thưởng được trừ vào tổng số byte của bạn. Vui lòng cung cấp một đầu ra mẫu để chạy chương trình của bạn cũng như liên kết đến ideonehoặc một số trang web tương tự nếu có thể chứng minh việc thực hiện chương trình của bạn.


Làm thế nào để bạn trộn lẫn các điểm thưởng với tiêu chí chiến thắng khách quan, mà chúng ta chỉ có thể giả sử là số lượng nhân vật vì điều này có thẻ golf-code?
JB

Đã thêm làm rõ "Điểm thưởng được trừ vào tổng số byte của bạn.", Điều đó có hợp lý không?
mellamokb

phần thưởng thứ hai quá dễ dàng để có được,15=0xff=(1<4)-1=~(-1<<4)=...
ratchet freak

3
Một số đại diện của bạn dài hơn = 5 ký 15tự;)
mellamokb

Câu trả lời:


8

Ruby, điểm 240 238 234 = 249 - 10 - 5

s=->t,r,c{c>0?(t+t.reverse).gsub(/[A-O]{2}[a-o]/){|j|s[t.tr(j,j.swapcase),r+"Peg #{j[0].ord-64} jumps Peg #{j[1].ord-64} to Hole #{j[2].ord-96}.\n",c-1]}:$><<r+"\n"}
s["aBD,BDG,DGK,CEH,EHL,FIM,aCF,CFJ,FJO,BEI,EIN,DHM,DEF,GHI,HIJ,KLM,LMN,MNO,","",13]

Một triển khai ruby ​​đơn giản in tất cả các giải pháp có thể cho câu đố này (mất ít hơn một phút trên máy tính của tôi). Các dòng đầu ra có thể được nhìn thấy ở đây:

Peg 6 jumps Peg 3 to Hole 1.
Peg 4 jumps Peg 5 to Hole 6.
Peg 1 jumps Peg 2 to Hole 4.
Peg 14 jumps Peg 9 to Hole 5.
Peg 7 jumps Peg 8 to Hole 9.
Peg 12 jumps Peg 13 to Hole 14.
Peg 10 jumps Peg 6 to Hole 3.
Peg 4 jumps Peg 5 to Hole 6.
Peg 3 jumps Peg 6 to Hole 10.
Peg 15 jumps Peg 10 to Hole 6.
Peg 6 jumps Peg 9 to Hole 13.
Peg 14 jumps Peg 13 to Hole 12.
Peg 11 jumps Peg 12 to Hole 13.

Peg 6 jumps Peg 3 to Hole 1.
Peg 4 jumps Peg 5 to Hole 6.
Peg 1 jumps Peg 2 to Hole 4.
Peg 14 jumps Peg 9 to Hole 5.
Peg 7 jumps Peg 8 to Hole 9.
...

Và ví dụ trực tuyến có thể được tìm thấy ở đây .


Tôi tò mò có bao nhiêu giải pháp tổng thể?
mellamokb

@mellamokb Nó nói có 29760 giải pháp.
Howard

4
29760 giải pháp? Khi tôi lần đầu tiên phát hiện ra trò chơi này, tôi đã mất mãi mãi để tìm thấy một trò chơi .
PhiNotPi

2
Lạ thật đấy. Có 2 ^ 14 (16384) hội đồng quản trị và có lẽ không phải tất cả đều có thể truy cập được. Tôi cá là sẽ có ít giải pháp hơn các bang.
kaoD

2
@kaoD: Một giải pháp thực sự là một chuỗi gồm 13 lần di chuyển (13 trạng thái liên tiếp từ trạng thái ban đầu), trong đó có kỹ thuật (2 ^ 15) ^ 13 khả năng duy nhất và trong đó phần lớn rất không đúng theo quy tắc . Thực tế cũng có 2 ^ 15 (32768) trạng thái bảng có thể có bởi vì có 15 lỗ có thể được lấp đầy hoặc trống (trong đó một số ít không liên quan kể từ khi bảng bắt đầu bằng một lỗ)
mellamokb

3

Python, 324 ký tự, điểm = 319

f=0xf
x=0x12413624725935836a45647b48d58c59e69d6af78989abcdcdedef
Z=[(x>>12*i&f,x>>12*i+4&f,x>>12*i+8&f)for i in range(18)]
M=[[65532,'']]
for i in' '*13:
 Q=[]
 for p,m in M:
  for a,b,c in[x[::-1]for x in Z]+Z:
   if p>>a&p>>b&~p>>c&1:Q+=[[p^2**a^2**b^2**c,m+"Peg %d jumps Peg %d to Hole %d.\n"%(a,b,c)]]
 M=Q
print M[0][1]

Trạng thái chốt được giữ như một bitmask. Mchứa một danh sách các trạng thái chốt và các hướng dẫn để đến trạng thái đó.

Tôi cũng có thể làm cho nó in ra tất cả các giải pháp (có 29760 trong số chúng), nhưng sẽ tốn hơn 10 ký tự để thực hiện.

Tôi không thể đăng nó trên ideone vì phải mất khoảng 90 giây để chạy.

Đầu ra:

Peg 6 jumps Peg 3 to Hole 1.
Peg 4 jumps Peg 5 to Hole 6.
Peg 1 jumps Peg 2 to Hole 4.
Peg 14 jumps Peg 9 to Hole 5.
Peg 12 jumps Peg 13 to Hole 14.
Peg 7 jumps Peg 8 to Hole 9.
Peg 10 jumps Peg 6 to Hole 3.
Peg 4 jumps Peg 5 to Hole 6.
Peg 3 jumps Peg 6 to Hole 10.
Peg 15 jumps Peg 10 to Hole 6.
Peg 6 jumps Peg 9 to Hole 13.
Peg 14 jumps Peg 13 to Hole 12.
Peg 11 jumps Peg 12 to Hole 13.

Bạn chỉ phải in tối thiểu 2 giải pháp để nhận được điểm thưởng 10 điểm.
mellamokb

3

C, 386 ký tự, điểm = 371

int f[37],o[36],t[36],r[14],i[14],m=1,s=~3,j=18;main(){while(j--)o[j]=o[18+j]=(f[j]=t[18+j]="AABBCCDDDEEFFGHKLM"[j]-64)+(t[j]=f[18+j]="DFGIHJKMFLNMOIJMNO"[j]-64)>>1;while(m)if(!f[++j])s=r[--m],j=i[m];else if(s>>f[j]&s>>o[j]&~s>>t[j]&1)if(r[m]=s,s^=1<<f[j]|1<<o[j]|1<<t[i[m]=j],j=-1,++m>13)for(m=printf("\n");m<14;++m)printf("Peg %d jumps Peg %d to Hole %d.\n",f[i[m]],o[i[m]],t[i[m]]);}

In ra tất cả 29760 giải pháp, trong một giây.

Phiên bản này giả định (trong số những thứ khác) rằng trình biên dịch sẽ cho phép khai báo ngầm định của printf (). Khoảng sáu ký tự nữa có thể được lưu bằng cách sử dụng ẩn, nhưng tính năng đó đã bị xóa khỏi C99.

Ngoài ra, có thể lưu thêm bốn byte bằng cách thay thế chữ in hoa trong hai chuỗi bằng các ký tự điều khiển tương ứng. Tôi đã không làm điều đó ở đây bởi vì trình biên dịch không bắt buộc phải cho phép các chuỗi như vậy và nó làm cho mã nguồn dày đặc hoàn toàn không thể đọc được.

Để rõ ràng, đây là thuật toán tương tự mà không cần tối ưu hóa kích thước khó hiểu hơn:

#include <stdio.h>
int f[37], o[36], t[36], r[14], i[14], m, j, s = ~3;
int main(void)
{
    for (j = 0 ; j < 18 ; ++j) {
        f[j] = t[18+j] = "AABBCCDDDEEFFGHKLM"[j] - 64;
        t[j] = f[18+j] = "DFGIHJKMFLNMOIJMNO"[j] - 64;
        o[j] = o[18+j] = (f[j] + t[j]) >> 1;
    }
    j = 0;
    for (m = 1 ; m ; ++j) {
        if (!f[j]) {
            --m;
            s = r[m];
            j = i[m];
        } else if ((s >> f[j]) & (s >> o[j]) & (~s >> t[j]) & 1) {
            r[m] = s;
            i[m] = j;
            s ^= (1 << f[j]) | (1 << o[j]) | (1 << t[j]);
            j = -1;
            ++m;
            if (m > 13) {
                printf("\n");
                for (m = 1 ; m < 14 ; ++m)
                    printf("Peg %d jumps Peg %d to Hole %d.\n",
                           f[i[m]], o[i[m]], t[i[m]]);
            }
        }
    }
    return 0;
}

f, o và t là danh sách các bước nhảy hợp pháp được khởi tạo trong vòng lặp đầu tiên. r và tôi hình thành nên lịch sử mà chương trình sử dụng để quay lại và khám phá tất cả các trò chơi có thể.

Tôi chắc chắn rằng điều này có thể được cải thiện!


Có một tiết kiệm một char trong khởi tạo thay thế >>1bằng /2.
Peter Taylor

Sử dụng / thay vì >> sẽ cần parens xung quanh việc bổ sung.
hộp bánh mì

À, đọc sai parens vì chúng khác nhau ở người không có kiến ​​thức.
Peter Taylor
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.