Nonary sayılar ne kadar güçlü?


10

Her zamanki gibi 0 ile 8 arasındaki rakamlardan oluşan bir non (temel 9) negatif olmayan tam sayı verilir. Ancak bu sayıdaki basamak sayısı (baştaki sıfırlar olmadan) bir kaymakam karesidir.

Bu nedenle, sayı kare bir ızgarada düzenlenebilir (okuma sırası hala korunarak).

1480 ile örnek (1125 baz 10):

14
80

Şimdi, böyle bir nonary ızgaradaki her basamağın başka bir ızgara alanına bir hareketi göstermesine izin verin ( periyodik sınır koşullarında ):

432
501
678

Bu diyor ki

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

Yani, 1480 ızgarasında 4'te başlarsanız, yukarı doğru hareket edersiniz (pbc'yi hatırlayın) ve 8'e sola dönersiniz, bu da sağa ve aşağıya doğru 4'e geçerek dönem 2 ile bir döngüye başlarsınız.

Genelde bu işlem 0 oluncaya kadar veya bir döngü fark edilene kadar devam eder. (A 0, dönem 1 ile bir döngü olarak kabul edilir.)

1480 durumunda, nihayet 4 başlangıç ​​basamağının her birinde ulaşılan süre 2 2 2 1sırasıyla.

Daha büyük bir ızgara için bu sayılar 8'den büyük olabilir, ancak yine de yeni bir nonary sayıda "basamak" olarak kullanabiliriz (sadece basamaklarmış gibi 9 ^ n katsayıları):

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

Buna orijinal nonary numaranın gücü diyeceğiz. Dolayısıyla 1480'in mukavemeti 1639 (baz 10) veya eşdeğer olarak 2221'dir (baz 9).

Meydan okuma

Bir sayı olmayan sayının kuvvetinin, sayı olmayan sayının kendisinden daha büyük, daha küçük veya ona eşit olup olmadığını söyleyen en kısa programı yazın. (Gücü hesaplamanız gerekmez.)

Girdi, kare basamaklı bir sayı içeren (ve 0'ın özel durumu dışında baştaki sıfırlar içermeyen) negatif olmayan bir sayı olmayan sayı olacaktır. Komut satırından veya stdin'den gelmelidir.

Çıktı stdout'a şu şekilde gitmelidir:

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)

Eğlenceli Bonus Mücadelesi:
Gücüne eşit bulabileceğiniz en yüksek girdi nedir? (Bir sınır var mı?)


Girdiye gelince, basamakları nonary sayı ile aynı olan ondalık sayı olarak mı yoksa nonary sayının ondalık (veya ikili) temsili olarak mı verilir? yani: 1480 için (olmayan) giriş 1480 veya 1125 olacak mı?
overactor

@overactor Nonary biçiminde.

2
Kimsenin gücüne 10 ^ 71-1 (non) den daha yüksek bir girdi bulamayacağından eminim, yani sadece
8'lerden

@overactor Sanırım, 8'den büyük dönem döngüleri ile mümkün olabilir.
Martin Ender

@ MartinBüttner Bunlardan herhangi birini bulursanız çok etkileneceğim.
overactor

Yanıtlar:


2

Piton 2, 213 209 202

Düzenleme: Bazen yanlış olan kısa devre kaldırıldı. Aşağıya bakınız.

(Büyük ölçüde) @KSab ile aynı algoritma, ancak çok ağır golf.

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

Golf'ün:

  • 213: Kısa devre, hatalı çözüm.

  • 209: İlk çalışma çözümü.

  • 202: İki dizi aramasını bir araya getirin.

Edit: Ben sadece bu programın ve böylece KSab's da, onlar çok haneli döngü uzunlukları göz ardı ki kusurlu olduğunu fark ettim. Örnek hata:

3117
2755
3117
7455

3'ün bir çevrim uzunluğu 2 ve dolayısıyla yukarıdaki algoritmanın 'L' ye kısa devreleri olmasına rağmen, bu aslında 'G' ye dönmelidir, çünkü ikinci basamaktaki 14'ün döngü uzunluğu bunun üstesinden gelir. Bu nedenle programı değiştirdim. Ayrıca kısaldı, yeterince komikti. Programınızı test etmek için tuşunu kullanın 3117275531177455. Geri dönmeli G.


Vay ben adil bir şekilde aşağı golf düşündüm ama orada bazı oldukça akıllı şeyler yaptım.
KSab

@KSab Teşekkürler - algoritmanız başlamak için çok zekiydi - Bunu yapmak için daha iyi bir yol bulamadım.
isaacg

2

Piton 296

Aslında çok verimsiz değil, sadece gerektiği kadar basamağı kontrol eder.

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

Güçlerine eşit sayılara gelince, tek çözüm, her N x N karesi için N = 8'e kadar her alanda N içeren bir kare olduğunu düşünüyorum. Benim düşüncem şu ki, bir döngüdeki her sayı aynı sayı (döngü uzunluğu) olması gerektiğinden, her döngü bir yönde olmalıdır. Bu, elbette, döngünün boyutunun N (ve her elemanın N) olması gerektiği anlamına gelir. Bu mantığın herhangi bir boyuttaki karelere ve döngülere uygulanabileceğinden eminim, yani ilk 8'den farklı güçlerine eşit kareler yoktur.


Muhtemel olmasa da, 8'den büyük döngüler için mümkün olabilir
overactor

2
Sanırım bu 31172755311774558'den büyük döngü boyutları nedeniyle yanlış sonuç veriyor .
isaacg

1
@isaacg Oh, görmedim, işe yaraması için değiştirdim ama bunu daha fazla denemeye ve golf oynamayacağım çünkü bu sadece cevabınızı kopyalayıp yapıştıracaktır. Oh ve bence son iki satırını kullanarak geliştirebilirsin cmp.
KSab


0

Lua - Henüz golf oynamadı

Sadece saklamak için buraya koyuyorum. Golf yapacağım (ve "Daha büyük bir ızgara için bu sayılar 8'den büyük olabilir, ancak yine de" basamak "olarak kullanabiliriz). Gerçi çalışır.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.