“ นกยุคแรก” กำลังสอง


15

คำนิยาม

หากคุณนำลำดับของจำนวนเต็มบวกจำนวนหนึ่งมาเรียงต่อกันเป็นสตริงตัวเลข (เช่น149162536496481100...) สี่เหลี่ยม "Early Bird" คือสิ่งที่สามารถพบได้ในสตริงนี้ก่อนตำแหน่งธรรมชาติ

ตัวอย่างเช่น 7 2 (ตัวเลข49) สามารถพบได้ที่ออฟเซ็ต 2 ในสตริงแม้ว่าตำแหน่งตามธรรมชาติจะอยู่ที่ออฟเซ็ต 10 ดังนั้น 7 จึงเป็นสแควร์ "Early Bird" แรก

โปรดทราบว่าเพื่อให้ได้รับการพิจารณาว่าเป็น "นกต้น" จัตุรัสตัวเลขทั้งหมดในตารางจะต้องเกิดขึ้นก่อนที่จะเริ่มตำแหน่งธรรมชาติ การแข่งขันที่ทับซ้อนตำแหน่งธรรมชาติบางส่วนจะไม่นับ

a(n)เป็นจำนวนเต็มบวกที่ n เช่น k 2ซึ่งเป็นจตุรัส "Early Bird"

งาน

ป.ร. ให้ไว้เป็นจำนวนเต็มบวกเอาท์พุทna(n)

คุณสามารถใช้การจัดทำดัชนีแบบ 1 หรือ 0 แต่ถ้าคุณใช้การจัดทำดัชนีแบบ 0 โปรดพูดในคำตอบของคุณ

โซลูชันของคุณควรจะสามารถจัดการอย่างน้อยสูงถึงa(53)(หรือถ้าคุณใช้การจัดทำดัชนีแบบ 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

อ้างอิง


ตารางกรณีทดสอบใช้ฐาน 0 หรือ 1 หรือไม่
idrougge

1
สามารถส่งออกnองค์ประกอบแรกของลำดับได้หรือไม่ มันขึ้นอยู่กับ OP แต่หลายคนเลือกที่จะอนุญาต
HyperNeutrino

@idrougge กรณีทดสอบเป็นแบบ 1
James Holderness

@HyperNeutrino a(n)ฉันชอบที่จะมีชุดที่สอดคล้องกันของผลการค้นหาสำหรับคำตอบทั้งหมดดังนั้นโปรดเพียงแค่กลับค่าเดียวของ
James Holderness

คำตอบ:


5

05AB1E , 10 9 ไบต์

ที่บันทึกไว้ 1 ไบต์ขอบคุณที่Adnan

µ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

@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 ~ รับองค์ประกอบสุดท้าย (จำนวนเต็ม Qth ความจริง) ผลผลิตโดยปริยาย


4

APL (Dyalog) , 53 42 ไบต์

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

ลองออนไลน์!

อย่างไร?

- ค้นหาสิ่งที่เกิดขึ้น

⍕×⍨⍵+1- ตารางที่ทำให้เป็นสตริงของx+1ใน

⍕×⍨⍳⍵ - ช่วงของสี่เหลี่ยมจัตุรัส x

' '~⍨ - ไม่มีช่องว่าง

+/ - ผลรวม

0<- ถ้าผลรวมเป็นค่าบวก (มีอยู่) จะส่งกลับx+1มิฉะนั้น

∇⍵+1- recurse x+1กับ

⍣⍵- ใช้nครั้ง


3

Haskell , 73 ไบต์

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

ลองออนไลน์!ศูนย์การจัดทำดัชนี

คำอธิบาย

Auxiliaries:

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

@HperperNeutrino ดูเหมือนว่าจะผิด แต่น่าเสียดายที่
user202729

จริงๆเหรอ? นั่นเป็นโชคร้าย :( แก้ไขโอ้ถูกต้องสิ่งที่nfind: (((
HyperNeutrino

@HyperNeutrino ไม่มีปัญหาการอ่านจาก stdin ใช้งานได้
user202729


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

ว้าวมีการทำให้เป็นสตริงโดยอัตโนมัติ
user202729

2

อลิซ 32 ไบต์

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

ลองออนไลน์!

เลย์เอาต์ที่สิ้นเปลืองของโหมด Ordinal ที่ยืดเยื้อนั้นจริง ๆ แล้วฉันกำลังดักฟังทุกอย่าง แต่ทุกอย่างที่ฉันพยายามที่จะบันทึกไบต์ที่มีมานานกว่านั้น ...

คำอธิบาย

/
\io/...@...

เพียงแค่กรอบ I / O ทศนิยมปกติพร้อมกับ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) แต่การจัดการสแต็กจะไม่ง่ายกว่าอาจเป็นไปได้แม้แต่คำสั่งหนึ่งหรือสองคำที่แย่กว่านั้น
Martin Ender

@ JamesHolderness ทำไมถึงไม่ควร? 69696 ปรากฏสองตำแหน่งก่อนตำแหน่งธรรมชาติ (ซ้อนทับกัน) หากทับซ้อนกับตำแหน่งตามธรรมชาติของมันควรจะถูกเพิกเฉยคุณควรพูดในสิ่งที่ท้าทาย
Martin Ender

@JamesHolderness กรณีทดสอบที่เกี่ยวข้องนั้นใช้เวลาในการตรวจสอบนานเกินไปดังนั้นฉันเพิ่งทำไม่เกิน 10 กรณีทดสอบขั้นกลางจะช่วยได้
Martin Ender

นั่นเป็นการเพิ่มความท้าทายอย่างแน่นอน คุณจะแสดงความคิดเห็นคำตอบก่อนหน้านี้ที่ล้มเหลวในลักษณะเดียวกัน? หมายเหตุ: ฉันพบว่าความบันเทิงเหล่านี้ แต่ไม่เคยตอบเพราะทุกภาษาของฉันได้รับการออกแบบให้อ่านง่ายเป็นข้อกำหนด :-) ยกเว้นแอสเซมเบลอร์และ FORTH :-)
WGroleau

1

Husk , 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

ภาษา Wolfram (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

Bash, 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.