Jak silne są liczby nonary?

10

Otrzymujesz nonaralną (podstawową 9) nieujemną liczbę całkowitą składającą się z cyfr od 0 do 8, jak zwykle. Jednak liczba cyfr w tej liczbie (bez zer wiodących) jest kwadratem prefektury.

Z tego powodu liczba może być ułożona w kwadratową siatkę (z zachowaną kolejnością odczytu).

Przykład z 1480 (1125 podstawa 10):

14
80

Teraz niech każda cyfra na takiej niejednorodnej siatce wskazuje ruch do innej przestrzeni siatki (z okresowymi warunkami brzegowymi ):

432
501
678

To tak mówi

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

Tak więc, jeśli na siatce 1480 zaczynasz od 4, następnie przesuwasz się w górę (pamiętaj PBC) i w lewo do 8, co oznacza, że ​​przesuwasz się w prawo i w dół do 4, rozpoczynając cykl z okresem 2.

Ogólnie proces ten jest kontynuowany, aż dojdziesz do zera lub cykl zostanie zauważony. (Za 0 uważa się cykl z okresem 1.)

W przypadku 1480 okres ostatecznie osiągnięty dla każdej z 4 cyfr początkowych wynosi 2 2 2 1odpowiednio.

W przypadku większej siatki liczby te mogą być większe niż 8, ale nadal możemy ich używać jako „cyfr” w nowej liczbie nonary (po prostu współczynniki 9 ^ n, jakby były cyframi):

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

Nazwiemy to siłą oryginalnego numeru nonary. Zatem siła 1480 wynosi 1639 (podstawa 10) lub równoważnie 2221 (podstawa 9).

Wyzwanie

Napisz najkrótszy program, który mówi, czy siła liczby nonary jest większa niż, mniejsza niż lub równa samej liczbie nonary. (Nie musisz obliczać siły).

Dane wejściowe będą nieujemną liczbą nonaralną, która zawiera kwadratową liczbę cyfr (i żadnych zer wiodących poza specjalnym przypadkiem samego 0). Powinien pochodzić z wiersza poleceń lub standardowego wejścia.

Dane wyjściowe powinny przejść do standardowego wyjścia jako:

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)

Zabawne wyzwanie bonusowe:
Jaki jest najwyższy możliwy wkład, który jest równy jego sile? (Czy istnieje limit?)


źródło
Jeśli chodzi o dane wejściowe, czy podaje się je jako liczbę dziesiętną, której cyfry są takie same jak liczba niearialna, czy jako dziesiętna (lub binarna) reprezentacja liczby nonary? tj. dla 1480 (nie), czy wejście będzie wynosić 1480 czy 1125?
overactor
@overactor W formacie nonary.
2
Jestem całkiem pewien, że nikt nie znajdzie wyższego wkładu, który byłby równy jego sile niż 10 ^ 71-1 (nie), czyli 64-cyfrowa liczba, która składa się tylko z 8-ów
overactor
@overactor Myślę, że może to być możliwe przy cyklach powyżej 8.
Martin Ender
@ MartinBüttner będę pod wielkim wrażeniem, jeśli znajdziesz którekolwiek z nich.
overactor

Odpowiedzi:

2

Python 2, 213 209 202

Edycja: Usunięto zwarcie, które czasami jest nieprawidłowe. Patrz poniżej.

(W dużej mierze) Ten sam algorytm co @KSab, ale bardzo mocno golfowy.

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

Golfy:

  • 213: Zwarcie, wadliwe rozwiązanie.

  • 209: Pierwsze działające rozwiązanie.

  • 202: Połączono dwa wyszukiwania łańcuchów w jeden.

Edycja: Właśnie zdałem sobie sprawę, że ten program, a więc także KSab, miał wady, ponieważ ignorowały długości cykli wielocyfrowych. Przykładowa awaria:

3117
2755
3117
7455

Chociaż 3 ma długość cyklu 2, a zatem powyższy algorytm zwiera do „L”, to w rzeczywistości powinno zwrócić „G”, ponieważ długość cyklu 14 na drugiej cyfrze jest większa niż to. Dlatego zmieniłem program. Zabawnie też stało się krótsze. Aby przetestować swój program, użyj 3117275531177455. Powinien powrócić G.

isaacg
źródło
Wow, myślałem, że trochę grałem w golfa, ale zrobiłeś tam całkiem sprytne rzeczy.
KSab
@KSab Dzięki - twój algorytm był bardzo sprytny na początek - nie mogłem znaleźć lepszego sposobu na zrobienie tego.
isaacg
2

Python 296

Nie jest zbyt mało wydajny, sprawdza tylko tyle cyfr, ile potrzebuje.

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

Jeśli chodzi o liczby równe ich sile, myślę, że jedynym rozwiązaniem jest, dla każdego N x N kwadratu do N = 8 kwadrat zawierający N w każdym miejscu. Myślę, że ponieważ każda liczba w pętli musi być taka sama (długość pętli), każda pętla musiałaby być w jednym kierunku. To oczywiście oznacza, że ​​rozmiar pętli musi wynosić N (a każdy element musi mieć N). Jestem prawie pewien, że tę logikę można zastosować do kwadratów i pętli o dowolnym rozmiarze, co oznacza, że ​​nie ma kwadratów równych ich sile oprócz pierwszych 8.

KSab
źródło
Chociaż jest to mało prawdopodobne, może być możliwe dla pętli większych niż 8.
overactor
2
Myślę, że daje to zły wynik 3117275531177455, ponieważ rozmiary pętli są większe niż 8. Zobacz mój post.
isaacg
1
@isaacg Och, nie widziałem tego, zmieniłem to, aby działało, ale nie zamierzam dalej grać w golfa, ponieważ byłoby to po prostu wklejenie twojej odpowiedzi. No i myślę, że możesz poprawić swoje ostatnie dwie linie, używając cmp.
KSab
1

CJam - 81

q:X,:L,{[L2*{_[_Lmqi:Smd@X=432501678s#3md]2/z{~+(S+S%}%Sb}*]L>_&,\X=~-}%9bg"EGL"=

Wypróbuj na http://cjam.aditsu.net/

Prawdopodobnie można go jeszcze zagrać w golfa.

aditsu przestało działać, ponieważ SE jest ZŁEM
źródło
0

Lua - Jeszcze nie grałem w golfa

Po prostu umieszczam się tutaj w celu przechowywania. Gra w golfa (i zaimplementuję „W przypadku większej siatki liczby te mogą być większe niż 8, ale nadal możemy ich używać jako„ cyfr ”) później. Działa jednak.

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
AndoDaan
źródło