Kotak "Early Bird"

15

Definisi

Jika Anda mengambil urutan kotak bilangan bulat positif, dan menyatukannya menjadi string angka (yaitu 149162536496481100...), kotak "burung awal" adalah yang dapat ditemukan dalam string ini di depan posisi aslinya.

Misalnya, 7 2 (angka 49), dapat ditemukan pada offset 2 dalam string, meskipun posisi alami pada offset 10. Dengan demikian 7 adalah kotak "burung awal" pertama.

Perhatikan bahwa untuk dianggap sebagai kotak "burung awal", semua digit di dalam kotak harus terjadi sebelum dimulainya posisi alami. Kecocokan yang tumpang tindih sebagian posisi alami tidak dihitung.

a(n)adalah bilangan bulat positif n k sehingga k 2 adalah bujur sangkar "burung awal".

Tugas

Diberikan bilangan bulat positif n, keluaran a(n).

Anda dapat menggunakan pengindeksan berbasis 1 atau 0, tetapi jika Anda menggunakan pengindeksan berbasis 0, harap katakan demikian dalam jawaban Anda.

Solusi Anda harus dapat menangani setidaknya setinggi a(53)(atau jika Anda menggunakan pengindeksan berbasis 0, a(52)).

Testcases

n     a(n)
1     7
2     8
3     21
4     25
5     46
6     97
7     129
8     161
9     196
10    221
...
13    277
...
50    30015
51    35000
52    39250
53    46111

Referensi

James Holderness
sumber
Apakah tabel kasus uji menggunakan basis 0 atau 1?
idrougge
1
Bisakah mengeluarkan nelemen pertama dari urutan tersebut dapat diterima? Terserah OP tetapi banyak orang memilih untuk mengizinkannya.
HyperNeutrino
Kasus uji @idrougge berbasis 1.
James Holderness
@HyperNeutrino Saya lebih suka memiliki hasil yang konsisten untuk semua jawaban, jadi harap kembalikan nilai tunggal a(n).
James Holderness
Uji kasus hingga 79 .
user202729

Jawaban:

5

05AB1E , 10 9 byte

Disimpan 1 byte berkat Adnan .

µNL<nJNnå

Cobalah online!

Penjelasan

µ           # loop until counter equals the input
 NL         # push the range [1 ... iteration_no]
   <        # decrement each
    n       # square each
     J      # join to string
      Nnå   # is iteration_no in the string?
            # if true, increase counter
Emigna
sumber
Anda dapat meninggalkan ½apa yang akan secara otomatis ditambahkan ke loop ketika hilang.
Adnan
@ Adnan: Benar. Melihat tantangan ini tepat sebelum saya naik kereta (atau akan jika tidak ditunda), jadi saya benar-benar merindukan itu. Terima kasih :)
Emigna
7

JavaScript (ES6), 51 49 45 byte

1-diindeks.

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

Demo

Diformat dan dikomentari

f = (                         // f = recursive function taking:
  n,                          //   n = input
  s = k = ''                  //   s = string of concatenated squares, k = counter
) =>                          //
  n ?                         // if we haven't reached the n-th term yet:
    f(                        //   do a recursive call with:
      n - !!s.match(++k * k), //     n decremented if k² is an early bird square
      s + k * k               //     s updated
    )                         //   end of recursive call
  :                           // else:
    k                         //   return k

Versi non-rekursif, 53 byte

Yang ini tidak tergantung pada ukuran tumpukan mesin Anda.

n=>{for(k=s='';n-=!!(s+=k*k).match(++k*k););return k}

Cobalah online!

Arnauld
sumber
6

Pyth , 12 byte

e.f/jk^R2Z`*

Coba di sini!

Bagaimana itu bekerja

ef / jk ^ R2Z` * ~ Program lengkap. Biarkan Q menjadi input kami.

 .f ~ Bilangan bulat positif pertama dengan hasil yang benar. Menggunakan variabel Z.
      ^ R2Z ~ Siku setiap integer dalam kisaran [0, Z).
    jk ~ Menggabungkan menjadi satu string.
   / ~ Hitung kejadian ...
          `* ~ Representasi string dari Z kuadrat.
               Menghasilkan 0 jika salah dan ≥ 1 jika benar.
e ~ Dapatkan elemen terakhir (Qth truthy integer). Output secara implisit.
Tuan Xcoder
sumber
4

Perl 5 , 34 byte

33 byte kode +1 untuk -p.

$s.=$\*$\while$_-=$s=~(++$\*$\)}{

Cobalah online!

Dom Hastings
sumber
4

APL (Dyalog) , 53 42 byte

{{0<+/(⍕×⍨⍵+1)⍷' '~⍨⍕×⍨⍳⍵:⍵+1⋄∇⍵+1}⍣⍵⊢0}

Cobalah online!

Bagaimana?

- Menemukan kemunculan

⍕×⍨⍵+1 - kuadrat bersusun dari x+1 di

⍕×⍨⍳⍵ - Rentang kuadrat kotak x

' '~⍨ - tanpa spasi

+/ - jumlah

0< - jika jumlahnya positif (kejadian ada), maka hasilnya kembali x+1 , jika tidak,

∇⍵+1 - kambuh dengan x+1 .

⍣⍵- berlaku nkali.

Uriel
sumber
3

Haskell , 73 byte

import Data.List
([n|n<-[7..],isInfixOf(g n)$g=<<[1..n-1]]!!)
g=show.(^2)

Cobalah online!Diindeks nol.

Penjelasan

Pembantu:

import Data.List -- import needed for isInfixOf
g=show.(^2)      -- function short cut to square an int and get the string representation

Fungsi utama:

(                                 !!) -- Index into the infinite sequence
 [n|n<-[7..],                    ]    -- of all numbers n greater equal 7
      isInfixOf(g n)$                 -- whose square appears in the string
                     g=<<[1..n-1]     -- of all squares from 1 up to n-1 concatenated.
Laikoni
sumber
2

Jelly , 13 11 byte

R²DµṪẇF
Ç#Ṫ

Cobalah online!

Atau ini adalah solusi 10 byte yang mencetak nnilai pertama dari urutan: Coba online!

pengguna202729
sumber
lol Anda mengalahkan saya untuk ini; Saya memiliki solusi yang persis sama dengan Anda (setelah bermain golf): P
HyperNeutrino
@HyperNeutrino Tampaknya salah, sayangnya.
user202729
Oh benarkah? Sangat disayangkan :( sunting oh benar nfindthingy: (((
HyperNeutrino
@HyperNeutrino Tidak masalah, membaca dari karya stdin.
user202729
2

Python 2 , 62 61 byte

n=input();i=0;s=''
while n:i+=1;n-=`i*i`in s;s+=`i*i`
print i

Cobalah online!

ovs
sumber
2

Jelly , 11 byte

Ḷ²DFɓ²ẇ
Ç#Ṫ

Cobalah online!

Alternatif untuk solusi user202729 .

Bagaimana itu bekerja

C#Ṫ ~ Main Link.

Ç#  ~ First N positive integers with truthy results.
  Ṫ ~ Tail. Take the last one.

-----------------------------------------------------------

Ḷ²DFɓ²ẇ ~ Helper link. This is the filtering condition.

Ḷ       ~ Lowered range. Yields {x | x ∊ Z and x ∊ [0, N)}.
 ²      ~ Square each.
  D     ~ Convert each to decimal (this gets the list of digits).
   F    ~ Flatten.
    ɓ   ~ Starts a new monadic chain with swapped arguments.
     ²  ~ N²; Yields N squared.
      ẇ ~ Is ^ sublist of ^^^?
Tuan Xcoder
sumber
Wow, memiliki pengetatan otomatis.
user202729
2

Alice , 32 byte

/
\io/&wd.*\@! d ? ~ ? F $ /WKdt

Cobalah online!

Layout boros dari mode Ordinal benar-benar menggangguku, tetapi semua yang saya coba untuk menyimpan beberapa byte keluar lebih lama ...

Penjelasan

/
\io/...@...

Hanya kerangka I / O desimal biasa, dengan odan @dalam posisi yang sedikit tidak biasa. Daging dari program ini adalah ini:

&w    Push the current IP address to the return address stack n times.
      This gives us an easy way to write a loop which repeats until we
      explicitly decrement the loop counter n times.

  d     Push the stack depth, which acts as our running iterator through
        the natural numbers.
  .*    Square it.
  \     Switch to Ordinal mode.
  !     Store the square (as a string) on the tape.
  d     Push the concatenation of the entire stack (i.e. of all squares before
        the current one).
  ?~    Retrieve a copy of the current square and put it underneath.
  ?     Retrieve another copy.
  F     Find. If the current square is a substring of the previous squares,
        this results in the current square. Otherwise, this gives an empty
        string.
  $     If the previous string was empty (not an early bird) skip the next
        command.
  /     Switch back to Cardinal. This is NOT a command.
  W     Discard one address from the return address stack, decrementing our
        main loop counter if we've encountered an early bird.
K     Jump back to the beginning of the loop if any copies of the return
      address are left. Otherwise do nothing and exit the loop.

dt    Push the stack depth and decrement it, to get the final result.
Martin Ender
sumber
Saya tidak tahu bahasa ini, tetapi dapatkah Anda menyimpan byte dengan memeriksa apakah kuadrat saat ini ada di string sebelum menambahkannya?
WGroleau
@WGroleau saya tidak berpikir begitu. Pemeriksaan utama masih satu byte ( Fbukan z), tetapi manipulasi stack tidak akan lebih mudah, bahkan mungkin satu atau dua perintah lebih buruk.
Martin Ender
@ JamesHolderness Kenapa tidak? 69696 muncul dua posisi sebelum posisi aslinya (tumpang tindih dengannya). Jika tumpang tindih dengan posisi alami harus diabaikan, Anda mungkin harus mengatakannya dalam tantangan.
Martin Ender
@ JamesHolderness kasus uji yang relevan terlalu lama untuk diperiksa, jadi saya hanya melakukan sampai 10. Kasus uji menengah harus membantu.
Martin Ender
Itu jelas meningkatkan tantangan. Apakah Anda akan mengomentari jawaban sebelumnya yang gagal dengan cara yang sama? Catatan: Saya menemukan ini menghibur, tetapi tidak pernah menjawab, karena semua bahasa saya dirancang dengan keterbacaan sebagai persyaratan. :-) Kecuali untuk assembler dan FORTH. :-)
WGroleau
1

Sekam , 13 byte

!f§€oṁ₁ŀ₁N
d□

Cobalah online!

Penjelasan

Baris kedua adalah fungsi pembantu yang memberi kita angka desimal dari kuadrat angka:

 □    Square.
d     Base-10 digits.

Kita dapat menjalankan fungsi ini pada program utama menggunakan .

!f§€oṁ₁ŀ₁N
 f§      N    Filter the list of natural numbers by the following fork g(n).
       ŀ        Get [0, 1, ... n-1]
     ṁ₁         Get the decimal digits of each value's square and concatenate
                them into one list. (A)
        ₁       And get the decimal digits of n² itself. (B)
    €           Check whether (A) contains (B) as a sublist.
!             Use the programs input as an index into this filtered list.
Martin Ender
sumber
1

Kotlin , 79 byte

{n->var m=n;var i=0;var s="";while(m>0){val k="${++i*i}";if(k in s)m--;s+=k};i}

Cobalah online!

ovs
sumber
1

Bahasa Wolfram (Mathematica) , 75 byte

(n=k=0;s="";While[n<#,If[!StringFreeQ[s,t=ToString[++k^2]],n++];s=s<>t];k)&

Cobalah online!

Bagaimana itu bekerja

nmenjaga jumlah burung awal yang ditemukan sejauh ini, knomor terakhir diperiksa, ssenar "1491625...". Meskipun nterlalu kecil, jika sberisi kotak berikutnya, burung awal lain telah ditemukan, jadi kami menambahnya n. Bagaimanapun, kami memperluass .

Setelah nmencapai input #, kami kembali k, nomor terakhir diperiksa dan karena itu burung awal ditemukan.

Di laptop saya, dibutuhkan sekitar 53 detik untuk menghitung urutan ke-53 dari urutan tersebut.

Misha Lavrov
sumber
1

REXX , 66 byte

arg n,a
k=0
do i=1 until k=n
  k=k+(pos(i*i,a)>0)
  a=a||i*i
  end
say i

Cobalah online!

idrougge
sumber
1

Bash, 76 69 byte

Asumsikan ndiberikan ke dalam variabel (yaitu n=10 foo.sh). Menggunakan paket grep. Nilai tengah apa pun adalah output (jika diizinkan, -3 byte).

while((n));do((b=++a*a));grep -q $b<<<$s&&((n--));s=$s$b;done;echo $a

Bagaimana cara kerjanya?

while ((n)); do  # while n != 0 (C-style arithmetic)
  ((b = ++a*a))  # Increment a and let b = a*a
    # Non-existent value is treated as zero
  grep $b<<<$s   # Search for b in s
    && ((n--))   # If found, decrement n
  s=$s$b         # Append b to s
done
echo $a
iBug
sumber
@ James Ini dia.
iBug