Квадратів "Рання птах"


15

Визначення

Якщо взяти послідовність натуральних цілих квадратів і об'єднати їх у рядок цифр (тобто 149162536496481100...), квадрат "ранньої птиці" - це той, який може бути знайдений у цьому рядку перед його природним положенням.

Наприклад, 7 2 (число 49) можна знайти при зміщенні 2 у рядку, хоча природне положення знаходиться при зміщенні 10. Таким чином, 7 є першим квадратом "ранньої птиці".

Зауважте, що для того, щоб він вважався квадратом "ранньої пташки", всі цифри на площі повинні відбуватися до початку природного положення. Матч, який частково перекриває природне положення, не враховується.

a(n)є n-м додатним цілим числом k таким, що k 2 - квадрат "ранньої птиці".

Завдання

Дано додатне ціле число n, виведіть a(n).

Ви можете використовувати індексацію на основі 1 або 0, але якщо ви використовуєте індексацію на основі 0, будь ласка, скажіть це у своїй відповіді.

Ви повинні вирішити, як мінімум, настільки ж високо a(53)(або якщо ви використовуєте 0-індексацію, a(52)).

Тестові шафи

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

Список літератури


Чи використовується таблиця тестових випадків із базою 0 або 1?
idrougge

1
Чи nможна прийняти виведення перших елементів послідовності? Це залежить від ОП, але багато людей вирішують це дозволити.
HyperNeutrino

Тестові випадки @idrougge базуються на 1 основі.
Джеймс Холдернесс

@HyperNeutrino Я вважаю за краще мати послідовний набір результатів для всіх відповідей, тому, будь ласка, поверніть єдине значення a(n).
Джеймс Холдернесс

Відповіді:


5

05AB1E , 10 9 байт

Збережено 1 байт завдяки Аднану .

µNL<nJNnå

Спробуйте в Інтернеті!

Пояснення

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

Ви можете пропустити те ½, що автоматично буде додано до циклу, якщо його немає.
Аднан

@Adnan: Правда. Помітив це виклик перед тим, як я стрибнув на поїзді (або збирався, якщо його не затримали), тому я цілком пропустив це. Дякую :)
Emigna

7

JavaScript (ES6), 51 49 45 байт

1-індексований.

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

Демо

Відформатовано та прокоментовано

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

Нерекурсивна версія, 53 байти

Цей показник не залежить від розміру вашого двигуна.

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

Спробуйте в Інтернеті!


6

Pyth , 12 байт

e.f/jk^R2Z`*

Спробуйте тут!

Як це працює

ef / jk ^ R2Z` * ~ Повна програма. Нехай Q - наш внесок.

 .f ~ Перші Q додатні цілі числа з результатами трити. Використовує змінну Z.
      ^ R2Z ~ Квадрат кожне ціле число в діапазоні [0, Z).
    jk ~ Об'єднайте в один рядок.
   / ~ Порахуйте кількість випадків ...
          `* ~ Рядок представлення Z у квадраті.
               Врожайність 0, якщо хибна, і ≥ 1, якщо правда.
e ~ Отримайте останній елемент (ціле ціле число truthy). Висновок неявно.


4

APL (Dyalog) , 53 42 байти

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

Спробуйте в Інтернеті!

Як?

- виявити події

⍕×⍨⍵+1- закреслений квадрат x+1у

⍕×⍨⍳⍵ - строгований діапазон квадратів x

' '~⍨ - без пробілів

+/ - сума

0<- якщо сума позитивна (події існують), вона повертається x+1, інакше,

∇⍵+1- рецидивувати с x+1.

⍣⍵- застосовувати nрази.


3

Haskell , 73 байти

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

Спробуйте в Інтернеті! Нульова індексація.

Пояснення

Допоміжні товари:

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

Основна функція:

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

Желе , 13 11 байт

R²DµṪẇF
Ç#Ṫ

Спробуйте в Інтернеті!

Крім того, це рішення на 10 байт, яке друкує nперші значення послідовності: Спробуйте це в Інтернеті!


хай ти побив мене до цього; У мене було точно так само, як у вашому рішенні (після гольфу): P
HyperNeutrino

@HyperNeutrino На жаль, на жаль, помиляється.
користувач202729

О, справді? Це прикро :( редагувати о nfind
правді, що

@HyperNeutrino Немає проблем, читаючи з stdin творів.
користувач202729


2

Желе , 11 байт

Ḷ²DFɓ²ẇ
Ç#Ṫ

Спробуйте в Інтернеті!

Альтернатива рішенню user202729 .

Як це працює

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

Нічого собі, має автоматичну строфікацію.
користувач202729

2

Аліса , 32 байти

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

Спробуйте в Інтернеті!

Марнотратне розташування цього відрізка звичайного режиму нас справді клопоче, але все, що я намагаюсь зберегти кілька байт, виходить довше ...

Пояснення

/
\io/...@...

Просто звичайна рамка вводу / виводу з десятковим числом, з положеннями в oі @злегка незвичними. М'ясо програми:

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

Я не знаю цієї мови, але чи можете ви зберегти будь-які байти, перевіривши, чи є поточний квадрат у рядку перед його додаванням?
WGroleau

@WGroleau Я так не думаю. Основна перевірка - це ще один байт ( Fзамість z), але маніпуляція зі стеком не буде простішою, можливо, навіть на одну-дві команди гіршими.
Мартін Ендер

@JamesHolderness Чому це не слід? 69696 з'являється дві позиції перед його природним положенням (перекриття з ним). Якщо перекриття з його природним становищем слід ігнорувати, ви, ймовірно, повинні сказати це у виклику.
Мартін Ендер

@JamesHolderness відповідні тестові справи займали занадто багато часу, щоб перевірити, тому я просто зробив до 10. Проміжний тестовий випадок повинен допомогти.
Мартін Ендер

Це, безумовно, збільшує виклик. Чи коментуватимете попередні відповіді, які провалюються однаково? Примітка. Мені це здається цікавим, але ніколи не відповідаю, оскільки всі мої мови були розроблені з легкістю для читання. :-) За винятком асемблера та FORTH. :-)
WGroleau

1

Лушпиння , 13 байт

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

Спробуйте в Інтернеті!

Пояснення

Другий рядок - це допоміжна функція, яка дає нам десяткові цифри квадрата числа:

 □    Square.
d     Base-10 digits.

Ми можемо викликати цю функцію в основній програмі, використовуючи .

!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

Мова Вольфрама (Mathematica) , 75 байт

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

Спробуйте в Інтернеті!

Як це працює

nзберігає кількість знайдених ранніх птахів, kостання перевірена цифра, sрядок "1491625...". Хоча nце занадто мало, якщо sміститься наступний квадрат, інший ранній птах був знайдений, тому ми зростаємо n. У будь-якому випадку, ми продовжуємо s.

Як тільки nдосягнемо входу #, ми повернемосьk , останнє число перевірено, і тому останній знайдений ранній птах.

На моєму ноутбуці для обчислення 53-го терміну послідовності потрібно близько 53 секунд.



1

Баш, 76 69 байт

Припустимо n, дається в змінну (тобто n=10 foo.sh). Використовує пакет grep. Будь-яке середнє значення виводиться (якщо це дозволено, -3 байти).

while((n));do((b=++a*a));grep -q $b<<<$s&&((n--));s=$s$b;done;echo $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

@James Ось це йде.
iBug
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.