単項数はどのくらい強いですか?


10

通常どおり、0から8までの数字で構成される9進数の非負整数が与えられます。ただし、この数値の桁数(先行ゼロなし)は完全な正方形です。

このため、数字は正方形のグリッドに配置できます(読み取り順序は保持されます)。

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)

これを元の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)

楽しいボーナスチャレンジ:
その強さと等しい、あなたが見つけることができる最高のインプットは何ですか?(制限はありますか?)


入力に関しては、それは10進数として与えられますか?その数字が9進数と同じであるか、または9進数の10進数(または2進数)表現と同じですか?つまり、1480(非)の場合、入力は1480または1125になりますか?
オーバーアクター2014

@overactor非単項形式。

2
私はだれも、10 ^ 71-1(非)、つまり8のみで構成される64桁の数値よりもその強度に等しい高い入力を誰も見つけられないことに確信しています
過作家

@overactor 8以上の周期のサイクルで可能性があるかもしれません。
マーティンエンダー2014

@MartinBüttnerあなたがそれらのいずれかを見つけた場合、私は完全に感銘を受けるでしょう。
オーバーアクター2014

回答:


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:2つの文字列検索を1つに結合しました。

編集:このプログラム、つまりKSabも、複数桁のサイクル長を無視するという点で欠陥があることに気づきました。失敗の例:

3117
2755
3117
7455

3のサイクル長は2であり、したがって上記のアルゴリズムは「L」に短絡しますが、実際には2番目の桁の14のサイクル長がそれを超えるため、これは「G」を返すはずです。そのため、プログラムを変更しました。それはまた短く、おかしなことに十分になりました。プログラムをテストするには、を使用します3117275531177455。戻るはずGです。


うわー、かなりゴルフをしたと思いましたが、あなたはかなり賢いことをしました。
KSab 2014

@KSabありがとう-あなたのアルゴリズムは最初は非常に巧妙でした-私はそれを行うためのより良い方法を見つけることができませんでした。
isaacg 2014

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より大きいループは可能かもしれない
overactor

2
3117275531177455ループサイズが8より大きいため、これはで間違った結果をもたらすと思います。私の投稿を参照してください。
isaacg 2014

1
@isaacgああ、私はそれが機能しないように変更しましたが、それを試してさらにゴルフをするつもりはありません。ああ、私はあなたがあなたの最後の2行を使うことで改善できると思いますcmp
KSab 2014


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.