Насколько сильны нонарные числа?

10

Вам дается неотрицательное (основание 9) неотрицательное целое число, состоящее из цифр от 0 до 8, как обычно. Однако число цифр в этом числе (без начальных нулей) является квадратом префекта.

Из-за этого число может быть расположено в квадратной сетке (с сохранением порядка чтения).

Пример с 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, что означает, что вы двигаетесь вправо и вниз обратно к 4, начиная цикл с периода 2.

В общем, этот процесс продолжается до тех пор, пока вы не достигнете 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). Это должно прийти из командной строки или стандартного ввода.

Вывод должен идти в стандартный вывод как:

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)

Fun Bonus Challenge:
Какой самый высокий вклад, который вы можете найти, равен его силе? (Есть ли предел?)


источник
Что касается входных данных, это дано как десятичное число, цифры которого совпадают с ненарным числом или как десятичное (или двоичное) представление ненарного числа? то есть: для 1480 (не) вход будет 1480 или 1125?
Гиперактор
@overactor В неардинарном формате.
2
Я вполне уверен, что никто не найдет более высокое значение, равное его силе, чем 10 ^ 71-1 (не), то есть 64-значное число, состоящее только из 8-х
переигрыватель
@overactor Это может быть возможно с циклами периода больше 8, я думаю.
Мартин Эндер
@ MartinBüttner, я буду очень впечатлен, если вы найдете что-то из этого.
overactor

Ответы:

2

Python 2, 213 209 202

Редактировать: Удалено короткое замыкание, которое иногда некорректно. См. ниже.

(Во многом) Тот же алгоритм, что и у @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», на самом деле это должно возвращать «G», потому что длина цикла 14 на второй цифре более чем преодолевает это. Поэтому я изменил программу. Это также стало короче, как ни странно. Чтобы проверить свою программу, используйте 3117275531177455. Это должно вернуться G.

isaacg
источник
Ух ты, я думал, что неплохо сыграл в гольф, но ты сделал несколько довольно умных вещей там.
KSab
@KSab Спасибо - ваш алгоритм был очень умным для начала - я не мог найти лучшего способа сделать это.
Исаак
2

Python 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 = 8 квадрат, содержащий N в каждом пространстве. Я думаю, что, поскольку каждое число в цикле должно быть одинаковым числом (длина цикла), каждый цикл должен быть все в одном направлении. Это, конечно, означает, что размер цикла должен быть N (и каждый элемент должен быть N). Я почти уверен, что эту логику можно применить к квадратам и петлям любого размера, то есть нет квадратов, равных их силе, кроме первых 8.

KSab
источник
Хотя это маловероятно, это может быть возможно для петель больше 8.
перегрузчик
2
Я думаю, что это дает неправильный результат 3117275531177455, потому что размеры цикла больше 8. Смотрите мой пост.
Исаак
1
@isaacg О, я не видел этого, я изменил это, чтобы заставить это работать, но я не собираюсь пытаться играть в гольф дальше, потому что это будет просто копировать ваш ответ. О, и я думаю, что вы можете улучшить свои последние две строки, используя cmp.
KSab
1

CJam - 81

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

Попробуйте это на http://cjam.aditsu.net/

Это может быть, возможно, еще немного.

уйти, потому что SE это зло
источник
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
AndoDaan
источник