Angka dalam Angka kuadrat

13

Pertimbangkan urutan bilangan asli yang N muncul sebagai substring dalam N ^ 2. A018834

Keluarkan nelemen ke-5 dari urutan ini.

Aturan

Program hanya mengambil ninput dan output hanya satu nomor - N.

Urutannya bisa 0-diindeks atau 1-diindeks.

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

Ini adalah kode-golf sehingga kode terpendek menang.

Vedant Kandoi
sumber
1
Banyak implementasi akan mengalami masalah (bagi saya itu karena tidak dapat membuat array dengan lebih dari 2 ^ 32 nilai), yang akan membuat sebagian besar solusi terikat ke ukuran maksimum secara default. Haruskah solusi ini didiskualifikasi?
Maks.
1
@ Maxb Saya pikir secara teoritis dimaksudkan belum tentu praktis .
Arnauld
1
@Ourous Saya tahu ini sangat rendah, itu sebabnya saya tidak suka solusi saya. Saya bisa menambahkan byte dan membuatnya bekerja untuk input yang jauh lebih besar, jadi saya akan menambahkannya sebagai alternatif
maxb
1
"N muncul dalam N ^ 2" akan lebih baik diucapkan sebagai sesuatu seperti "angka desimal N adalah substring [berdekatan] dari angka desimal N kuadrat" (11 tidak "muncul dalam" 121). [Ketat "berdekatan" berlebihan, tetapi menambahkannya jelas.]
Jonathan Allan
1
@JonathanAllan Alternate menyarankan menulis ulang: "N ada secara leksikografis dalam N ^ 2"
28urous

Jawaban:

4

05AB1E , 6 byte

1-diindeks

µNNnNå

Cobalah online!

Penjelasan

µ         # 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
Emigna
sumber
Itu µperintah hanya ... Aku berharap aku punya itu.
Maks.
@ Maxb: Cukup praktis untuk tantangan di mana Anda perlu menemukan Nthnomor yang memenuhi syarat tertentu.
Emigna
" Jika benar , tambah counter"?
Jonathan Allan
@ JonathanAllan: Seperti dalam, "Jika N terkandung dalam N ^ 2, tambahkan nilai penghitung sebesar 1". Saya mungkin harus menulis "penghitung kenaikan".
Emigna
Saya sebenarnya tidak mengerti penjelasannya; tampaknya jika åhasil benar maka kita memiliki arus Ndi bagian atas tumpukan (penghitung kenaikan dan penambahan N), tetapi jika tidak kita melanjutkan (kenaikan N). Mungkin menggunakan sesuatu selain " N" karena itu adalah hasil akhir di badan pertanyaan: p
Jonathan Allan
4

Perl 6 , 33 31 byte

-2 byte terima kasih kepada nwellnhof

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

Cobalah online!

Penjelasan:

{                            }  # 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
Jo King
sumber
3

JavaScript (ES6), 43 byte

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

Cobalah online!


Versi non-rekursif, 47 byte

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

Cobalah online!

Arnauld
sumber
Ini menyerah n=23hanya?
Vedant Kandoi
Sebuah(n)Sebuah(n)7600n=23
3

MathGolf , 8 byte (berfungsi untuk input apa pun dalam teori, tetapi hanya untuk n<10dalam praktik)

úrgɲï╧§

Cobalah online!

Alternatif (bekerja untuk n<49praktik dan teori)

►rgɲï╧§

Satu-satunya perbedaan adalah bahwa alih-alih membuat daftar dengan 10^(input)nilai, saya membuat daftar dengan 10^6item. Ini membutuhkan waktu untuk dijalankan, sehingga Anda dapat menukar byte pertama dengan literal 1 byte lainnya untuk mengujinya.

Penjelasan

ú          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

Alasan mengapa solusi ini tidak menangani input besar adalah karena saya perhatikan bahwa urutannya tumbuh kurang dari eksponensial, tetapi lebih dari polinomial mana pun. Itu sebabnya saya menggunakan 10**noperator (saya ingin menggunakan 2**ntetapi gagal untuk input 1). Itu berarti bahwa saya membuat array yang sangat besar bahkan untuk input kecil, hanya untuk menyaring sebagian besar dari itu, dan kemudian mengambil salah satu elemen pertama. Ini sangat boros, tetapi saya tidak dapat menemukan cara lain untuk melakukannya tanpa menambah jumlah byte.

maks
sumber
3

Gangguan Umum, 95 byte

(lambda(n)(do((i 0))((= n 0)i)(if(search(format()"~d"(incf i))(format()"~d"(* i i)))(decf n))))

Cobalah online!

Renzo
sumber
2

Bersih , 83 byte

import StdEnv,Text

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

Cobalah online!

(!!)                               // 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
 ]
Suram
sumber
2

Jelly , 6 byte

1ẇ²$#Ṫ

1-diindeks.

Cobalah online!

Bagaimana?

Menemukan urutan pertama nsebagai daftar dan kemudian menghasilkan ekor 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

Jika 0dianggap sebagai bilangan alami, kita bisa menggunakan program lengkap 1-diindeks ẇ²$#Ṫuntuk 5.

Jonathan Allan
sumber
2

Japt, 12 11 byte

@aJ±X²søY}f

Cobalah

ȲsøY «U´}a

Cobalah

Shaggy
sumber
2

Java 8, 66 65 63 byte

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

-1 byte terima kasih kepada @Shaggy .
-2 byte terima kasih kepada @Arnauld .

1-diindeks.

Try it online.

Explanation:

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`
Kevin Cruijssen
sumber
1
65 bytes
Shaggy
1
@Shaggy Ah, of course. Thanks!
Kevin Cruijssen
1
@Arnauld Ah, smart way of combining the loop and if! Thanks.
Kevin Cruijssen
2

Clojure, 81 bytes

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

Try it online! (Unfortunately, TIO doesn't seem to support Clojure's standard string library)

Jika Clojure memiliki impor sintaks yang lebih pendek, atau memiliki includes?metode di perpustakaan inti, ini sebenarnya bisa agak kompetitif. clojure.string/includes?sendiri lebih panjang dari beberapa jawaban di sini: /

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

Karena tautan TIO rusak, inilah uji coba. Angka di sebelah kiri adalah indeks ( n), dan hasilnya ( N) di sebelah kanan:

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

Ini harus dapat mendukung nilai apa pun dari n; asalkan Anda bersedia menunggu sampai selesai (menemukan bilangan bulat ke 50 hingga ke 100 dalam urutan memakan waktu 15 menit). Clojure mendukung aritmetika bilangan bulat besar yang sewenang-wenang, jadi begitu angka mulai menjadi besar, ia mulai menggunakan BigInts.

Carcigenicate
sumber
1

Arang , 25 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Penjelasan:

Nθ

Masukan n.

≔¹η

Mulai Ndari 1. (Atau, ini bisa mulai menghitung di 0mana akan membuat input 1-diindeks.)

Wθ«

Ulangi sampai kami menemukan nangka dalam urutan.

≦⊕η

Penambahan N.

¿№I×ηηIη

Jika N*Nberisi N, maka ...

≦⊖θ»

... penurunan n.

Iη

Cetak N.

Upaya saya bermain golf lebih lanjut dihalangi oleh Charcoal a) tidak memiliki if..thenkecuali pada akhir blok (yang biaya 2 byte) b) tidak memiliki Containsoperator (mengubah output Findatau Countmenjadi boolean yang saya dapat kurangi dari nbiaya lagi 2 byte).

Neil
sumber
1

Edit (respons terhadap komentar): Python 2, 76 byte

Ingin mencoba metode non rekursif. (Baru bermain golf, kiat apa pun akan bagus!)

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

Terima kasih, baik BMO dan Vedant Kandoi!

Henry T
sumber
2
You don't have to count print(f(13)) in the code. Also while 1:,if c==1:return n,c==1 can be c<2
Vedant Kandoi
Ah, I didn't see that you wanted a non-recursive version, nvm.. Anyway, I currently count 76 bytes not 79.
ბიმო
Dan Anda dapat menyimpan lebih banyak: Spasi sebelum & sesudahnya `adalah redundan dan yang sesudahnya c<2:juga, selanjutnya Anda dapat mencampur tab dan spasi untuk indentasi (seperti yang ditunjukkan di sini ): 69 byte Btw. tidak perlu menyimpan versi lama Anda (itu ada dalam riwayat edit untuk mereka yang tertarik) dan mengapa tidak menautkan ke TIO (atau serupa) / menggunakan templat dari sana?
ბიმო
1

Haskell, 60 byte

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

Cobalah online!

      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
nimi
sumber
1

Python 2 , 47 43 byte

-4 byte terima kasih kepada Dennis (menambahkan 1 ke panggilan rekursif alih-alih kembali n-1)

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

Cobalah online!

Penjelasan / Tidak Diikat

Fungsi rekursif mengambil dua argumen c,n; n is counts up 1,2,3 and everytime n in n2 it decrements c. The recursion ends as soon as 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
ბიმო
sumber
1

APL (Dyalog Extended), 31 30 bytes

1∘{>⍵:⍺-1⋄(⍺+1)∇⍵-∨/(⍕⍺)⍷⍕⍺×⍺}

Try it online!

0-indexed.

Zacharý
sumber
(⍕⍺)⍷⍕⍺⍷⍥⍕
Adám
I knew there was something I could do with that...
Zacharý
1

Lua, 137 123 79 bytes

-thanks @Jo King for 44 bytes

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)

Try it online!

ouflak
sumber
79 bytes. Some generic tips; false/true can be 0>1/0<1, brackets aren't necessary for ifs and whiles, you can remove most whitespace after numbers (even newlines).
Jo King
1

Tcl, 82 bytes

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

Try it online!

sergiol
sumber
I think you can mix the while and the if with: proc S n {while {[incr j [regexp [incr i] [expr $i**2]]]-$n} {};return $i}
david
0

Tidy, 24 bytes

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

Try it online!

Returns a lazy list which, when called like a function, returns the nth element in the series.

Explanation

{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)
Conor O'Brien
sumber