5、2、16、3580、次は何ですか?


51

10進数で5の正の整数のべき乗を考慮します。以下は、右揃えの最初の25です。

 X                5^X
 1                  5
 2                 25
 3                125
 4                625
 5               3125
 6              15625
 7              78125
 8             390625
 9            1953125
10            9765625
11           48828125
12          244140625
13         1220703125
14         6103515625
15        30517578125
16       152587890625
17       762939453125
18      3814697265625
19     19073486328125
20     95367431640625
21    476837158203125
22   2384185791015625
23  11920928955078125
24  59604644775390625
25 298023223876953125

べき乗の右端の列はすべてであることに注意してください5。右から2番目の列はすべて2です。上から下へ読み取る右から3列目、交互に1616、などの次の列の開始3580、その後サイクル。

実際、すべての列(十分に下がった場合)には、最初5のを除いて、長さが前のサイクルの2倍の数字の循環シーケンスがあります。2

右側のN = 1から始まるNを列番号と呼ぶと、最初の数サイクルは次のとおりです。

N cycle at column N
1 5
2 2
3 16
4 3580
5 17956240
6 3978175584236200
7 19840377976181556439582242163600
8 4420183983595778219796176036355599756384380402237642416215818000

チャレンジ

正の整数Nを指定すると、上記のように、列Nでサイクルの10進数を出力します。たとえば、N = 4の出力は次のようになります3580

数字は、次の場合に限り、[3, 5, 8, 0]または別の妥当な形式でリストとして出力できます。

  • 数字は、パワー列の上部から下部に向かって順番に並んでいます。たとえば0853、無効です。
  • サイクルは、パワー列の一番上の数字から始まります。たとえば5803、4番目の列は3notで始まるため無効5です。
  • 正確に1サイクルが出力されます。たとえば35835803または35803580すべてが無効になります。

コードは少なくともN = 1から30の間機能する必要があります。

必要に応じて、列のインデックスが1ではなく0であると想定できます。したがって、N = 0が与えられ5、N = 1が与えられ2、N = 2が与えられ16、N = 3が与えられます3580

バイト単位の最短コードが優先されます

チャレンジサポートをしてくれたDowngoatDJに感謝します。


順序により、これは非常に複雑になります。
デニス

9
サイクル長は常にある2^(N-2)以外N = 1
JungHwan分

1
近似値を使用できますか?出力は、理論的に2.36E + 21桁を印刷するN = 72まで有効です
ジョンファンミン

このシーケンスはOEISにありますか?
StarWeaver

@StarWeaverいいえ。
メゴ

回答:


26

Python 2、 62 61 58バイト

ゼロベース。Lのサフィックスが受け入れられると思います。

lambda n:[5**(n*3/7-~i)/2**n%10for i in range(2**n/2or 1)]

出力:

0 [5]
1 [2]
2 [1, 6]
3 [3, 5, 8, 0]
4 [1, 7, 9, 5, 6, 2, 4, 0]
5 [3, 9, 7, 8, 1, 7, 5, 5, 8, 4, 2, 3, 6, 2, 0, 0]
6 [1, 9, 8, 4, 0, 3, 7, 7, 9, 7, 6, 1, 8, 1, 5, 5, 6, 4, 3, 9, 5, 8, 2, 2, 4, 2L, 1L, 6L, 3
L, 6L, 0L, 0L]
7 [4, 4, 2, 0, 1, 8, 3, 9, 8, 3, 5, 9, 5, 7, 7, 8, 2, 1, 9, 7, 9, 6, 1, 7, 6L, 0L, 3L, 6L,
3L, 5L, 5L, 5L, 9L, 9L, 7L, 5L, 6L, 3L, 8L, 4L, 3L, 8L, 0L, 4L, 0L, 2L, 2L, 3L, 7L, 6L, 4L,
 2L, 4L, 1L, 6L, 2L, 1L, 5L, 8L, 1L, 8L, 0L, 0L, 0L]

以前のソリューション:

lambda n:[5**int(n/.7-~i)/10**n%10for i in range(2**n/2or 1)]
lambda n:[str(5**int(n/.7-~i))[~n]for i in range(2**n/2)]or 5

説明:

def f(n):
    r = max(2**n / 2, 1)
    m = int(n/0.7 + 1)
    for i in range(r):
        yield (5**(m+i) / 10**n) % 10

range(2**n/2)観察使用し、各サイクルは長さr = 2持つN-1を、我々はわずか5のためのn番目の数字を計算するように、n = 0の場合を除いてM 5まで1 - M + Rを

サイクル5 mの開始は、10 nより大きい最初の数です。5解くメートル ≥10 nは Mを与える≥N /ログを10 5.ここでおおよそのログ10のn = 72我々は、精度を高めるために複数の数字を追加することができたときにブレークダウンします5≈0.7:

| approximation             | valid until        | penalty   |
|---------------------------|--------------------|-----------|
| .7                        | n = 72             | +0 bytes  |
| .699                      | n = 137            | +2 bytes  |
| .69897                    | n = 9297           | +4 bytes  |
| .698970004                | n = 29384          | +8 bytes  |
| .6989700043               | n = 128326         | +9 bytes  |
| .6989700043360189         | too large to check | +15 bytes |
| import math;math.log10(5) | same as above      | +23 bytes |

/ 10**n % 10ループでは、単に、所望の数字を抽出します。別の代替ソリューションでは、文字列操作を使用します。ここでトリック~n == -n-1を使用して1バイトを削除しました。

コメントで述べたように、式5**(m+i) / 10**nはこの方法でさらに簡略化でき、現在の58バイトの答えが得られます。

ここに画像の説明を入力してください

(除算x/2**nはビット単位の右シフトを使用して行うことができますx>>n。残念なことに、Pythonの演算子の優先順位により、これはバイトを節約しません。)同様のマナーで小数3/7も改善できます。

| approximation                   | valid until         | penalty   |
|---------------------------------|---------------------|-----------|
| n*3/7                           | n = 72              | +0 bytes  |
| n*31/72                         | n = 137             | +2 bytes  |
| n*59/137                        | n = 476             | +3 bytes  |
| n*351/815                       | n = 1154            | +4 bytes  |
| n*643/1493                      | n = 10790           | +5 bytes  |
| n*8651/20087                    | n = 49471           | +7 bytes  |
| int(n*.43067655807339306)       | too large to check  | +20 bytes |
| import math;int(n/math.log2(5)) | same as above       | +26 bytes |

1
(5**(n*3/7-~i)>>n)%10。5のべき乗を(小さい)10のべき乗で割っているので、5のべき乗を減らし、代わりに右にシフトできます。n/.7 - nn*10/7 - nn*3/7。原則として、2ⁿより大きい5の最小累乗から数字を抽出しています(3/71 /log₂(5)の近似値です)。また、range(2**n/2or 1)代わりに使用すると、一貫した出力が得られます。
プリモ

1
@primoありがとう、更新しました。(x>>n)%10改善x/2**n%10はありませんので、今のところはビットシフトを使用しません2**n
ケニー

興味深いアイデアの要素を除外することは2**n、少し長く思えます:(int(5**(-~i-n*log(2,5)%1))%10私はとして簡略化しint(n*log(2,5))-n*log(2,5)ました-(n*log(2,5)%1))。
primo

@primo面白いですが、私が言いたいのは、2**nhere引数とrange引数です。
ケニー

10

dc、72バイト

[3Q]sq2?dsa^1+2/dsusk[Ola^/O%plk1-dsk1>q]sp1[d5r^dOla^<psz1+d4/lu>t]dstx

0ベースのインデックス付け。

これは、正確な整数演算を使用します-対数近似は使用しません。コンピューターのメモリ容量まで動作します。

dcプログラムをオンラインでお試しください!


DCコードはBashソリューションに変換できます。

Bash + GNUユーティリティ、96 77 75バイト

u=$[(2**$1+1)/2]
dc -e "[O$1^/O%p]sp1[d5r^dO$1^<psz1+d4/$u>t]dstx"|head -$u

Bashバージョンをオンラインでお試しください!


9

Mathematica、66 60 52バイト

Floor@Mod[5^Floor[Range@Max[2^#/2,1]+#/.7]/10^#,10]&

匿名関数、0インデックス付き。log5(10)(≈0.7)の近似値を使用します

使い方?

Range@Max[2^#/2,1]

2 ^(input)/ 2と1のうち大きい方を取ります。{1..that number}を生成します

...+#/.7

入力を追加/.7

5^Floor[...]/10^#

5を結果の累乗(5の累乗を生成)し、10 ^ inputで除算します(目的の列の右側の数字を取り除きます)

Mod[ ...,10]

10を法として1の桁(目的の列)を取得します。

正確なバージョン、58バイト

Floor@Mod[5^Floor[Range@Max[2^#/2,1]+#/5~Log~10]/10^#,10]&

5

JavaScript(ES7)、78 76バイト

f=(N,z=5,s,X=2**N,q=z/10**N|0)=>s|q?X>0?q+f(N,z*5%10**-~N,1,X-2):"":f(N,z*5)

0インデックス、つまりf(0)を返します2

テストスニペット

スニペットはMath.pow**ブラウザ間の互換性の代わりに使用します。


4

CJam、35

5ri(:N.7/i)#2N(#mo{_AN#/o5*AN)#%}*;

オンラインで試す

これはスペース効率が良く、極端に遅くはなく、私のコンピューターでの入力30に数分かかりました(Javaインタープリターを使用)。


3

ゼリー26 21 バイト

-kennytmの0.7近似アイデアを使用した2バイト

2*HĊR+÷.7$Ḟ*@5:⁵*⁸¤%⁵

オンラインでお試しください! n> 15でタイムアウト)

整数のリスト、数字を返します。
ゼロベース。理論的には、n <= 72で機能します(浮動小数点の精度を得るに.75l⁵¤、に置き換えてください)。

どうやって?

2*HĊR+÷.7$Ḟ*@5:⁵*⁸¤%⁵ - Main link: n
2*                    - 2 raised to the power of n
  H                   - halved: 2 raised to the power of n-1
   Ċ                  - ceiling: adjust 2**-1 = 0.5 up to 1 for the n=0 edge case
    R                 - range: [1,2,...,ceiling(2**(n-1))] - has length of the period
         $            - last two links as a monad:
      ÷.7             -     divide by 0.7 (approximation of log(5, 10), valid up to n=72)
     +                - add (vectorises)
          Ḟ           - floor (vectorises)
             5        - 5
           *@         - exponentiate (vectorises) with reversed @arguments
                  ¤   - nilad followed by link(s) as a nilad
               ⁵      -     10
                 ⁸    -     left argument, n
                *     -     exponentiate: 10 raised to the power of n
              :       - integer division: strips off last n digits
                   %⁵ - mod 10: extracts the last digit

ローカル:n = 17のワーキングセットメモリは約750MBまで上昇し、その後約1GBまで急上昇しました。以下のためのn = 18、それはゆっくりと到達した2.5ギガバイトを、その後の周りにスパイク5GB


3

Perl 6、52バイト

->\n{(map {.comb[*-n]//|()},(5 X**1..*))[^(2**n/4)]}

十分なメモリが与えられた場合(対数近似なし)、任意の高入力に対して機能します。
数字のリストを返します。

オンラインでお試しください!

使い方

->\n{                                              }  # A lambda with argument n.
                            (5 X**1..*)               # The sequence 5, 25, 125, 625...
      map {               },                          # Transform each element as such:
           .comb[*-n]                                 #   Extract the n'th last digit,
                     //|()                            #   or skip it if that doesn't exist.
     (                                 )[^(2**n/4)]   # Return the first 2^(n-2) elements.

「要素のスキップ」部分は次のように機能します。

  • 不正なインデックスでリストのインデックスを作成すると、「未定義」の値としてカウントされるFailureが返されます。
  • // 「定義されたOR」演算子です。
  • |()空のSlipを返します。これは、0個の要素として外部リストにディゾルブし、本質的に現在の要素がスキップされることを確認します。

エッジケースn=1ので、罰金をうまくいく2**n/4となり0.5、且つ^(0.5)手段0 ..^ 0.5すなわち単一の要素が0のリスト「0の整数(両端を含む)及び0.5(包括的ではない)」、別名。


2

J、50バイト

(2^0>.2-~]){.' '-.~-{"1[:([:":[:|:[:,:5^[:>:i.)2^]

注:拡張番号を渡す必要があります

使用法:

   q =: (2^0>.2-~]){.' '-.~-{"1[:([:":[:|:[:,:5^[:>:i.)2^]
   q 1x
5
   q 2x
2
   q 4x
3580

2
どうして下票?
ljeabmreosn

2

Haskell、73バイト

f 0="5"
f n=take(2^(n-1))[reverse x!!n|x<-show<$>iterate(*5)1,length x>n]

オンラインでお試しください!0インデックスを使用します。

説明:

f 0="5"              -- if the input is 0, return "5"
f n=                 -- otherwise for input n
  take(2^(n-1))      -- return the first 2^(n-1) elements of the list
    [reverse x!!n    -- of the nth column of x
      |x<-show<$>    --    where x is the string representation
        iterate(*5)1 --    of the elements of the infinite list [5,25,125,...]
      ,length x>n    -- if x has at least n+1 columns
    ]                -- this yields a list of characters, which is equivalent to a string

1

バッチ、294バイト

@echo off
if %1==1 echo 5
set/a"l=1<<%1-2,x=0,s=1
set t=
for /l %%i in (2,1,%1)do call set t=%%t%%x
:l
if %l%==0 exit/b
set t=%s%%t%
set s=
set c=
:d
set/ac+=%t:~,1%*5,r=c%%10,c/=10
set s=%s%%r%
set t=%t:~1%
if "%t%"=="" echo %r%&set/al-=1&goto l
if %c%%t:~,1%==0x goto l
goto d

各桁を独自の行に出力します。5の長さのべき乗を計算することで機能しますが、N=3332ビット整数を使用して印刷する桁数のカウントを保持することによってのみ機能します。sは、N現在の5のべき乗の(逆の)最後の桁をt含み、xsはパディングとして使用x=0されますが、次のべき乗の計算時にゼロとして評価されます。例N=4

s   t
1   xxx (initial values before the first power of 5 is calculated)
5   xxx
52  xx
521 x
526 x
5213    (print 3)
5265    (print 5)
5218    (print 8)
5260    (print 0)

1

JavaScript(ES6)、73バイト

1インデックス付き。ES7の回答よりわずかに短いですが、3ステップ前に失敗します(N = 13)。

n=>(g=x=>k>>n?'':(s=''+x*5%1e15)[n-1]?s.substr(-n,1)+g(s,k+=4):g(s))(k=1)

デモ


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