二乗数


13

NがN ^ 2の部分文字列として現れる自然数のシーケンスを考えます。A018834

nこのシーケンスのth要素を出力します。

ルール

プログラムはn入力としてのみ使用し、1つの数値のみを出力しますN

シーケンスには、0インデックスまたは1インデックスを付けることができます。

Sequence: 1 5 6 10 25 50 60 76 100 250 376 500 600 625 760 ...
Squares:  1 25 36 100 625 2500 3600 5776 10000 62500 141376 250000 360000 390625 577600 ...

これはコードゴルフなので、最短のコードが優先されます。


1
多くの実装で問題が発生し(私にとっては2 ^ 32を超える値を持つ配列を作成できないため)、ほとんどのソリューションはデフォルトで最大サイズにバインドされます。これらのソリューションは失格にすべきですか?
maxb

1
@maxb 理論的には必ずしも実用的でないことを意味すると思います。
アーナウルド

1
@Ourous私はそれが本当に低いことを知っています、それが私が私のソリューションが好きではない理由です。バイトを追加して、より大きな入力で動作させることができるので、代わりにそれを追加します
maxb

1
「NはN ^ 2に表示されます」は「Nの10進数はNの10進数の[連続した]部分文字列です」(11は「表示されない」121)のように表現できます。[厳密に「連続」は冗長ですが、追加することは明らかです。]
ジョナサンアラン

1
@JonathanAllan代替はrewording提案: "NはN ^ 2で辞書的に存在している"
Οurous

回答:


4

05AB1E、6バイト

1インデックス付き

µNNnNå

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

説明

µ         # loop over increasing N until counter equals input
 N        # push N (for the output)
  Nn      # push N^2
    N     # push N
     å    # push N in N^2
          # if true, increase counter

そのµコマンドはただ...私はそれがあればいいのに。
maxb

@maxb:Nth特定の条件を満たす番号を見つける必要があるチャレンジには、非常に実用的です。
エミグナ

trueの場合、カウンターを増やします」?
ジョナサンアラン

@JonathanAllan:「N ^ 2にNが含まれている場合、カウンターの値を1増やします」と同様。おそらく「インクリメントカウンター」と書かれているはずです。
エミグナ

私は実際に説明を理解していませんでした。åtrueが得られた場合N、スタックの一番上に現在の値Nがあるように見えます(増分カウンターと増分)が、そうでない場合は続行しています(増分N)。たぶん「以外のものを使用するNことが問題ボディに、最終的な結果であることから、」:P
ジョナサン・アラン


3

JavaScript(ES6)、43バイト

f=(n,k=0)=>n?f(n-!!(++k*k+'').match(k),k):k

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


非再帰バージョン、47バイト

n=>eval("for(k=0;n-=!!(++k*k+'').match(k););k")

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


これはあきらめn=23ますか?
ヴェダントカンドー

@VedantKandoi JSエンジンの呼び出しスタックのサイズに依存します。しかし、コンピューティングnはが必要ですN そうだと、再帰を7600回のための再帰呼び出しのn = 23a(n)a(n)7600n=23
アーナウルド

3

MathGolf、8バイト(理論上の任意の入力に対して機能しますがn<10、実際には機能します)

úrgɲï╧§

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

代替案(n<49実践および理論で機能します)

►rgɲï╧§

唯一の違いは、リストを作成する代わりに 10^(input)値、10^6アイテムです。これには実行に時間がかかるため、最初のバイトを他の1バイトリテラルに交換してテストすることができます。

説明

ú          pop(a), push(10**a)
 r         range(0, n)
  g        filter array by...
   É       start block of length 3
    ²      pop a : push(a*a)
     ï     index of current loop
      ╧    pop a, b, a.contains(b)
           Block ends here
       §   get from array

このソリューションが大きな入力を処理しない理由は、シーケンスが指数関数的ではなく、多項式よりも大きくなることに気づいたからです。そのため、10**n演算子を使用しました(使用したかったのです2**nが、入力1で失敗しました)。これは、小さな入力でも非常に大きな配列を作成し、その大部分を除外して、最初の要素の1つを取得することを意味します。それは非常に無駄ですが、バイト数を増やすことなく他の方法を見つけることはできませんでした。




2

ゼリー、6 バイト

1ẇ²$#Ṫ

1インデックス付き。

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

どうやって?

nシーケンスの最初をリストとして見つけてから、テールを生成しますN

1ẇ²$#Ṫ - Link: integer, n (>0)
1      - initialise x to 1
    #  - collect the first n matches, incrementing x, where:
   $   -   last two links as a monad:
  ²    -     square x
 ẇ     -     is (x) a substring of (x²)?
       -     (implicitly gets digits for both left & right arguments when integers)
     Ṫ - tail

0自然数とみなされた場合ẇ²$#Ṫ、5に対して1インデックス付きのフルプログラムを使用できます。




2

Java 8、66 65 63バイト

n->{int r=0;for(;!(++r*r+"").contains(r+"")||--n>0;);return r;}

@Shaggyのおかげで-1バイト。@Arnauldの
おかげで-2バイト。

1インデックス付き。

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

説明:

n->{                // Method with integer as both parameter and return-type
  int r=0;          //  Result-integer, starting at 0
  for(;             //  Loop as long as:
       !(++r*r+"")  //    (increase result `r` by 1 first with `++r`)
                    //    If the square of the result `r` (as String) 
        .contains(  //    does not contain
          r+"")||   //    the result `r` itself (as String):
       --n>0;);     //     (decrease input `n` by 1 first with `--n`)
                    //     And continue looping if input `n` is not 0 yet
  return r;}        //  Return the result `r`


1
@Shaggy Ah、もちろん。ありがとう!
ケビンクルーッセン

1
@Arnauld Ah、ループとifを組み合わせるスマートな方法!ありがとう。
ケビンクルーッセン

2

Clojure、81バイト

(fn[n](nth(filter #(clojure.string/includes?(str(* % %))(str %))(range))n))

オンラインでお試しください!(残念ながら、TIOはClojureの標準文字列ライブラリをサポートしていないようです)

Clojureのインポート構文が短い場合、またはincludes?コアライブラリにメソッドがある場合、実際には多少競合する可能性があります。clojure.string/includes?しかし、ここではいくつかの答えよりも長いです:/

(defn nth-sq-subs [n]
  (-> ; Filter from an infinite range of numbers the ones where the square of
      ;  the number contains the number itself
    (filter #(clojure.string/includes? (str (* % %)) (str %))
            (range))

    ; Then grab the "nth" result. Inc(rementing) n so 0 is skipped, since apparently
    ;  that isn't in the sequence
    (nth (inc n))))

TIOリンクが壊れているため、ここでテストを実行します。左側の数字はインデックス(n)で、結果(N)は右側にあります。

(mapv #(vector % (nth-sq-subs %)) (range 100))
=>
[[0 1]
 [1 5]
 [2 6]
 [3 10]
 [4 25]
 [5 50]
 [6 60]
 [7 76]
 [8 100]
 [9 250]
 [10 376]
 [11 500]
 [12 600]
 [13 625]
 [14 760]
 [15 1000]
 [16 2500]
 [17 3760]
 [18 3792]
 [19 5000]
 [20 6000]
 [21 6250]
 [22 7600]
 [23 9376]
 [24 10000]
 [25 14651]
 [26 25000]
 [27 37600]
 [28 50000]
 [29 60000]
 [30 62500]
 [31 76000]
 [32 90625]
 [33 93760]
 [34 100000]
 [35 109376]
 [36 250000]
 [37 376000]
 [38 495475]
 [39 500000]
 [40 505025]
 [41 600000]
 [42 625000]
 [43 760000]
 [44 890625]
 [45 906250]
 [46 937600]
 [47 971582]
 [48 1000000]
 [49 1093760]
 [50 1713526]
 [51 2500000]
 [52 2890625]
 [53 3760000]
 [54 4115964]
 [55 5000000]
 [56 5050250]
 [57 5133355]
 [58 6000000]
 [59 6250000]
 [60 6933808]
 [61 7109376]
 [62 7600000]
 [63 8906250]
 [64 9062500]
 [65 9376000]
 [66 10000000]
 [67 10050125]
 [68 10937600]
 [69 12890625]
 [70 25000000]
 [71 28906250]
 [72 37600000]
 [73 48588526]
 [74 50000000]
 [75 50050025]
 [76 60000000]
 [77 62500000]
 [78 66952741]
 [79 71093760]
 [80 76000000]
 [81 87109376]
 [82 88027284]
 [83 88819024]
 [84 89062500]
 [85 90625000]
 [86 93760000]
 [87 100000000]
 [88 105124922]
 [89 109376000]
 [90 128906250]
 [91 146509717]
 [92 177656344]
 [93 200500625]
 [94 212890625]
 [95 250000000]
 [96 250050005]
 [97 289062500]
 [98 370156212]
 [99 376000000]]

これは、の任意の値をサポートできるはずnです。終了するのを待っていれば(シーケンスの50番目から100番目の整数を見つけるのに15分ほどかかります)。Clojureは任意の大きな整数演算をサポートしているため、数値が大きくなり始めると、BigIntsの使用を開始します。


1

、25バイト

Nθ≔¹ηWθ«≦⊕η¿№I×ηηIη≦⊖θ»Iη

オンラインでお試しください!リンクは、コードの詳細バージョンです。0インデックス付き。説明:

Nθ

入力n

≔¹η

N1から開始します(または、これによりカウントが開始され0、入力のインデックスが1になります)。

Wθ«

nシーケンス内の数字が見つかるまで繰り返します。

≦⊕η

インクリメントN

¿№I×ηηIη

N*N含むN場合、...

≦⊖θ»

...減少しますn

Iη

印刷N

これをさらにゴルフしようとする試みは、チャコールa)if..thenブロックの最後に例外がありません(2バイトの費用がかかります)b)Containsオペレータがいない(出力をブール値に変換するFindCountn再度コストから差し引くことができます) 2バイト)。


1

編集(コメントへの応答):Python 2、76バイト

非再帰的な方法を試してみたかった。(ゴルフは初めてですが、どんなヒントでも素晴らしいでしょう!)

def f(c,n=0):
    while 1:
        if`n`in`n*n`:
            if c<2:return n
            c-=1
        n+=1

BMOとVedant Kandoiに感謝します!


2
print(f(13))コードを数える必要はありません。またwhile 1:if c==1:return nc==1 can be c<2
Vedant Kandoi

ああ、私はとにかく.. NVM、あなたは非再帰バージョンを望んでいたことがわかりませんでした、私は現在、76を数える79バイトではありません
ბიმო

さらに、さらにいくつか保存できます。前後のスペース`は冗長でc<2:、次にスペースもインデント用にタブとスペースを混在させることができます(ここに示すよう。69バイト Btw。古いバージョンを保持する必要はありません(興味のある人の編集履歴にあります)。なぜTIO(または同様の)にリンクするか、そこからテンプレートを使用しませんか?
ბიმო

1

Haskell、60バイト

([n^2|n<-[1..],elem(show n)$words=<<mapM(:" ")(show$n^2)]!!)

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

      n<-[1..]              -- loop n through all numbers starting with 1
 [n^2|        ,    ]        -- collect the n^2 in a list where
     elem(show n)           -- the string representation of 'n' is in the list
       words ... (show$n^2) -- which is constructed as follows:

            show$n^2        -- turn n^2 into a string, i.e. a list of characters
          (:" ")            -- a point free functions that appends a space
                            -- to a character, e.g.  (:" ") '1' -> "1 "
        mapM                -- replace each char 'c' in the string (n^2) with
                            -- each char from (:" ") c and make a list of all
                            -- combinations thereof.
                            -- e.g. mapM (:" ") "123" -> ["123","12 ","1 3","1  "," 23"," 2 ","  3","   "]
      words=<<              -- split each element into words and flatten to a single list
                            -- example above -> ["123","12","1","3","1","23","2","3"]

(                      !!)  -- pick the element at the given index

1

パイソン247の 43バイト

Dennisのおかげで-4バイト(を返す代わりに再帰呼び出しに1を追加n-1

f=lambda c,n=1:c and-~f(c-(`n`in`n*n`),n+1)

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

外植/ゴルフなし

2つの引数を取る再帰関数 cn; n カウントアップされます 123 そしていつも n に n2 それは減少します c。再帰はすぐに終了しますc=0

# Enumerating elements of A018834 in reverse starting with 1
def f(counter, number=1):
    # Stop counting
    if counter == 0:
        return 0
    # Number is in A018834 -> count 1, decrement counter & continue
    elif `number` in `number ** 2`:
        return f(counter-1, number+1) + 1
    # Number is not in A018834 -> count 1, continue
    else:
        return f(counter, number+1) + 1





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