Наскільки сильні нонарні цифри?


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 або циклу. (A 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). Він повинен надходити з командного рядка або 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)

Fun Bonus Challenge:
Який найвищий внесок ви можете знайти, що дорівнює його силі? (Чи існує обмеження?)


Що стосується введення, чи воно подається у вигляді десяткового числа, цифри якого збігаються з нонарним номером або як десяткове (або двійкове) подання нонарного числа? тобто: для 1480 (не) вхід буде 1480 або 1125?
суперактор

@overactor У форматі нонар.

2
Я досить впевнений , що ніхто не знайде більший внесок , який прирівнює його міцність , ніж 10 ^ 71-1 (не) тобто 64 - значний номер , який складається тільки з 8 - х
overactor

@overactor Я думаю, це можливо з циклами періоду більше 8.
Мартін Ендер

@ MartinBüttner я буду дуже вражений, якщо ви знайдете будь-яке з них.
суперактор

Відповіді:


2

Пітон 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.


Нічого собі, я думав, що я пограв це вниз по справедливому шматочку, але ви там зробили деякі досить розумні речі.
KSab

@KSab Спасибі - ваш алгоритм був дуже розумним для початку - я не зміг знайти кращого способу зробити це.
isaacg

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


Хоча це малоймовірно, це може бути можливим для циклів, більших за 8
суперактор

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.