ตัวเลข nonary แข็งแกร่งแค่ไหน?


10

คุณจะได้รับจำนวนเต็ม nonary (ฐาน 9) ที่ไม่ใช่ลบประกอบด้วยตัวเลข 0 ถึง 8 ตามปกติ อย่างไรก็ตามจำนวนตัวเลขในจำนวนนี้ (ไม่มีเลขศูนย์นำหน้า) เป็นรูปสี่เหลี่ยมจตุรัส

ด้วยเหตุนี้จึงสามารถจัดเรียงตัวเลขในตารางสี่เหลี่ยม (โดยยังคงคำสั่งการอ่านไว้)

ตัวอย่างกับ 1480 (1125 ฐาน 10):

14
80

ตอนนี้ขอหลักในตาราง nonary ทุกบ่งบอกถึงการเคลื่อนไหวไปยังพื้นที่ตารางอื่น (ที่มีเงื่อนไขขอบเขตระยะ ):

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 แต่เรายังสามารถใช้พวกมันเป็น "หลัก" ในจำนวน nonary ใหม่ (เพียงค่าสัมประสิทธิ์ของ 9 ^ n ราวกับว่าพวกเขาเป็นหลัก):

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

เราจะเรียกสิ่งนี้ว่าความแข็งแกร่งของหมายเลข nonary ดั้งเดิม ดังนั้นจุดแข็งของ 1480 คือ 1639 (ฐาน 10) หรือเทียบเท่า 2221 (ฐาน 9)

ท้าทาย

เขียนโปรแกรมที่สั้นที่สุดที่บอกว่าจุดแข็งของจำนวน nonary นั้นมากกว่าหรือน้อยกว่าหรือเท่ากับจำนวน nonary เอง (คุณไม่จำเป็นต้องคำนวณความแข็งแกร่ง)

ข้อมูลที่ป้อนจะเป็นตัวเลข nonary ที่ไม่ใช่ลบซึ่งมีตัวเลขสองหลัก (และไม่มีศูนย์นำหน้านอกเหนือจากกรณีพิเศษ 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:
อะไรคืออินพุตที่สูงสุดที่คุณสามารถพบได้นั่นเท่ากับความแข็งแกร่งของมัน (มีข้อ จำกัด หรือไม่)


สำหรับอินพุตมันให้เป็นเลขทศนิยมหรือไม่ซึ่งเป็นตัวเลขเดียวกันกับตัวเลข nonary หรือเป็นการแทนทศนิยม (หรือไบนารี) ของตัวเลข nonary? เช่น: สำหรับ 1480 (ไม่ใช่) อินพุตจะเป็น 1480 หรือ 1125
overactor

@overactor ในรูปแบบ nonary

2
ฉันค่อนข้างมั่นใจว่าจะไม่มีใครพบอินพุตที่สูงกว่าซึ่งเท่ากับความแข็งแกร่งของมันมากกว่า 10 ^ 71-1 (ไม่ใช่) นั่นคือตัวเลข 64 หลักที่ประกอบด้วยเพียง 8 ตัวเท่านั้น
ชีวิตมากเกินไป

@overactor ฉันคิดว่าอาจเป็นไปได้ถ้ามีรอบระยะเวลามากกว่า 8 รอบ
Martin Ender

@ MartinBüttnerฉันจะประทับใจถ้าคุณพบสิ่งเหล่านี้
overactor

คำตอบ:


2

Python 2, 213 209 202

แก้ไข: ลบ shortcircuiting ซึ่งบางครั้งไม่ถูกต้อง ดูด้านล่าง

(ส่วนใหญ่) อัลกอริทึมเดียวกับ @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

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 ตัวแรก


แม้ว่าจะไม่น่าเป็นไปได้ แต่อาจเป็นไปได้สำหรับลูปที่มีขนาดใหญ่กว่า 8
overactor

2
ฉันคิดว่านี่จะให้ผลที่ผิด3117275531177455เพราะขนาดวนมากกว่า 8 ดูโพสต์ของฉัน
isaacg

1
@isaacg โอ้ฉันไม่เห็นว่าฉันเปลี่ยนมันเพื่อให้มันใช้งานได้ แต่ฉันจะไม่ลองและเล่นกอล์ฟต่อไปเพราะมันจะเป็นการคัดลอกคำตอบของคุณ cmpโอ้และฉันคิดว่าคุณสามารถปรับปรุงสองบรรทัดสุดท้ายของคุณโดยใช้
KSab


0

Lua - ยังไม่ได้เล่นกอล์ฟ

เพียงแค่ใส่ที่นี่เพื่อความปลอดภัย ฉันจะตีมัน (และใช้ "สำหรับกริดขนาดใหญ่ตัวเลขเหล่านี้อาจใหญ่กว่า 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.