Làm thế nào mạnh mẽ là số không?


10

Bạn được cấp một số nguyên không âm (cơ số 9) không âm gồm các chữ số từ 0 đến 8 như bình thường. Tuy nhiên, số chữ số trong số này (không có số 0 đứng đầu) là một hình vuông hoàn hảo.

Bởi vì điều này, số có thể được sắp xếp trong một lưới vuông (với thứ tự đọc vẫn được bảo tồn).

Ví dụ với 1480 (1125 cơ sở 10):

14
80

Bây giờ, hãy để mỗi chữ số trong một lưới không phải như vậy biểu thị một chuyển động đến một không gian lưới khác (với các điều kiện biên định kỳ ):

432
501
678

Điều này nói rằng

0 = stay still
1 = move right
2 = move right and up
3 = move up
...
8 = move right and down

Vì vậy, nếu trong lưới 1480 bạn bắt đầu ở số 4, thì bạn di chuyển lên (nhớ pbc) và sang trái số 8, có nghĩa là bạn di chuyển sang phải và quay lại số 4, bắt đầu một chu kỳ với giai đoạn 2.

Nói chung, quá trình này được tiếp tục cho đến khi bạn về 0 hoặc một chu kỳ được chú ý. (A 0 được coi là một chu kỳ với giai đoạn 1.)

Trong trường hợp 1480, khoảng thời gian cuối cùng đạt được tại mỗi trong số 4 chữ số bắt đầu 2 2 2 1tương ứng.

Đối với lưới lớn hơn, các số này có thể lớn hơn 8, nhưng chúng ta vẫn có thể sử dụng chúng dưới dạng "chữ số" trong một số không phải là số mới (đơn giản là các hệ số của 9 ^ n như thể chúng là các chữ số):

2*9^3 + 2*9^2 + 2*9 + 1 = 1639 (base 10) = 2221 (base 9)

Chúng tôi sẽ gọi đây là sức mạnh của số không ban đầu. Vậy cường độ của 1480 là 1639 (cơ sở 10) hoặc tương đương là 2221 (cơ sở 9).

Thử thách

Viết chương trình ngắn nhất cho biết cường độ của một số không phải lớn hơn, nhỏ hơn hoặc bằng chính số đó. (Bạn không nhất thiết phải tính toán sức mạnh.)

Đầu vào sẽ là một số không âm không âm có chứa một số chữ số vuông (và không có số 0 đứng đầu bên cạnh trường hợp đặc biệt là 0). Nó nên đến từ dòng lệnh hoặc stdin.

Đầu ra sẽ đi đến thiết bị xuất chuẩn như:

G if the strength is larger than the original number (example: 1480 -> strength = 2221)
E if the strength is equal to the original number (example: 1 -> strength = 1)
L if the strength is less than the original number (example: 5 -> strength = 1)

Thử thách tiền thưởng thú vị:
Đầu vào cao nhất bạn có thể tìm thấy bằng với sức mạnh của nó là gì? (Có giới hạn không?)


Đối với đầu vào, nó có được đưa ra dưới dạng số thập phân các chữ số giống với số không hoặc số đại diện thập phân (hoặc nhị phân) của số không? tức là: đối với 1480 (không), đầu vào sẽ là 1480 hay 1125?
overactor

@overactor Ở định dạng nonary.

2
Tôi khá tự tin rằng không ai sẽ tìm thấy đầu vào cao hơn tương đương với sức mạnh của nó hơn 10 ^ 71-1 (không phải), đó là một số 64 chữ số chỉ bao gồm 8
overactor

@overactor Có thể là có thể với các chu kỳ có thời gian lớn hơn 8, tôi nghĩ vậy.
Martin Ender

@ MartinBüttner tôi sẽ rất ấn tượng nếu bạn tìm thấy bất kỳ thứ gì trong số đó.
overactor

Câu trả lời:


2

Con trăn 2, 213 209 202

Chỉnh sửa: Loại bỏ shortcircuiting, đôi khi không chính xác. Xem bên dưới.

(Phần lớn) Thuật toán tương tự như @KSab, nhưng rất nặng nề.

n=`input()`
s=int(len(n)**.5)
c=0
for i in range(s*s):
 a=[]
 while(i in a)<1:a+=[i];x='432501678'.find(n[i]);i=(i+x%3-1)%s+((i/s+x/3-1)%s)*s
 c=c*9+len(a)-a.index(i)
d=long(n,9)
print'EGL'[(c>d)-(c<d)]

Sân gôn:

  • 213: Giải pháp ngắn mạch, thiếu sót.

  • 209: Giải pháp làm việc đầu tiên.

  • 202: Kết hợp hai tra cứu chuỗi thành một.

Chỉnh sửa: Tôi mới nhận ra rằng chương trình này, và do đó, cả KSab cũng bị lỗi ở chỗ họ bỏ qua độ dài chu kỳ nhiều chữ số. Ví dụ thất bại:

3117
2755
3117
7455

Mặc dù 3 có độ dài chu kỳ là 2 và do đó, thuật toán trên ngắn mạch thành 'L', nhưng thực tế điều này sẽ trả về 'G', bởi vì độ dài chu kỳ 14 trên chữ số thứ hai nhiều hơn vượt qua điều đó. Do đó tôi đã thay đổi chương trình. Nó cũng ngắn hơn, đủ vui. Để kiểm tra chương trình của bạn, sử dụng 3117275531177455. Nó sẽ trở lại G.


Wow tôi nghĩ rằng tôi đã chơi nó một cách công bằng nhưng bạn đã làm một số thứ khá thông minh ở đó.
KSab

@KSab Cảm ơn - thuật toán của bạn rất thông minh để bắt đầu - Tôi không thể tìm thấy cách nào tốt hơn để làm điều đó.
isaacg

2

Con trăn 296

Không thực sự quá kém hiệu quả, nó chỉ kiểm tra bao nhiêu chữ số cần thiết.

n=raw_input();s=int(len(n)**.5);t=0
for i in range(s**2):
    l=[]
    while i not in l:l.append(i);c=n[i];i=(i%s+(-1 if c in'456'else 1 if c in'218'else 0))%s+((i/s+(-1 if c in'432'else 1 if c in'678'else 0))%s)*s
    t=t*9+len(l)-l.index(i)
print'EGL'[cmp(t,long(n,9))]

Đối với các số bằng với sức mạnh của chúng, tôi nghĩ các giải pháp duy nhất là, với mỗi N x N vuông lên tới N = 8 một ô vuông chứa N trong mọi không gian. Tôi nghĩ rằng vì mỗi số trong một vòng lặp phải là cùng một số (độ dài của vòng lặp) nên mỗi vòng lặp sẽ phải theo một hướng. Tất nhiên điều này có nghĩa là kích thước của vòng lặp phải là N (và mỗi phần tử phải là N). Tôi khá chắc chắn rằng logic này có thể được áp dụng cho các hình vuông và vòng có kích thước bất kỳ, có nghĩa là không có hình vuông nào bằng sức mạnh của chúng ngoài 8 hình đầu tiên.


Mặc dù không có khả năng, nhưng có thể các vòng lặp lớn hơn 8.
overactor

2
Tôi nghĩ rằng điều này cho kết quả sai 3117275531177455, vì kích thước vòng lặp lớn hơn 8. Xem bài viết của tôi.
isaacg

1
@isaacg Ồ tôi không thấy điều đó, tôi đã thay đổi nó để làm cho nó hoạt động nhưng tôi sẽ không thử và đánh gôn thêm vì điều đó gần như chỉ là sao chép câu trả lời của bạn. Oh và tôi nghĩ rằng bạn có thể cải thiện hai dòng cuối cùng của bạn bằng cách sử dụng cmp.
KSab


0

Lua - Chưa chơi gôn

Chỉ cần đưa vào đây để giữ an toàn. Tôi sẽ đánh gôn nó (và thực hiện "Đối với lưới lớn hơn, các số này có thể lớn hơn 8, nhưng chúng ta vẫn có thể sử dụng chúng làm" chữ số "") sau này. Hoạt động mặc dù.

d={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}}
d[0]={0,0}ssd=''
n=arg[1]
q=math.sqrt(#n)t={}

    for y=1,q do
    table.insert(t,y,{})
    for x =1,q do
        v=(y-1)*q+x
        table.insert(t[y],x,n:sub(v,v)+0)
        io.write(t[y][x])
    end
end
for y=1,q do
    for x=1,q do
        cx=x cy=y pxy=''sd=0
        while pxy:match(cx..':%d*:'..cy..' ')==nil do
            pxy=pxy..cx..':'..sd..':'..cy.." "
            ccx=cx+d[t[cx][cy]][2]
            ccy=cy+d[t[cx][cy]][1]
            cx=ccx cy=ccy
            if cx<1 then cx=q elseif cx>q then cx=1 end
            if cy<1 then cy=q elseif cy>q then cy=1 end
            sd=sd+1
        end
        dds=(pxy:sub(pxy:find(cx..':%d+:'..cy)):match(':%d*'))
        ssd=ssd..(sd-dds:sub(2))
    end
end
print(ssd)
nn=tonumber(n,9) tn=tonumber(ssd,9)
if tn>nn then print("G") elseif tn==nn then print("E") else print("L") end
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.