Kwadraty „wczesnego ptaka”

15

Definicja

Jeśli weźmiesz ciąg dodatnich kwadratów całkowitych i połączysz je w ciąg cyfr (tj. 149162536496481100...), Kwadrat „wczesnego ptaka” to taki, który można znaleźć w tym ciągu przed jego naturalną pozycją.

Na przykład 7 2 (liczba 49) można znaleźć z przesunięciem 2 w łańcuchu, chociaż naturalna pozycja to przesunięcie 10. Zatem 7 jest pierwszym kwadratem „wczesnego ptaka”.

Należy pamiętać, że aby uznać go za kwadrat „wczesnego ptaka”, wszystkie cyfry na kwadracie muszą wystąpić przed początkiem naturalnej pozycji. Mecz, który częściowo pokrywa się z naturalną pozycją, nie jest brany pod uwagę.

a(n)jest n-tą dodatnią liczbą całkowitą k, tak że k 2 jest kwadratem „wczesnego ptaka”.

Zadanie

Biorąc pod uwagę dodatnią liczbę całkowitą n, wyjście a(n).

Możesz użyć indeksowania 1 lub 0, ale jeśli używasz indeksowania 0, powiedz to w swojej odpowiedzi.

Twoje rozwiązanie powinno być w stanie obsłużyć co najmniej tak wysokie jak a(53)(lub jeśli korzystasz z indeksowania 0 a(52)).

Przypadki testowe

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

Bibliografia

James Holderness
źródło
Czy tabela przypadków testowych używa podstawy 0 lub 1?
idrougge
1
Czy wyjście z pierwszych nelementów sekwencji może zostać zaakceptowane? To zależy od OP, ale wiele osób decyduje się na to.
HyperNeutrino,
Przypadki testowe @idrougge są oparte na 1.
James Holderness
@HyperNeutrino Wolę mieć spójny zestaw wyników dla wszystkich odpowiedzi, więc proszę po prostu zwrócić pojedynczą wartość a(n).
James Holderness
Przypadki testowe do 79 .
user202729,

Odpowiedzi:

5

05AB1E , 10 9 bajtów

Zaoszczędzono 1 bajt dzięki Adnan .

µNL<nJNnå

Wypróbuj online!

Wyjaśnienie

µ           # 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
źródło
Możesz pominąć, ½ponieważ zostanie automatycznie dodany do pętli, gdy go nie będzie.
Adnan
@Adnan: True. Zauważyłem to wyzwanie tuż przed tym, jak wskoczyłem do pociągu (lub zamierzałem jechać, jeśli nie zostało to opóźnione), więc całkowicie go przegapiłem. Dzięki :)
Emigna,
7

JavaScript (ES6), 51 49 45 bajtów

1-indeksowany.

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

Próbny

Sformatowane i skomentowane

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

Wersja nierekurencyjna, 53 bajty

Ten nie zależy od wielkości stosu silnika.

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

Wypróbuj online!

Arnauld
źródło
6

Pyth , 12 bajtów

e.f/jk^R2Z`*

Wypróbuj tutaj!

Jak to działa

ef / jk ^ R2Z` * ~ Pełny program. Niech Q będzie naszym wkładem.

 .f ~ Pierwsze Q dodatnie liczby całkowite z prawdziwymi wynikami. Używa zmiennej Z.
      ^ R2Z ~ Kwadrat każdej liczby całkowitej w zakresie [0, Z).
    jk ~ Połącz w jeden ciąg.
   / ~ Policz wystąpienia ...
          `* ~ Przedstawienie ciągu Z do kwadratu.
               Daje 0, jeśli jest fałszem i ≥ 1, jeśli jest prawdą.
e ~ Uzyskaj ostatni element (czwarta prawdziwa liczba całkowita). Wynik niejawnie.
Pan Xcoder
źródło
4

Perl 5 , 34 bajtów

33 bajtowy kod + 1 dla -p.

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

Wypróbuj online!

Dom Hastings
źródło
4

APL (Dyalog) , 53 42 bajty

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

Wypróbuj online!

W jaki sposób?

- znajdź wystąpienia

⍕×⍨⍵+1- skośny kwadrat x+1w

⍕×⍨⍳⍵ - zawężony zakres kwadratów x

' '~⍨ - bez przestrzeni

+/ - suma

0<- jeśli suma jest dodatnia (wystąpienia), to zwraca x+1, w przeciwnym razie,

∇⍵+1- powtórzyć z x+1.

⍣⍵- zastosować nczasy.

Uriel
źródło
3

Haskell , 73 bajty

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

Wypróbuj online! Zero indeksowane.

Wyjaśnienie

Pomocnicze:

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

Główna funkcja:

(                                 !!) -- 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
źródło
2

Galaretka , 13 11 bajtów

R²DµṪẇF
Ç#Ṫ

Wypróbuj online!

Alternatywnie jest to 10-bajtowe rozwiązanie, które drukuje npierwsze wartości sekwencji: Wypróbuj online!

użytkownik202729
źródło
lol pobiłeś mnie do tego; Miałem dokładnie to samo co twoje rozwiązanie (po
grze w
@HyperNeutrino Niestety, wydaje się, że się myli.
user202729,
Naprawdę? To niefortunne :( edit oh dobrze za nfindthingy: (((
HyperNeutrino
@HyperNeutrino Nie ma problemu, czytanie ze stdin działa.
user202729,
2

Python 2 , 62 61 bajtów

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

Wypróbuj online!

ovs
źródło
2

Galaretka , 11 bajtów

Ḷ²DFɓ²ẇ
Ç#Ṫ

Wypróbuj online!

Alternatywa dla rozwiązania user202729 .

Jak to działa

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 ^^^?
Pan Xcoder
źródło
Wow, ma automatyczną strunizację.
user202729,
2

Alice , 32 bajty

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

Wypróbuj online!

Marnotrawstwo układu tego odcinka trybu porządkowego naprawdę mnie wkurza, ale wszystko, co próbuję zapisać tam kilka bajtów, pojawia się dłużej ...

Wyjaśnienie

/
\io/...@...

Po prostu zwykła platforma dziesiętna we / wy, z pozycjami oi @nieco nietypowymi. Mięsem programu jest to:

&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
źródło
Nie znam tego języka, ale czy możesz zapisać jakieś bajty, sprawdzając, czy bieżący kwadrat znajduje się w ciągu przed dodaniem go?
WGroleau
@WGroleau Nie sądzę. Główna kontrola to wciąż jeden bajt ( Fzamiast z), ale manipulacja stosem nie będzie prostsza, być może nawet jedno lub dwa polecenia gorsze.
Martin Ender,
@JamesHolderness Dlaczego nie? 69696 pojawia się dwie pozycje przed swoją naturalną pozycją (pokrywającą się z nią). Jeśli nakładanie się na jego naturalną pozycję powinno zostać pominięte, prawdopodobnie powinieneś to powiedzieć w wyzwaniu.
Martin Ender,
@JamesHolderness sprawdzanie odpowiednich przypadków testowych trwało zbyt długo, więc właśnie zrobiłem do 10. Pośredni przypadek testowy powinien pomóc.
Martin Ender,
To zdecydowanie zwiększa wyzwanie. Czy skomentujesz poprzednie odpowiedzi, które zawiodą w ten sam sposób? Uwaga: Uważam je za zabawne, ale nigdy nie odpowiadam, ponieważ wszystkie moje języki zostały zaprojektowane z myślą o czytelności jako wymogu. :-) Z wyjątkiem asemblera i FORTH. :-)
WGroleau
1

Łuska , 13 bajtów

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

Wypróbuj online!

Wyjaśnienie

Druga linia to funkcja pomocnicza, która podaje nam cyfry dziesiętne kwadratu liczbowego:

 □    Square.
d     Base-10 digits.

Możemy wywołać tę funkcję w głównym programie za pomocą .

!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
źródło
1

Kotlin , 79 bajtów

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

Wypróbuj online!

ovs
źródło
1

Wolfram Language (Mathematica) , 75 bajtów

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

Wypróbuj online!

Jak to działa

nutrzymuje liczbę znalezionych wczesnych ptaków, kostatnią sprawdzoną liczbę, sciąg "1491625...". Chociaż njest zbyt mały, jeśli szawiera następny kwadrat, znaleziono innego wczesnego ptaka, więc zwiększamy n. W każdym razie przedłużamy s.

Gdy ndotrze do wejścia #, wracamy k, ostatni sprawdzany numer, a zatem ostatni znaleziony wczesny ptak.

Na moim laptopie obliczenie 53. kadencji sekwencji zajmuje około 53 sekund.

Misza Ławrow
źródło
1

REXX , 66 bajtów

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

Wypróbuj online!

idrougge
źródło
1

Bash, 76 69 bajtów

Załóżmy, że npodano w zmiennej (tj n=10 foo.sh.). Wykorzystuje pakiet grep. Każda wartość środkowa jest wyprowadzana (jeśli dozwolone, -3 bajty).

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

Jak to działa?

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
źródło
@James Tutaj idzie.
iBug,