비 숫자는 얼마나 강력합니까?


10

평소와 같이 0에서 8까지의 숫자로 구성된 음이 아닌 정수 (기본 9)가 제공됩니다. 그러나이 숫자의 자릿수 (앞에 0이 없음)는 지사 제곱입니다.

이 때문에 숫자를 정사각형 격자로 배열 할 수 있습니다 (읽기 순서는 그대로 유지됨).

1480 (1125 기본 10)의 예 :

14
80

이제 이러한 보조 그리드의 모든 숫자가 다른 그리드 공간으로의 움직임을 나타냅니다 ( 주기적인 경계 조건 포함 ).

432
501
678

이 말은

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

따라서 1480 그리드에서 4에서 시작하면 pbc를 기억하고 왼쪽으로 8로 이동합니다. 즉, 2로주기를 시작하여 오른쪽으로, 다시 4로 이동합니다.

일반적으로이 프로세스는 0에 도달하거나주기가 나타날 때까지 계속됩니다. (0은주기 1의 주기로 간주됩니다.)

1480의 경우, 4 개의 시작 숫자 각각에 도달 한주기는 2 2 2 1각각입니다.

더 큰 그리드의 경우이 숫자는 8보다 클 수 있지만 새 비 이진수에서 "숫자"로 사용할 수 있습니다 (숫자 인 것처럼 9 ^ n의 계수).

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

우리는 이것을 원래의 비수 의 강점 이라고 부릅니다 . 따라서 1480의 강도는 1639 (기본 10) 또는 2221 (기본 9)입니다.

도전

이진수의 강도가 이진수보다 크거나 작거나 같은지 알려주는 가장 짧은 프로그램을 작성하십시오. 반드시 강도를 계산할 필요는 없습니다.

입력은 제곱 수의 자릿수가 포함 된 음이 아닌 비음 수입니다 (특수한 경우 0 이외의 선행 0은 없음). 명령 행 또는 stdin에서 가져와야합니다.

출력은 다음과 같이 stdout으로 이동해야합니다.

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)

재미있는 보너스 챌린지 :
당신이 찾을 수있는 가장 높은 입력은 그것의 힘과 동일합니까? (제한이 있습니까?)


입력과 관련하여 10 진수로 표시되며 그 숫자는 1 진수와 동일하거나 10 진수 (또는 2 진수)로 표시됩니까? 즉 : 1480 (non)의 경우 입력은 1480 또는 1125입니까?
오버 액터

@overactor nonary 형식입니다.

2
나는 아무도 10 ^ 71-1 (비)에 비해 강도와 동일한 높은 입력 만 8 개의 구성 64 자리 숫자를 찾을 수 없다는 것을 꽤 확신
overactor

@overactor 8보다 큰 주기로 가능할 수 있다고 생각합니다.
Martin Ender

@ MartinBüttner 나는 당신이 그 중 하나를 찾으면 완전히 감동 할 것입니다.
overactor

답변:


2

파이썬 2 213 209 202

편집 : 단락이 제거되어 때로는 올바르지 않습니다. 아래를 참조하십시오.

(Largely) @KSab과 같은 알고리즘이지만 매우 심하게 골프를칩니다.

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

골프 :

  • 213 : 단락, 결함이있는 솔루션.

  • 209 : 첫 번째 작업 솔루션.

  • 202 : 두 문자열 조회를 하나로 결합했습니다.

편집 : 나는이 프로그램과 KSab도 여러 자릿수 사이클 길이를 무시한다는 결점을 깨달았습니다. 실패 예 :

3117
2755
3117
7455

3의 사이클 길이는 2이므로 위의 알고리즘은 'L'로 단락되지만 실제로 두 번째 자리에서 14의 사이클 길이가이를 극복하기 때문에 'G'를 반환해야합니다. 따라서 프로그램을 변경했습니다. 또한 짧아지고 재미있었습니다. 프로그램을 테스트하려면을 사용하십시오 3117275531177455. 반환해야합니다 G.


와우 나는 그것을 약간의 골프를 쳤다고 생각했지만 거기에서 꽤 영리한 것들을했습니다.
KSab

@KSab 감사합니다-귀하의 알고리즘은 처음부터 매우 영리했습니다. 더 좋은 방법을 찾을 수 없었습니다.
isaacg 5

2

파이썬 296

실제로 너무 비효율적이지는 않지만 필요한만큼의 숫자 만 확인합니다.

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

그들의 강도와 같은 숫자에 관해서는, 유일한 해결책은 모든 N x N 정사각형에 대해 모든 공간에 N을 포함하는 정사각형 N = 8까지라고 생각합니다. 내 생각은 루프의 모든 숫자가 같은 숫자 (루프의 길이) 여야하기 때문에 각 루프는 모두 한 방향이어야한다고 생각합니다. 이것은 물론 루프의 크기는 N이어야하고 각 요소는 N이어야 함을 의미합니다. 이 논리를 모든 크기의 정사각형과 루프에 적용 할 수 있다고 확신합니다. 첫 번째 8 이외의 강도와 같은 정사각형이 없다는 것을 의미합니다.


가능하지는 않지만 8보다 큰 루프가 가능할 수 있습니다.
overactor

2
3117275531177455루프 크기가 ​​8보다 커서 잘못된 결과가 있다고 생각합니다 . 내 게시물을 참조하십시오.
isaacg

1
@isaacg 오, 나는 그것을 보지 못했지만 작동하도록 변경했지만 더 이상 골프를 치지 않을 것입니다. 오, 나는 당신이을 사용하여 마지막 두 줄을 향상시킬 수 있다고 생각합니다 cmp.
KSab


0

루아-아직 골프

안전을 위해 여기에 넣으십시오. 나중에 골프를칩니다 ( "더 큰 격자의 경우이 숫자는 8보다 클 수 있지만 여전히"숫자 "로 사용할 수 있습니다"). 그래도 작동합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.