Kendi kendine yeten sayıların sırası


22

Kendi kendine yeten bir sayıyı, haneleri yalnızca kendilerine eşit uzunluktaki uzunluklarda görünen pozitif bir tamsayı olarak tanımlayalım . Başka bir deyişle, herhangi bir ondalık basamağı d ( 0 hariç ) yalnızca tam olarak d uzunluğunda çalışır .

Görev

Aşağıda listelenen üç yöntemden birini seçebilirsiniz:

  • Bir tamsayıdır verilen n , çıkış N inci (0 ya da 1 endeksli) kendi kendine yeten bir sayı.
  • N bir tamsayı verildiğinde , ilk n bağımsız sayıları verir.
  • Diziyi süresiz olarak yazdırın.

Örnekler

  • 133322 kendi kendine yeten bir sayıdır, çünkü 3 üç 3 ' lük bir çalışmada görünür , 1 tekdir ve 2 iki 2'lik bir çalışmada oluşur .

  • Öte yandan, 35553355 , 5 ve 3 sırasıyla beş ve üç kez meydana gelmesine rağmen , bitişik basamakların dizilerini oluşturmazlar.

  • 44422 kendi kendine yetmez , çünkü 4 sadece üç kez meydana gelir.

  • 12222333 , çünkü ya değildir 2 dört bir vadede görünür 2 's ve iki iki ayrı çalışma olarak kabul edilemez 2 s'.

Beklendiği gibi, bu OEIS A140057 ve ilk birkaç terimi:

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

Bu boşlukların varsayılan olarak yasak olduğunu not ederek, herhangi bir programlama dilinde standart yöntemlerden herhangi biri ile girdi alabilir ve çıktı alabilirsiniz . Bu kod golf, yani bayt cinsinden en kısa kod (her dilde) kazanır.

Yanıtlar:


8

Python 2 , 104 94 83 bayt

Bay Xcoder sayesinde -10 bayt
, Jonathan Allan ile -11 bayt

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

Çevrimiçi deneyin!


... aslında bu kabul edilebilir, çünkü bir kerede düşecek iuzun sürecek mi? Gerekebilir kullanmakstr (gerçekten emin bunları olsa asla değilim).
Jonathan Allan,

1
@ JonathanAllan ilginç bir soru. Normalde , uzun süredir standart tamsayı tipinin içinde olduğunu kabul
etmemize

6

Mathematica, 66 bayt

Diziyi süresiz olarak yazdırır

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

Çevrimiçi deneyin!

TIO'da sonucu görmek için yürütmeyi sonlandırmanız gerekir, ancak Mathematica'da iyi çalışıyor.

-12 Martin Ender gelen bayt


6

05AB1E , 9 bayt

1 indeksli dizinin nt terimini döndürür.

µNÔNγ€gJQ

Çevrimiçi deneyin!

açıklama

µ           # 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 baytlık yaklaşımımdan olası bir ilham kaynağı:µNγD€gs€ÙQ
Bay Xcoder

6

JavaScript (ES6), 76 71 68 bayt

0 indeksli dizinin n. Terimini döndürür .

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

Not : Her zaman olduğu gibi özyinelemeli işlevlerde, giriş aralığı Kuyruk Çağrı Optimizasyonu desteğine ve motorunuzun yığın boyutuna bağlıdır.

gösteri


Alt. sürüm, 65 bayt

Giriş yapmaz ve sonuçları alert()tek tek yazdırır .

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

Çevrimiçi deneyin! (Maksimum yığın boyutu aşıldığı anda durur.)



2

CJam , 20 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

Brachylog , 10 bayt

≜ℕẹḅ⟨l=h⟩ᵐ

Çevrimiçi deneyin!

Sınırsız olarak dizinin öğelerini girdi değişkeni aracılığıyla oluşturur . (Eğer gerçekten baskıyı kendisi yapmak zorundaysa, onu ekleyiniz &ẉ⊥.) Bu, esas olarak , en küçük çözümleri ilk önce kaba bir şekilde zorlamak için hazırlanmış bir ilgili çözmek için kullanılan koddur :

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

Bunun yalnızca 9 bayt almasını bekledim, ancak sayının basamaklarını satırlara ayırmak için açık bir şekilde çalışmak gerekiyor.


1

JavaScript 4, 83 80 bayt

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"? Böyle bir dil adı var mı?
user202729

JavaScript göründüğü için işe yarıyor, adın correwct olup olmadığından emin değilim
l4m2

Üzgünüm, js1'de işe yaramadı. Okudum ve hiçbir yerini bulamadım
l4m2


1

R , 56 bayt

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

Çevrimiçi deneyin!

Bölünmüş numaradaki çalışma uzunluğu kodlamasını kullanır. Tüm uzunluklar değerleri eşit ise true değerini döndürür.

Not: Çalışmak için methodskütüphaneyi TIO'ya yükledim el.


1

Stax , 10 bayt

Ç≡∟Öz≈¢αV¢

Koş ve hata ayıkla

Bu program tüm pozitif tamsayıları bir filtre ile filtreler. Rakamlar çalışma boyu kodlanmıştır. Her işlem için rakam, koşu boyuna eşit olmalıdır.




0

Java 10, 121 bayt

A lambda intiçin int. İşlev n indeksini alır ve n. (1 indeksli) sekans değerini döndürür .

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;}

Çevrimiçi Deneyin

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.