“Erkenci Kuş” kareleri


15

Tanım

Pozitif tamsayı kareler dizisini alır ve bunları bir basamak dizisine (yani 149162536496481100...) birleştirirseniz, "erken kuş" karesi doğal dizilişinden önce bu dizede bulunabilen karedir.

Örneğin, 7 2 (sayı 49), doğal konum ofset 10'da olmasına rağmen, dizede 2 ofsetinde bulunabilir. Dolayısıyla 7 ilk "erken kuş" karesidir.

Bir "erken kuş" karesi olarak görülmesi için, karedeki tüm rakamların doğal konumun başlamasından önce gerçekleşmesi gerektiğini unutmayın. Doğal pozisyonla kısmen örtüşen bir maç sayılmaz.

a(n)k böyle n'inci pozitif tam k 2 "erken kuş" karedir.

Görev

Pozitif bir tamsayı verildiğinde nçıktı a(n).

1 veya 0 tabanlı indeksleme kullanabilirsiniz, ancak 0 tabanlı indeksleme kullanıyorsanız, lütfen cevabınızda söyleyin.

Çözümünüz en az a(53)(veya 0 tabanlı dizine ekleme kullanıyorsanız) kadar yüksek düzeyde işlem yapabilmelidir 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

Referanslar


Test senaryoları tablası 0 veya 1 mi kullanıyor?
Idrougge

1
nDizinin ilk elemanlarının çıktısı kabul edilebilir mi? OP'ye bağlı ama birçok kişi buna izin veriyor.
HyperNeutrino

@idrougge test vakaları 1 tabanlıdır.
James Holderness

@HyperNeutrino Tüm cevaplar için tutarlı bir sonuç kümesi olmasını tercih ederim, bu yüzden lütfen tek değerini döndürün a(n).
James Holderness

Yanıtlar:


5

05AB1E , 10 9 bayt

Adnan sayesinde 1 bayt kurtardı .

µNL<nJNnå

Çevrimiçi deneyin!

açıklama

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

½Kayıp olduğunda döngüye otomatik olarak eklenecek olanı dışarıda bırakabilirsiniz .
Adnan

@Adnan: Doğru. Bir trene atlamadan hemen önce bu zorluğu fark ettim (veya geciktirilmemişse gidecekti), bu yüzden tamamen kaçırdım. Teşekkürler :)
Emigna

7

JavaScript (ES6), 51 49 45 bayt

1 endeksli.

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

gösteri

Biçimlendirilmiş ve yorumlanmış

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

Özyinelemesiz sürüm, 53 bayt

Bu, motor yığını boyutunuza bağlı değildir.

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

Çevrimiçi deneyin!


6

Pyth , 12 bayt

e.f/jk^R2Z`*

Burada deneyin!

Nasıl çalışır

ef / jk ^ R2Z` * ~ Tam program. Q bizim girdimiz olsun.

 .f ~ Doğru sonuçlar veren ilk Q pozitif tamsayılar. Z değişkenini kullanır.
      ^ R2Z ~ Her tamsayıyı [0, Z) aralığında kare.
    jk ~ Tek bir dizeye birleştirin.
   / ~ ...
          `* ~ Z'nin dize ile temsili.
               Yanlışsa 0, doğruysa ≥ 1 verir.
e ~ Son elemanı al (Qth doğruluk tamsayısı). Çıktı dolaylı olarak.


4

APL (Dyalog) , 53 42 bayt

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

Çevrimiçi deneyin!

Nasıl?

- oluşumlarını bul

⍕×⍨⍵+1 - dizilmiş kare x+1 içinde

⍕×⍨⍳⍵ - dizilmiş kareler aralığı x

' '~⍨ - boşluksuz

+/ - toplam

0< - toplam pozitifse (tekrarlar varsa), o zaman geri döner x+1 , aksi takdirde,

∇⍵+1 - ile tekrarlamak x+1 .

⍣⍵- nsüreleri uygulayın .


3

Haskell , 73 bayt

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

Çevrimiçi deneyin! Sıfır endekslendi.

açıklama

Yardımcılar:

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

Ana işlev:

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



2

Jöle , 11 bayt

Ḷ²DFɓ²ẇ
Ç#Ṫ

Çevrimiçi deneyin!

User202729'un çözümüne bir alternatif .

Nasıl çalışır

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 ^^^?

Vay canına, otomatik tel çekimi var.
user202729

2

Alice , 32 bayt

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

Çevrimiçi deneyin!

Ordinal modun bu gerginliğinin savurgan düzeni gerçekten beni rahatsız ediyor, ancak orada bazı baytları kurtarmaya çalıştığım her şey daha uzun çıkıyor ...

açıklama

/
\io/...@...

Sadece olağan ondalık G / Ç çerçevesi, ove @biraz olağandışı konumlarda. Programın eti şudur:

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

Bu dili bilmiyorum, ancak geçerli kare eklemeden önce dizede olup olmadığını kontrol ederek herhangi bir bayt kaydedebilir misiniz?
WGroleau

@WGroleau Ben öyle düşünmüyorum. Ana kontrol hala bir bayttır ( Fyerine z), ancak yığın manipülasyonu daha basit olmayacak, muhtemelen bir veya iki komut daha da kötü olmayacaktır.
Martin Ender

@JamesHolderness Neden olmasın? 69696 doğal pozisyonundan önce iki pozisyonda görünür (onunla çakışır). Doğal konumu ile örtüşmeler göz ardı edilirse, muhtemelen bunu meydan okumada söylemelisiniz.
Martin Ender

@JamesHolderness ilgili test senaryolarının kontrol edilmesi çok uzun sürdü, bu yüzden sadece 10'a kadar yaptım. Ara test vakası yardımcı olmalı.
Martin Ender

Bu kesinlikle zorluğu artırır. Aynı şekilde başarısız olan önceki cevaplara yorum yapar mısınız? Not: Bunları eğlenceli buluyorum, ama asla cevap vermiyorum, çünkü tüm dillerim bir gereksinim olarak okunabilirlikle tasarlandı. :-) Montajcı ve FORTH hariç. :-)
WGroleau

1

Kabuk , 13 bayt

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

Çevrimiçi deneyin!

açıklama

İkinci satır, bize bir sayının karesinin ondalık basamaklarını veren bir yardımcı işlevdir:

 □    Square.
d     Base-10 digits.

Bu işlevi kullanarak ana programda çalıştırabiliriz .

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


1

Wolfram Dili (Mathematica) , 75 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

nşimdiye kadar bulunan erken kuş ksayısını, kontrol edilen son numarayı s, ipi tutar "1491625...". nÇok küçük olsa da s, bir sonraki kareyi içeriyorsa, başka bir erken kuş bulundu, bu yüzden artıyoruz n. Her durumda, biz uzatıyoruz s.

Bir kez nulaşır girişi# , biz dönmekk , son numara kontrol ve bu nedenle son erken kuş bulundu.

Dizüstü bilgisayarımda, dizinin 53. terimini hesaplamak yaklaşık 53 saniye sürer.



1

Baş, 76 69 bayt

nDeğişken (yani n=10 foo.sh) olarak verildiğini varsayalım . Paketi kullanır grep. Herhangi bir orta değer verilir (izin veriliyorsa, -3 bayt).

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

O nasıl çalışır?

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

@James İşte gidiyor.
iBug
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.