ลำดับของตัวเลขที่มีอยู่ในตัวเอง


22

ลองกำหนดตัวเลขที่มีอยู่ในตัวเองเป็นจำนวนเต็มบวกซึ่งตัวเลขจะปรากฏเป็นจำนวนความยาวเท่ากับตัวเองเท่านั้น ในคำอื่น ๆ ใด ๆ ทศนิยมหลักd (ไม่รวม0 ) เกิดขึ้นเฉพาะในการทำงานของความยาวตรงd

งาน

คุณสามารถเลือกหนึ่งในสามวิธีที่แสดงด้านล่าง:

  • รับจำนวนเต็มnส่งออกตัวเลขที่มีอยู่ในตัวของn th (0 หรือ 1-indexed)
  • รับจำนวนเต็มnส่งออกตัวเลขn ที่มีอยู่ในตัวแรก
  • พิมพ์ลำดับไปเรื่อย ๆ

ตัวอย่าง

  • 133322เป็นตัวเลขที่อยู่ในตัวเองเพราะ3ปรากฏขึ้นในระยะสาม3 's, 1คือเดียวและ2เกิดขึ้นในการทำงานของทั้งสอง2 ' s

  • ในทางกลับกัน35553355ไม่ใช่เพราะแม้ว่า5และ3เกิดขึ้นห้าและสามครั้งตามลำดับพวกเขาไม่ได้เรียกใช้ตัวเลขที่อยู่ติดกัน

  • 44422ไม่ได้อยู่ในตัวเองเพราะ4เกิดขึ้นเพียงสามครั้ง

  • 12222333ไม่ได้เป็นอย่างใดอย่างหนึ่งเพราะ2ปรากฏขึ้นในระยะสี่2 's และไม่สามารถจะถือว่าเป็นสองวิ่งแยกจากกันของทั้งสอง2 ' s

ไม่น่าแปลกใจนี่คือOEIS A140057และคำศัพท์สองสามคำแรกคือ:

1, 22, 122, 221, 333, 1221, 1333, 3331, 4444, 13331, 14444, 22122, 22333, 33322, 44441, 55555, 122122, 122333, 133322, 144441, 155555

คุณสามารถนำเข้าและส่งออกผ่านวิธีการมาตรฐานใดๆ ในภาษาการเขียนโปรแกรมใด ๆในขณะที่สังเกตว่าช่องโหว่เหล่านี้ถูกห้ามโดยค่าเริ่มต้น นี่คือรหัสกอล์ฟดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ (ทุกภาษา) จะเป็นผู้ชนะ

คำตอบ:


8

Python 2 , 104 94 83 ไบต์

-10 ไบต์ขอบคุณ Mr. Xcoder
-11 ไบต์ขอบคุณ Jonathan Allan

i=0
while 1:
 if`i`==''.join(d*int(d)for c,d in zip(`-i`,`i`)if d!=c):print i
 i+=1

ลองออนไลน์!


... อันที่จริงแล้วเป็นที่ยอมรับได้เนื่องจากมันจะล้มลงนานiสักครั้ง ? อาจจำเป็นต้องใช้str (ฉันไม่เคยแน่ใจในสิ่งเหล่านี้จริงๆ)
Jonathan Allan

1
@JanathanAllan เป็นคำถามที่น่าสนใจ โดยทั่วไปเราได้รับอนุญาตให้สมมติว่ามันอยู่ในประเภทจำนวนเต็มมาตรฐานไม่นานแต่ Python ไม่ได้ทำให้ความแตกต่างนี้ชัดเจนมาก ...
FlipTack

6

Mathematica, 66 ไบต์

พิมพ์ลำดับไปเรื่อย ๆ

Do[##&&Print@t&@@(#==Tr[1^{##}]&@@@Split@IntegerDigits@t),{t,∞}]

ลองออนไลน์!

ใน TIO คุณจะต้องยุติการดำเนินการเพื่อที่จะเห็นผลลัพธ์ แต่ใน Mathematica ก็ใช้งานได้ดี

-12 ไบต์จาก Martin Ender


6

05AB1E , 9 ไบต์

ส่งคืนคำที่ n ของลำดับซึ่งจัดทำดัชนี 1 รายการ

µNÔNγ€gJQ

ลองออนไลน์!

คำอธิบาย

µ           # loop over increasing N until counter equals input
 NÔ         # push N with consecutive equal elements deduplicated
   Nγ       # push N grouped into runs of consecutive equal elements
     €g     # get the length of each run
       J    # join to a number
        Q   # check for equality
            # if true, implicitly increment counter

แหล่งที่มาของแรงบันดาลใจที่เป็นไปได้จากวิธี 10 ไบต์ของฉัน:µNγD€gs€ÙQ
Mr. Xcoder

6

JavaScript (ES6), 76 71 68 ไบต์

ส่งคืนคำศัพท์n-thของลำดับ 0-indexed

f=(n,k)=>+(k+'').replace(/(.)\1*/g,s=>s.length^s[0])||n--?f(n,-~k):k

หมายเหตุ : เช่นเดียวกับฟังก์ชั่นแบบเรียกซ้ำช่วงอินพุตจะขึ้นอยู่กับการสนับสนุนการปรับแต่งเสียงการโทรและขนาดสแต็คของเครื่องยนต์ของคุณ

การสาธิต


Alt รุ่น 65 ไบต์

ไม่ต้องป้อนข้อมูลและพิมพ์ผลลัพธ์ด้วยalert()ทีละรายการ

f=k=>f(-~k,+(k+'').replace(/(.)\1*/g,s=>s.length^s[0])||alert(k))

ลองออนไลน์! (หยุดทันทีที่เกินขนาดสแต็กสูงสุด)



2

CJam , 20 ไบต์

1{_Abe`::=:*{_p}&)}h

ลองออนไลน์!

คำอธิบาย:

1                       push 1
 {                }h    while TOS is truthy (i.e. forever):            example iteration: 14444
  _                       duplicate                                                       14444 14444       
   Ab                     convert to base 10 (get decimal digits)                         14444 [1 4 4 4 4]
     e`                   run-length encode (array of two-element arrays)                 14444 [[1 1] [4 4]]
       :                  map over the array:
        :                   fold between the two array elements with:
         =                    equality                                                    14444 [1 1]
          :               fold between the array elements with:
           *                multiplication (a.k.a. logical AND for 1 or 0)                14444 1
            {  }&         if this yields a result of 1:
             _              duplicate the number and                                      14444 14444
              p             print it                                                      14444 (output 14444)
                 )        increment the number                                            14445

2

Haskell , 70 ไบต์

import Data.List
filter(all(\s->read[s!!0]==length s).group.show)[1..]

1
คุณสามารถวางชั้นนำx=ตามเรากฎการเล่นกอล์ฟ
Laikoni

2

Brachylogขนาด 10 ไบต์

≜ℕẹḅ⟨l=h⟩ᵐ

ลองออนไลน์!

สร้างองค์ประกอบของลำดับอย่างไม่สิ้นสุดผ่านตัวแปรอินพุต (หากจำเป็นต้องทำการพิมพ์จริง ๆ ให้ผนวก&ẉ⊥) นี่คือรหัสหลักในการแก้ปัญหาการสอดคล้องกันโดยมีการเตรียมการเพื่อแก้ไขปัญหาที่เล็กที่สุดก่อน:

        ᵐ    For every
  ḅ          run of
 ẹ           digits in
             the input variable
ℕ            (which is a non-negative integer),
   ⟨l  ⟩     its length
   ⟨  h⟩     and its first element
   ⟨ = ⟩     are equal.

ฉันคาดว่าสิ่งนี้จะใช้เวลาเพียง 9 ไบต์ แต่ดูเหมือนจะต้องมีความชัดเจนในการแยกตัวเลขของตัวเลขในการทำงาน


1

JavaScript 4, 83 80 ไบต์

for(i=0;;)+(++i+'').replace(/(.)\1*/g,function(x,y){return y^x.length})||alert(i)

for(i=0;i<1000;)+(++i+'').replace(/(.)\1*/g,function(x,y){return y^x.length})||alert(i)


"Javascript 1" หรือไม่ มีชื่อภาษาเช่นนี้หรือไม่?
user202729

ฉันหมายถึงมันใช้งานได้ตั้งแต่ JavaScript ปรากฏขึ้นไม่แน่ใจว่าชื่อนั้นเป็น correwct หรือไม่
l4m2

ขออภัยดูเหมือนว่าจะไม่ทำงานใน js1 ฉันอ่านและพบว่าไม่มีการแทนที่
l4m2


1

R , 56 ไบต์

function(n)all((r=rle(el(strsplit(c(n,''),''))))$l==r$v)

ลองออนไลน์!

ใช้การเข้ารหัสการรันความยาวกับหมายเลขที่แบ่ง ผลตอบแทนจริงถ้าความยาวทั้งหมดเท่ากับค่า

หมายเหตุ: ฉันโหลดmethodsห้องสมุดใน TIO เพื่อelไปทำงาน


1

Stax , 10 ไบต์

Ç≡∟Öz≈¢αV¢

เรียกใช้และแก้ไขข้อบกพร่อง

โปรแกรมนี้จะกรองจำนวนเต็มบวกทั้งหมดด้วยตัวกรอง ตัวเลขถูกเข้ารหัสความยาววิ่ง สำหรับการวิ่งแต่ละครั้งตัวเลขจะต้องเท่ากับความยาวการวิ่ง




0

Java 10, 121 ไบต์

แลมบ์ดาจากไปint intฟังก์ชั่นรับดัชนีnและส่งกลับค่าลำดับที่n (1 ดัชนี)

n->{int x=0,m=1;for(;n>0;n-=m,m=1)for(var p:(++x+"").split("(?<=(.))(?!\\1)"))m=p.length()==p.charAt(0)-48?m:0;return x;}

ลองใช้ออนไลน์

Ungolfed

n -> {
    int x = 0, m = 1;
    for (; n > 0; n -= m, m = 1)
        for (var p : (++x + "").split("(?<=(.))(?!\\1)"))
            m = p.length() == p.charAt(0) - 48 ? m : 0;
    return x;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.