Sayı kare içindeki sayı


13

N'nin N ^ 2'de bir alt dize olarak göründüğü bir doğal sayı dizisini düşünün. A018834

Çıkış nbu dizinin inci elemanı.

kurallar

Program sadece ngirdi olarak alır ve sadece bir sayı çıkarır N.

Sekans, 0 dizinli veya 1 dizinli olabilir.

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 ...

Bu kod golf çok kısa kod kazanır.


1
Birçok uygulama sorunlara yol açacaktır (benim için 2 ^ 32 değerden fazla diziler oluşturamama nedeniyle), bu da çoğu çözümü varsayılan olarak maksimum boyuta bağlı hale getirecektir. Bu çözümler diskalifiye edilmeli mi?
maxb

1
@maxb Teorik olarak pratik olması gerekmediğini düşünüyorum .
Arnauld

1
@Ourous Gerçekten düşük olduğunu biliyorum, bu yüzden çözümümü sevmiyorum. Bir bayt ekleyebilir ve çok daha büyük girdiler için çalışmasını sağlayabilirim, bu yüzden bunu alternatif olarak ekleyeceğim
maxb

1
"N, N ^ 2'de görünür", "N'nin ondalık basamakları, N karesinin ondalık basamaklarının [bitişik] bir alt dizesidir" (11, "121'de" görünmez) gibi bir şeyle daha iyi ifade edilir. [Kesinlikle "bitişik" gereksizdir, ancak eklemek açıktır.]
Jonathan Allan

1
@JonathanAllan Alternate
rewording

Yanıtlar:


4

05AB1E , 6 bayt

1 endeksli

µNNnNå

Çevrimiçi deneyin!

açıklama

µ         # 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

Bu µkomut sadece ... Keşke buna sahip olsaydım.
maxb

@maxb: NthBelirli bir koşula uyan sayıyı bulmanız gereken zorluklar için oldukça pratiktir .
Emigna

" doğruysa sayacı artır"?
Jonathan Allan

@JonathanAllan: "N ^ 2'de N varsa, sayacın değerini 1 arttırın". Muhtemelen "artış sayacı" yazmalıydım.
Emigna

Aslında açıklamayı anlamadım; åverim doğruysa, o zaman Nyığının tepesinde (artım sayacı ve artış N) akıma sahip olduğumuz , ancak eğer devam etmezsek (artım N) görünür . Belki Nde soru gövdesinde nihai sonuç olduğu için " " dışında bir şey kullanın : p
Jonathan Allan

4

Perl 6 , 33 31 bayt

Nwellnhof sayesinde -2 bayt

{(grep {$^a²~~/$a/},1..*)[$_]}

Çevrimiçi deneyin!

Açıklama:

{                            }  # Anonymous code block that returns
 (                      )[$_]   # The nth index of
  grep {          },1..*        # Filtering from the natural numbers
        $^a²                    # If the square of the number
            ~~/$a/              # Contains the number

3

JavaScript (ES6), 43 bayt

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

Çevrimiçi deneyin!


Özyinelemesiz sürüm, 47 bayt

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

Çevrimiçi deneyin!


Bu n=23sadece vazgeçmez mi?
Vedant Kandoi

@VedantKandoi JS motorunuzdaki çağrı yığınının büyüklüğüne bağlıdır. Ancak işlem gerektiren bu yüzden, recursions için yinelemeli çağrı . a ( n ) 7600 n = 23a(n)a(n)7600n=23
Arnauld

3

MathGolf , 8 bayt (teoride herhangi bir girdi için çalışır, ancak sadece n<10uygulamada)

úrgɲï╧§

Çevrimiçi deneyin!

Alternatif ( n<49uygulama ve teoride çalışır )

►rgɲï╧§

Tek fark, 10^(input)değerler içeren bir liste oluşturmak yerine, 10^6öğeler içeren bir liste oluşturmaktır . Bu işlem biraz zaman alır, böylece ilk baytı test etmek için diğer 1 baytlık değişmez değerlerle değiştirebilirsiniz.

açıklama

ú          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

Bu çözümün büyük girdiyi işlememesinin nedeni, dizinin üstelden daha az, ancak herhangi bir polinomdan daha fazla büyüdüğünü fark ettim. Bu yüzden 10**noperatörü kullandım (kullanmak istedim 2**nancak giriş 1 için başarısız oldu). Bu, küçük girdiler için bile çok büyük bir dizi oluşturduğum, sadece büyük çoğunluğunu filtrelediğim ve ardından ilk unsurlardan birini aldığım anlamına geliyor. Son derece israf, ama bayt sayısını arttırmadan bunu yapmanın başka bir yolunu bulamadım.



2

Temiz , 83 bayt

import StdEnv,Text

(!!)[i\\i<-[1..]|indexOf(""<+i)(""<+i^2)>=0]

Çevrimiçi deneyin!

(!!)                               // index into the list of
 [ i                               // i for every
  \\ i <- [1..]                    // i from 1 upwards
  | indexOf (""<+i) (""<+i^2) >= 0 // where i is in the square of i
 ]

2

Jöle , 6 bayt

1ẇ²$#Ṫ

1 endeksli.

Çevrimiçi deneyin!

Nasıl?

Sekansın ilkini nliste olarak bulur ve ardından kuyruğu verir 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

0Doğal bir sayı olarak kabul edilirse , 1 endeksli tam programı ẇ²$#Ṫ5 için kullanabiliriz.




2

Java 8, 66 65 63 bayt

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

@Shaggy sayesinde -1 bayt . @Arnauld
sayesinde -2 bayt .

1 endeksli.

Çevrimiçi deneyin.

Açıklama:

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, elbette. Teşekkürler!
Kevin Cruijssen

1
@Arnauld Ah, döngü birleştirmenin akıllı yolu ve eğer! Teşekkürler.
Kevin Cruijssen

2

Clojure , 81 bayt

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

Çevrimiçi deneyin! (Ne yazık ki, TIO Clojure'un standart dize kütüphanesini desteklemiyor gibi görünüyor)

Clojure daha az içe aktarım sözdizimine sahipse veya includes?çekirdek kütüphanede bir yöntem içeriyorsa, bu aslında biraz rekabetçi olabilir. clojure.string/includes?Yalnız burada bazı cevaplardan daha uzun: /

(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 bağlantısı koptuğundan, işte bir test çalıştırması. Soldaki sayı index ( n) ve sonuç ( N) sağda:

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

Bu, aşağıdakilerin herhangi bir değerini destekleyebilmelidir n; bitirmesini beklemek istiyorsanız (dizideki 50. ila 100. tam sayıları bulmak 15 dakika sürdü). Clojure keyfi olarak büyük tamsayı aritmetiğini destekler, bu nedenle sayılar çok büyük olmaya başladığında, BigInts'yi kullanmaya başlar .


1

Kömür , 25 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. 0 endeksli. Açıklama:

Nθ

Giriş n.

≔¹η

N1'de başlayın . (Veya, 0girişin 1 dizinli olmasını sağlayacak saymaya başlayabilir .)

Wθ«

Sekanstaki nsayıları bulana kadar tekrarlayın .

≦⊕η

Artış N.

¿№I×ηηIη

Eğer N*Niçeriyorsa N, o zaman ...

≦⊖θ»

... azalma n.

Iη

Yazdırın N.

Bir sahip olmayan) ayrıca kömür, bir ile altüst edildi, bu golf benim girişimleri if..thenbir olmamasından) 2 bayt maliyeti bir blok () b sonunda dışında Containsçıkışını dönüştürülmesi (operatörü Findveya Countbir çıkarma verebilecek bir mantıksal içine ntekrar maliyetleri 2 bayt).


1

Düzenleme (yorumlara yanıt): Python 2, 76 bayt

Özyinelemesiz bir yöntem denemek istedim. (Golf için yeni, herhangi bir ipucu harika olurdu!)

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

BMO ve Vedant Kandoi'ye teşekkürler!


2
print(f(13))Kodu saymanız gerekmez . Ayrıca while 1:, if c==1:return n,c==1 can be c<2
Vedant Kandoi

Ah, özyinelemeli olmayan bir sürüm istediğini görmedim, nvm .. Her neyse, şu anda 79 bayt değil, 76 bayt sayıyorum.
18:46

Ve birkaç tane daha kaydedebilirsiniz: Önceki ve sonraki boşluklar `gereksizdir ve c<2:sonraki boşluklar da, girintiler için sekmeleri ve boşlukları karıştırabilirsiniz ( burada gösterildiği gibi ): 69 bayt Btw. eski sürümünüzü saklamanıza gerek yoktur (ilgilenenler için düzenleme geçmişindedir) ve neden TIO'ya (veya benzeri) / şablonu oradan kullanmıyorsunuz?
18:46

1

Haskell, 60 bayt

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

Çevrimiçi deneyin!

      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

Python 2 , 47 43 bayt

Dennis sayesinde -4 bayt (geri dönmek yerine yinelemeli çağrıya 1 ekleme n-1)

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

Çevrimiçi deneyin!

Explantion / Ungolfed

c,nn1,2,3n in n2cc=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



1

Lua , 137 123 79 bayt

-Teşekkürler @Jo King için 44 bayt

n=io.read()i=0j=0while(i-n<0)do j=j+1i=i+(n.find(j*j,j)and 1or 0)end
print(j*j)

Çevrimiçi deneyin!


79 bayt . Bazı genel ipuçları; / false/trueolabilir , s ve s için köşeli parantez gerekli değildir , sayılardan sonra boşlukların çoğunu (hatta yeni satırlar) kaldırabilirsiniz. 0>10<1ifwhile
Jo King

1

Tcl , 82 bayt

proc S n {while 1 {if {[regexp [incr i] [expr $i**2]]&&[incr j]==$n} {return $i}}}

Çevrimiçi deneyin!


Sanırım süre ve if ile karıştırabilirsiniz:proc S n {while {[incr j [regexp [incr i] [expr $i**2]]]-$n} {};return $i}
david

0

Düzenli , 24 bayt

{x:str(x)in'~.x^2}from N

Çevrimiçi deneyin!

Bir işlev gibi çağrıldığında nserideki th öğesini döndüren tembel bir liste döndürür .

açıklama

{x:str(x)in'~.x^2}from N
{x:              }from N       select all natural numbers `x` such that
   str(x)                      the string representation of `x`
         in                    is contained in
           '~.x^2              "~" + str(x^2)
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.