Number ใน Number-squared


13

พิจารณาลำดับของจำนวนธรรมชาติที่ N ปรากฏเป็นสตริงย่อยใน N ^ 2 A018834

เอาท์พุทnองค์ประกอบ th ของลำดับนี้

กฎระเบียบ

โปรแกรมใช้เวลาเพียงnเป็น input และผลเพียงจำนวนหนึ่ง N-

ลำดับสามารถเป็นดัชนี 0 หรือดัชนี 1

Sequence: 1 5 6 10 25 50 60 76 100 250 376 500 600 625 760 ...
Squares:  1 25 36 100 625 2500 3600 5776 10000 62500 141376 250000 360000 390625 577600 ...

นี่คือรหัส - กอล์ฟเพื่อให้ได้รหัสที่สั้นที่สุด


1
การใช้งานจำนวนมากจะประสบปัญหา (สำหรับฉันมันไม่สามารถสร้างอาร์เรย์ที่มีค่ามากกว่า 2 ^ 32) ซึ่งจะทำให้การแก้ปัญหาส่วนใหญ่มีขนาดสูงสุดโดยค่าเริ่มต้น โซลูชันเหล่านี้ควรถูกตัดสิทธิ์หรือไม่
maxb

1
@maxb ผมคิดว่าในทางทฤษฎีก็หมายความว่าเป็นไม่จำเป็นต้องเป็นจริง
Arnauld

1
@Ourous ฉันรู้ว่ามันต่ำจริงๆนั่นคือเหตุผลที่ฉันไม่ชอบวิธีแก้ปัญหาของฉัน ฉันสามารถเพิ่มไบต์และใช้งานได้กับอินพุตที่ใหญ่กว่ามากดังนั้นฉันจะเพิ่มสิ่งนั้นเป็นทางเลือก
maxb

1
"N ปรากฏใน N ^ 2" น่าจะใช้คำดีกว่าเช่น "ตัวเลขทศนิยมของ N คือสตริงย่อย [ต่อเนื่อง] ของตัวเลขทศนิยมของ N กำลังสอง" (11 ไม่ "ปรากฏใน" 121) [อย่างเคร่งครัด "ต่อเนื่อง" ซ้ำซ้อน แต่เพิ่มชัดเจน]
Jonathan Allan

1
@JonathanAllan แนะนำการอ้างอิงใหม่อีกครั้ง: "N มีการแสดงพจนานุกรมใน N ^ 2"
Οurous

คำตอบ:


4

05AB1E , 6 ไบต์

1 การจัดทำดัชนี

µNNnNå

ลองออนไลน์!

คำอธิบาย

µ         # loop over increasing N until counter equals input
 N        # push N (for the output)
  Nn      # push N^2
    N     # push N
     å    # push N in N^2
          # if true, increase counter

ว่าµคำสั่งเป็นเพียงแค่ ... ฉันต้องการฉันมีที่
maxb

@ max: มันค่อนข้างใช้งานได้จริงสำหรับความท้าทายที่คุณต้องการค้นหาNthหมายเลขที่ตรงตามเงื่อนไขเฉพาะ
Emigna

" ถ้าเป็นจริงเพิ่มตัวนับ"
Jonathan Allan

@JonathanAllan: เช่นเดียวกับใน "ถ้ามี N อยู่ใน N ^ 2 จะเพิ่มมูลค่าของตัวนับ 1" ฉันน่าจะเขียน "ตัวนับเพิ่ม"
Emigna

จริง ๆ แล้วฉันไม่เข้าใจคำอธิบาย ปรากฏว่าถ้าåผลตอบแทนจริงแล้วเรามีกระแสNที่ด้านบนสุดของสแต็ก (ตัวเพิ่มและตัวนับเพิ่มN) แต่ถ้าไม่ใช่เราจะดำเนินต่อNไป อาจใช้สิ่งอื่นที่ไม่ใช่ " N" เนื่องจากเป็นผลลัพธ์สุดท้ายในเนื้อหาคำถาม: p
Jonathan Allan



3

MathGolf , 8 ไบต์ (ใช้ได้กับทุกอินพุตในทางทฤษฎี แต่ใช้n<10ในทางปฏิบัติเท่านั้น)

úrgɲï╧§

ลองออนไลน์!

ทางเลือก (ทำงานเพื่อn<49การปฏิบัติและทฤษฎี)

►rgɲï╧§

ข้อแตกต่างเพียงอย่างเดียวคือแทนที่จะสร้างรายการที่มี10^(input)ค่าฉันสร้างรายการด้วย10^6รายการ การดำเนินการนี้ใช้เวลาสักครู่ดังนั้นคุณสามารถสลับไบต์แรกเป็นตัวอักษร 1 ไบต์อื่น ๆ เพื่อทดสอบ

คำอธิบาย

ú          pop(a), push(10**a)
 r         range(0, n)
  g        filter array by...
   É       start block of length 3
    ²      pop a : push(a*a)
     ï     index of current loop
      ╧    pop a, b, a.contains(b)
           Block ends here
       §   get from array

เหตุผลที่โซลูชันนี้ไม่จัดการอินพุตขนาดใหญ่คือฉันสังเกตว่าลำดับนั้นเติบโตน้อยกว่าเลขชี้กำลัง แต่มากกว่าพหุนามใด ๆ นั่นเป็นเหตุผลที่ฉันใช้10**nโอเปอเรเตอร์ (ฉันต้องการใช้2**nแต่มันล้มเหลวสำหรับอินพุต 1) นั่นหมายความว่าฉันสร้างอาเรย์ที่มีขนาดใหญ่มากถึงแม้จะเป็นอินพุตขนาดเล็กเพียงเพื่อกรองส่วนใหญ่ออกไปจากนั้นก็เลือกองค์ประกอบแรก มันสิ้นเปลืองอย่างมาก แต่ฉันไม่สามารถหาวิธีอื่นได้โดยไม่เพิ่มจำนวนไบต์




2

เยลลี่ขนาด 6 ไบต์

1ẇ²$#Ṫ

1 การจัดทำดัชนี

ลองออนไลน์!

อย่างไร?

พบครั้งแรกของลำดับเป็นรายการแล้วผลตอบแทนถัวเฉลี่ยหางnN

1ẇ²$#Ṫ - Link: integer, n (>0)
1      - initialise x to 1
    #  - collect the first n matches, incrementing x, where:
   $   -   last two links as a monad:
  ²    -     square x
 ẇ     -     is (x) a substring of (x²)?
       -     (implicitly gets digits for both left & right arguments when integers)
     Ṫ - tail

หาก0ได้รับการพิจารณาว่าเป็น Natural Number เราสามารถใช้ 1-indexed full-program ẇ²$#Ṫสำหรับ 5 ได้




2

Java 8, 66 65 63 ไบต์

n->{int r=0;for(;!(++r*r+"").contains(r+"")||--n>0;);return r;}

-1 ขอบคุณไบต์@Shaggy
-2 ไบต์ขอบคุณที่@Arnauld

1 การจัดทำดัชนี

ลองออนไลน์

คำอธิบาย:

n->{                // Method with integer as both parameter and return-type
  int r=0;          //  Result-integer, starting at 0
  for(;             //  Loop as long as:
       !(++r*r+"")  //    (increase result `r` by 1 first with `++r`)
                    //    If the square of the result `r` (as String) 
        .contains(  //    does not contain
          r+"")||   //    the result `r` itself (as String):
       --n>0;);     //     (decrease input `n` by 1 first with `--n`)
                    //     And continue looping if input `n` is not 0 yet
  return r;}        //  Return the result `r`


1
@Shaggy Ah แน่นอน ขอบคุณ!
Kevin Cruijssen

1
@Arnauld Ah, วิธีที่ชาญฉลาดของการรวมวงและถ้า! ขอบคุณ
Kevin Cruijssen

2

Clojure , 81 ไบต์

(fn[n](nth(filter #(clojure.string/includes?(str(* % %))(str %))(range))n))

ลองออนไลน์! (น่าเสียดายที่ TIO ดูเหมือนจะไม่สนับสนุนไลบรารีสตริงมาตรฐานของ Clojure)

หาก Clojure มีไวยากรณ์การนำเข้าที่สั้นกว่าหรือมีincludes?วิธีการในไลบรารีหลักสิ่งนี้อาจแข่งขันได้จริง clojure.string/includes?เพียงอย่างเดียวมีความยาวมากกว่าคำตอบที่นี่แม้ว่า: /

(defn nth-sq-subs [n]
  (-> ; Filter from an infinite range of numbers the ones where the square of
      ;  the number contains the number itself
    (filter #(clojure.string/includes? (str (* % %)) (str %))
            (range))

    ; Then grab the "nth" result. Inc(rementing) n so 0 is skipped, since apparently
    ;  that isn't in the sequence
    (nth (inc n))))

เนื่องจากลิงก์ TIO ใช้งานไม่ได้นี่คือการทดสอบ หมายเลขด้านซ้ายคือดัชนี ( n) และผลลัพธ์ ( N) อยู่ทางขวา:

(mapv #(vector % (nth-sq-subs %)) (range 100))
=>
[[0 1]
 [1 5]
 [2 6]
 [3 10]
 [4 25]
 [5 50]
 [6 60]
 [7 76]
 [8 100]
 [9 250]
 [10 376]
 [11 500]
 [12 600]
 [13 625]
 [14 760]
 [15 1000]
 [16 2500]
 [17 3760]
 [18 3792]
 [19 5000]
 [20 6000]
 [21 6250]
 [22 7600]
 [23 9376]
 [24 10000]
 [25 14651]
 [26 25000]
 [27 37600]
 [28 50000]
 [29 60000]
 [30 62500]
 [31 76000]
 [32 90625]
 [33 93760]
 [34 100000]
 [35 109376]
 [36 250000]
 [37 376000]
 [38 495475]
 [39 500000]
 [40 505025]
 [41 600000]
 [42 625000]
 [43 760000]
 [44 890625]
 [45 906250]
 [46 937600]
 [47 971582]
 [48 1000000]
 [49 1093760]
 [50 1713526]
 [51 2500000]
 [52 2890625]
 [53 3760000]
 [54 4115964]
 [55 5000000]
 [56 5050250]
 [57 5133355]
 [58 6000000]
 [59 6250000]
 [60 6933808]
 [61 7109376]
 [62 7600000]
 [63 8906250]
 [64 9062500]
 [65 9376000]
 [66 10000000]
 [67 10050125]
 [68 10937600]
 [69 12890625]
 [70 25000000]
 [71 28906250]
 [72 37600000]
 [73 48588526]
 [74 50000000]
 [75 50050025]
 [76 60000000]
 [77 62500000]
 [78 66952741]
 [79 71093760]
 [80 76000000]
 [81 87109376]
 [82 88027284]
 [83 88819024]
 [84 89062500]
 [85 90625000]
 [86 93760000]
 [87 100000000]
 [88 105124922]
 [89 109376000]
 [90 128906250]
 [91 146509717]
 [92 177656344]
 [93 200500625]
 [94 212890625]
 [95 250000000]
 [96 250050005]
 [97 289062500]
 [98 370156212]
 [99 376000000]]

สิ่งนี้จะสามารถสนับสนุนค่าใด ๆ ของn; ให้คุณยินดีที่จะรอให้เสร็จ (หาจำนวนเต็มที่ 50 ถึง 100 ในลำดับใช้เวลา 15 นาที) Clojure รองรับเลขคณิตจำนวนเต็มขนาดใหญ่โดยพลการดังนั้นเมื่อตัวเลขเริ่มมีขนาดใหญ่มันจะเริ่มใช้BigInts


1

ถ่าน 25 ไบต์

Nθ≔¹ηWθ«≦⊕η¿№I×ηηIη≦⊖θ»Iη

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด 0 การจัดทำดัชนี คำอธิบาย:

Nθ

nอินพุต

≔¹η

เริ่มต้นNที่ 1 (หรือสิ่งนี้อาจเริ่มนับที่0จะทำให้อินพุต 1 ทำดัชนี)

Wθ«

ทำซ้ำจนกว่าเราจะพบnตัวเลขในลำดับ

≦⊕η

Nการเพิ่มขึ้น

¿№I×ηηIη

ถ้าN*NมีNแล้ว ...

≦⊖θ»

... nพร่อง

Iη

Nพิมพ์

ความพยายามของฉันในการเล่นกอล์ฟต่อไปนี้ถูกขัดขวางด้วยถ่าน) ที่ไม่ได้มีการif..thenยกเว้นในตอนท้ายของบล็อก (ซึ่งค่าใช้จ่าย 2 bytes) ข) ไม่ได้มีContainsผู้ประกอบการ (แปลงการส่งออกของFindหรือCountลงในแบบบูลที่ฉันสามารถลบออกจากnอีกครั้งค่าใช้จ่าย 2 ไบต์)


1

แก้ไข (ตอบกลับความคิดเห็น): Python 2, 76 ไบต์

อยากลองวิธีที่ไม่เกิดซ้ำ (ใหม่สำหรับการเล่นกอล์ฟเคล็ดลับใด ๆ จะดีมาก!)

def f(c,n=0):
    while 1:
        if`n`in`n*n`:
            if c<2:return n
            c-=1
        n+=1

ขอบคุณทั้ง BMO และ Vedant Kandoi!


2
คุณไม่จำเป็นต้องนับprint(f(13))ในรหัส นอกจากนี้ยังwhile 1:, if c==1:return n,c==1 can be c<2
Vedant Kandoi

Ah, ฉันไม่เห็นว่าคุณต้องการรุ่นที่ไม่ใช่แบบเรียกซ้ำ, nvm .. อย่างไรก็ตามตอนนี้ฉันนับ 76 ไบต์ไม่ 79
12:18

และคุณสามารถบันทึกอีกไม่กี่: ช่องว่างก่อนและหลังจากที่`มีความซ้ำซ้อนและหนึ่งหลังจากc<2:เกินไปต่อไปที่คุณสามารถผสมแท็บและช่องว่างสำหรับการเยื้อง (ดังแสดงที่นี่ ): 69 ไบต์ Btw ไม่จำเป็นต้องเก็บเวอร์ชันเก่าของคุณ (อยู่ในประวัติการแก้ไขสำหรับผู้ที่สนใจ) และทำไมไม่เชื่อมโยงไปยัง TIO (หรือคล้ายกัน) / ใช้แม่แบบจากที่นั่น?
ბიმო

1

Haskell, 60 ไบต์

([n^2|n<-[1..],elem(show n)$words=<<mapM(:" ")(show$n^2)]!!)

ลองออนไลน์!

      n<-[1..]              -- loop n through all numbers starting with 1
 [n^2|        ,    ]        -- collect the n^2 in a list where
     elem(show n)           -- the string representation of 'n' is in the list
       words ... (show$n^2) -- which is constructed as follows:

            show$n^2        -- turn n^2 into a string, i.e. a list of characters
          (:" ")            -- a point free functions that appends a space
                            -- to a character, e.g.  (:" ") '1' -> "1 "
        mapM                -- replace each char 'c' in the string (n^2) with
                            -- each char from (:" ") c and make a list of all
                            -- combinations thereof.
                            -- e.g. mapM (:" ") "123" -> ["123","12 ","1 3","1  "," 23"," 2 ","  3","   "]
      words=<<              -- split each element into words and flatten to a single list
                            -- example above -> ["123","12","1","3","1","23","2","3"]

(                      !!)  -- pick the element at the given index

1

Python 2 , 47 43 ไบต์

-4 ไบต์ขอบคุณเดนนิส (เพิ่ม 1 ไปยังการโทรแบบเรียกซ้ำแทนการส่งคืนn-1)

f=lambda c,n=1:c and-~f(c-(`n`in`n*n`),n+1)

ลองออนไลน์!

explantion / Ungolfed

c,nn1,2,3n in n2cc=0

# Enumerating elements of A018834 in reverse starting with 1
def f(counter, number=1):
    # Stop counting
    if counter == 0:
        return 0
    # Number is in A018834 -> count 1, decrement counter & continue
    elif `number` in `number ** 2`:
        return f(counter-1, number+1) + 1
    # Number is not in A018834 -> count 1, continue
    else:
        return f(counter, number+1) + 1



1

Lua , 137 123 79 ไบต์

-thanks @Jo King จำนวน 44 ไบต์

n=io.read()i=0j=0while(i-n<0)do j=j+1i=i+(n.find(j*j,j)and 1or 0)end
print(j*j)

ลองออนไลน์!


79 ไบต์ เคล็ดลับทั่วไปบางอย่าง; false/trueอาจเป็น0>1/ 0<1, วงเล็บไม่จำเป็นสำหรับifs และwhiles, คุณสามารถลบช่องว่างส่วนใหญ่หลังจากตัวเลข (แม้แต่การขึ้นบรรทัดใหม่)
Jo King


0

เรียบร้อย 24 ไบต์

{x:str(x)in'~.x^2}from N

ลองออนไลน์!

ส่งกลับรายการที่ขี้เกียจซึ่งเมื่อเรียกว่าเช่นฟังก์ชั่นจะส่งกลับnองค์ประกอบ th ในซีรีส์

คำอธิบาย

{x:str(x)in'~.x^2}from N
{x:              }from N       select all natural numbers `x` such that
   str(x)                      the string representation of `x`
         in                    is contained in
           '~.x^2              "~" + str(x^2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.