Sekindignot dizisi


27

Başlık, 'Sıra Dizini Rakam Değil' bölümünden yapılmıştır.

Meydan okuma:

Bir tamsayıyı verilen nolup >= 0, çıkışı n, aşağıdaki sekansın 'inci sayısı.
İşte ilk 50 öğe, üstündeki (0 dizinli) dizini ile:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 0 3 2 5 4 7 6 9 8 22 20 30 24 23 26 25 28 27 32 11 33 10 14 13 16 15 18 17 31 12 29 19 21 50 40 41 42 44 45 35 36 37 51 38 39 52 53 55 56 34

Bu dizi nasıl çalışır?

Dizindeki sayı, nortak hiçbir rakama nsahip olmayan ve önceki dizinler için henüz oluşmamış ilk sırada olmalıdır . Öyleyse şunun gibi normal bir sıraya bakarsak 0-60:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

Bunun ngibi değerleri şöyle tanımlarız :

  • 0: İlk sayı ( 0) aynı basamağı içeriyor, bu yüzden aynı basamağı olmayan bir sonraki ( 1) karakterini arıyoruz . Böylece n=0çıktılar 1.
  • 1: İlk sayı ( 0) aynı rakamı içermiyor, bu yüzden n=1çıktılar 0.
  • 2: Karşılaştık 0ve 1sonraki basamak ( 2) aynı basamağı içeriyor, bu yüzden aynı basamağı olmayan sonraki ( 3) karakterini arıyoruz . Böylece n=2çıktılar 3.
  • ...
  • 10: Biz zaten karşılaştık 0-9, yani sıradaki 10. 10-19Eşleştirme rakam içermelidir 1, 20eşleştirme rakamı içeren 0, 21eşleştirme rakamı içeren 1yine 22bu nedenle, geçerlidir n=10çıkışlar 22.
  • vb.

Meydan okuma kuralları:

  • Dil 1-endeksli olduğu (veya tercih) En dizisini başlatmak için izin verilirse 3 2 5 4 7 ...(atlama 1at n=0ve 0at n=1).
  • Desteklemeniz gereken en büyük asgari endeks 25,000. NOT: Dizideki dizinde durur 1,023,456,788çünkü satırdaki bir sonraki dizin 10 basamağın tümünü içerir.
  • Ayrıca isterseniz dizinin tamamını içeren dizinin / listenin çıktısını nalmanıza / vermenize de izin verilir .

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT fonksiyonlarını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları:

Bu dizi aslında indeks ve çıktılarla ilgili çiftler oluşturdu. Endeks ise nçıkışlar o, endeks oçıkışları n. Böylece, sola veya sağa giriş yapabilirsiniz ve çıktı diğer taraf olur:

0      <->  1       (this test case is optional)
2      <->  3
10     <->  22
12     <->  30
34     <->  50
89     <->  100
111    <->  200
112    <->  300
199    <->  322
2231   <->  4456
9605   <->  11118
19235  <->  46000
23451  <->  60668
25000  <->  13674

Başkalarını denemek istiyorsanız İşte ilk 25,001 test durumlarının bir pastebin.



3
İlgili zorlukta olduğu gibi , dağılım grafiği oldukça eğlencelidir . :)
Martin Ender

@MartinEnder İlgili zorluğun dağılımını gördüğümde, bunun da benzer olacağını düşündüm. Gerçekten de oldukça benzer, ama yine de farklı olduğu ortaya çıktı. :)
Kevin Cruijssen

Neden böyle önemli bir dizi OEIS'de değil?
Stewie Griffin

@StewieGriffin Güzel bir soru. Aslında, şu ana kadarki tüm dizi zorluklarımın onları gönderdiğimde OEIS'te (henüz) olmadığını düşünüyorum . ;)
Kevin Cruijssen

Yanıtlar:


3

Pyth , 18 bayt

u+Gf!|}TG@`H`T0hQY

Burada dene! veya Daha fazla test durumu kontrol edin!

Bunun, dizinin tamamını N dizinine döndürdüğünü, ancak bağlantının bir e(bitiş) hazırlayarak yalnızca son sayıyı döndürdüğünü unutmayın . Bu programın döndürdüğü ham değeri görmek istiyorsanız, sadece kaldırın .

Nasıl çalışır

u + Gf! |} TG @ `H`T0hQY - Tam program.

u ... hQY - hQ’yu (giriş artan) soldan sağa doğru
                       işlevi ... (G, H), başlangıç ​​değeri Y (boş liste) ile.
                       G, geçerli değer ve H, yineleme indeksidir.
   f 0 - 0 ile başlayan ilk tam sayı, aşağıdakileri karşılar:
      } TG - G'de görünür ...
     | @ `H`T - Veya (string) geçerli indeks (H) ile kesişir
                        boş değil.
    ! - Mantıksal DEĞİL (boolean olumsuzlama).
 + G - Yukarıda elde edilen değeri mevcut değere (G) ekleyin.
                      Bu, bir sonraki yineleme için verilen değer haline gelir.
                    - Tüm ara sonuçları kesin olarak yazdırın veya yazdırmak için e ekleyin 
                      sonuncu.


3

Haskell, 80 69 bayt

f n=[x|x<-[0..],all(`notElem`show n)$show x,all(/=x)$f<$>[0..n-1]]!!0

Çevrimiçi deneyin!

Büyük için çok yavaş n.

f n=
    [x|x<-[0..]     ] !!0          -- pick the first of all 'x' from [0..]
                                   -- where
      all(`notElem`show n)$show x  -- no digit of 'n' appears in 'x', and
      all(/=x)                     -- 'x' is not seen before, i.e. not in the list
               f<$>[0..n-1]        -- 'f' mapped to [0..n-1]

Düzenleme: @Laikoni 10 bayt kaydetti. Teşekkürler!


Dizinin içerisine indeksleme yapmak yerine doğrudan terimin hesaplanması daha kısadır: Çevrimiçi deneyin!
Laikoni

2

APL (Dyalog) , 39 bayt

0∘{0=⍵:1⋄(~⍺∊0∇¨⍳⍵)∧⊃∧/≠/⍕¨⍺⍵:⍺⋄⍵∇⍨⍺+1}

Kullanır ⎕IO←0.

Çevrimiçi deneyin!

Nasıl?

Özyineleme.

0=⍵:1 - tahminde bulun.

~⍺∊0∇¨⍳⍵ - left arg (akümülatör) daha önceki sonuçlarda bulunmuyor

∧⊃∧/≠/⍕¨⍺⍵- ve akümülatörün string gösterimi ve nfarklı

:⍺ - sonra akümülatörü iade edin.

⍵∇⍨⍺+1 - Aksi takdirde, akümülatörün artması ve tekrarlanması.


Vay canına .. Varsayılan kuralın "herhangi bir miktarda hafıza ve zaman verildiğini" biliyorum, ama kodunuz n=10TIO'da zaten zaman aşımına uğradı: S: Orada çok yüksek performans gerektiren bir işlem olmalı. Buna neden olan özyineleme mi, yoksa başka bir darboğaz mı?
Kevin Cruijssen

2
@KevinCruijssen ikinci koşulu temel olarak işlevi 0..n-1 aralığında uygular ve kabaca çok büyük bir O (2 ^ n) olacak olan her çağrı için aynı işlemi uygular. elbette daha makul bir kodla daha düşük olurdu, ancak darboğazın oturduğu yer
orasıdır


2

Java (OpenJDK 8) , 218 217 213 210 202 200 172 171 170 168 167 bayt

Bunca kzaman geri dönmediğime inanamıyorum ...

i->{int j=-1,k=0,y=1;for(String r=" ",e=r;j++<i;r+=~-k+e,y=1)for(k=0;y>0;k++)for(int f:(k+(y=0)+"").getBytes())y+=(e+j).indexOf(f)<0&!r.contains(e+k+e)?0:1;return~-k;}

Çevrimiçi deneyin!


Hmm, bu tamamen farklı bir yaklaşım, sonra Java programımla pastördeyi yaparken kullandım. Ve golf can görünüyor for(char f:(""+k).toCharArray())için for(int f:(""+k).getBytes()), r.substring(-~r.trim().lastIndexOf(32));ve r.substring(r.lastIndexOf(32)-1).
Kevin Cruijssen

Sonunda bir boşluk olduğundan lastIndexOf'tan önce kırpılmalıdır
Roberto Graham

Ah, gerçekten bir hata yaptım ..
Dize'nin

2

Go , 217 205 bayt

package g;import("fmt";"strconv";"strings");var(
d=make(map[int]int)
a=strconv.Itoa)
func G(L int){k,i:=0,0;for;i<=L;i++{s:=a(i);k=0;for d[k]>0||strings.ContainsAny(a(k),s){k++;}
d[k]=1;}
fmt.Print(a(k));}

Alternatif sürüm (bir paket yerine program): Çevrimiçi deneyin!

İyileştirmeler:

  • foriçin çoklu atama kullanarak dıştan sonra boşluk kaldırıldıi,k
  • içe aktarma "fmt";+ öğesinden fmt.Printdaha kısa os.Stdout.WriteString( package mainos.Args gerektiğinden itibaren tutma )

Güzel, cevabınız, 25000test davasını denediğimde 1 dakika sonra zaman aşımına uğrayan ilk cevap . :) Bu yüzden sadece geçerli bir çözüm değil, aynı zamanda nispeten iyi bir performans ile. Benden +1! (PS: TIO bağlantınızda kullandığınız argümandır, girdi kaldırılabilir / kullanılamaz.)
Kevin Cruijssen 8:17

2

JavaScript (ES6), 103 88 81

Düzen dahil Revize birçok @Neil tarafından akıllı fikirler

n=>eval("for(r=[j=i=0];i<=n;)j=r[j]||(i+'').match(`[${j}]`)?j+1:!(r[k=j]=++i);k")

Başlangıç ​​noktası

Temel fikir: 0 ila n arasında bir döngü ve hala kullanılmayan iç döngü kontrol değerleri

n=>{
  var r=[]
  for(i=0;i<=n;i++)
  {
    s=new Set(i+'')
    for(j=-1;s;)
    {
      if (!r[++j] && ![...j+''].some(d=>s.has(d)))
      {
        r[j]=1
        console.log(i,j)
        s=0
      }
    }
  }
  return j
}

Geçerli sürüm daha okunabilir

n=>{
  for(r = [j=i=0]; i <= n; )
    if (r[j] || (i+'').match(`[${j}]`))
      ++j
    else
      r [k=j] = ++i,
      j = 0;
  return k
}

Ölçek

var f=
n=>eval("for(r=[j=i=0];i<=n;)j=r[j]||(i+'').match(`[${j}]`)?j+1:!(r[k=j]=++i);k")

update=_=>{
  var i=+I.value
  if (i < 1e4 || confirm("Really?")) {
    O.textContent=i + ' -> ...'
    setTimeout(_=>O.textContent=i + ' -> ' + f(i), 100)
  }
}  

update()
<input id=I value=100 type=number max=1023456788>
<button onclick='update()'>Go</button>
(slow when input > 1000)
<pre id=O></pre>


İş ~s.search(d)ile değiştirmek ister misiniz s.match(d)?
Neil

Sana değiştirerek başka byte kurtarabilir miyiz 0için j++, çıkarmadan ++dan jondan önce ve sonra başlamıştı jdan 0yerine -1.
Neil

Sanırım tek bir döngüye geçebildim:n=>eval("for(r=[j=i='0'];i<=n;)r[j]|[...''+j].some(d=>i.match(d))?j++:(i=++i+'',r[k=j]=1,j=0);k")
Neil

@Neil tek bir döngü harika olurdu
edc65

@Neil tek döngü harika, teşekkürler
edc65 20

2

Oktav , 114 bayt

N=input("");o=[1];for i=1:N;j=0;while(any(o==j)||nnz(ismember(int2str(i),int2str(j))));j++;end;o=[o,j];end;[0:N;o]

Çevrimiçi deneyin!

Karakter karşılaştırması golfü için Kevin Cruijssen ve Dlosc'a teşekkürler .

Ungolfed

N=input("");o=[1];

for i=1:N;
    j=0;
    while(any(o==j)||nnz(ismember(int2str(i),int2str(j))));
        j++;
    end;
    o=[o,j];
end;
[0:N;o]

Temel açıklama:

  • Dış döngü ve iç döngü, biri dizin iiçin diğeri değer eklemek içinj
  • Her biri için i, jaşağıdakilerden herhangi biri karşılanırsa artmaya devam edin:

    1. Daha jönce herhangi biri kullanılmış
    2. Bu eğlenceli olur. İlk önce, her bir sayısal değeri kullanarak rakamlardan oluşan bir vektöre bölün (örneğin, 10olur [1 0]) int2str. Sonra kullanarak iki sayı karşılaştırmak ismember(örneğin [1 0]ve [2 1]dönecekti [1 0]) sonra ve nnzherhangi bir sütun eşleşti olmadığını görmek için.
  • Yukarıdakilerin hiçbiri yerine getirilmezse, bir sonraki numaraya sahipsiniz! İçin ekleme o, çıkış matris

  • Orijinal dizinleri çıktı matrisiyle yazdır

Güzel cevap, benden +1. Ve @DLosc haklı görünüyor, her ikisi de olmadan bile çalışıyor -'0'. Ancak, ikimizin de düşünmediği bir kenar davası varsa, -48daha kısa bir alternatif olacaktır. Ayrıca, her ikisi sprintf('%d',...)de olabilir int2str(...).
Kevin Cruijssen


1

Pip , 30 bayt

29 bayt kod, -pbayrak için +1 .

Fn,a+1{Y0WyNl|_NyMSn++ylPBy}l

Çevrimiçi deneyin!

Tüm listeyi çıkarır. Uyarı: yüksek verimsiz; 2231giriş vaka benim laptop 35+ dakika boyunca çalışmakta olduğu ve hala bitirmedi.

açıklama

                               a is cmdline arg, l is [] (implicit)
Fn,a+1{                    }   For each n in range(a+1):
       Y0                       Yank 0 into y
         W                      While...
          yNl|                  y is in l, or...
              _Ny               lambda function: arg is in y
                 MSn            mapped to digits of n and result list summed
                                (i.e., any digit of n is in y):
                    ++y          Increment y
                       lPBy     Once we have a y that meets the criteria, push it to
                                the back of l
                            l  Output l (formatted with -p flag)

1

Visual Basic .NET (.NET 4.5) , 260 259 bayt

Kevin Cruijssen sayesinde -1 bayt

Function A(n)
Dim p=New System.Collections.Generic.List(Of Long),j="0",g=0
For i=0To n
j=0
While 1
If Not p.Contains(j)Then
g=1
For Each c In i.ToString
If j.Contains(c)Then g=0
Next
If g Then Exit While
End If
j+=1
End While
p.Add(j)
Next
A=p(n)
End Function

Daha sonra karşılaştırmak üzere sıradaki önceki terimleri üreten döngüler. Ardından sayıyı eşleşmeleri arayan bir dize olarak yineler.

VB.NET'in yazma sistemini kötüye kullanıyor. Örneğin j, bir dizedir, ancak bir tane eklemek benim için bir tamsayıya dönüştürür. Nerede Tamsayılar Boolean dönüştürülür 0olduğunu Falseve gerisi vardır True.

Çevrimiçi deneyin!


Visual Basic'te hiçbir zaman programlanmadım, ancak alanı aşağıdan If Not p.Contains(j)Thenyaptığınız gibi kaldırabilirsiniz If j.Contains(c)Then g=0. Ayrıca, for-loop'da doğrudan If Not p.Contains(j)Then \n g=1 \n For Each c In i.ToString \n If j.Contains(c)Then g=0 \n Next \n If g Then Exit While \n End Ifçıkarılarak gve kullanılarak kısaltılabilir Exit While: If Not p.Contains(j)Then \n For Each c In i.ToString \n If j.Contains(c)Then Exit While \n Next \n End Ifbu , görünümüyle 241 bayt olur.
Kevin Cruijssen

@KevinCruijssen Kesinlikle yapmak için alanı kaldırabilir, Contains(c)Thensadece kaçırdım. Ne düşündüğünüzü seviyorum, ancak gdizginin sayı içerip içermediğini görmek için nöbetçi olarak kullanıyorum . Bağlantınız yanlış cevaplar veriyor, ancak göreceğiniz şey boyunca iç mantığın bir kısmını elden geçirip değiştiremeyeceğimi göreceğim.
Brian J

Ah aykır .. Gerçekten de başarısız oluyor .. Şimdi sadece girdiyi veriyor. Benim hatam. Akşam olduğunda bu yorumları yapmamalıyım ve işten yoruldum. ;)
Kevin Cruijssen

1

Jöle , 20 bayt

Pyth Jelly'i yener. Git Bay Xcoder!

Df⁹LD¤ȯeṆ
0ç1#ɓ;
1Ç¡

Jelly'in liste gösterimini * kullanarak STDIN'den girdi alan ve liste formatı seçeneğinde çıktı veren tam bir program. Standart 0 tabanlı indekslemeyi kullanır.

* Tek eleman listelediğinden çevreleyen var [], bu yüzden 0çıkışları 1iken 1çıkışlar [1, 0]vs.

Çevrimiçi deneyin!

Nasıl?

Df⁹LD¤ȯeṆ - Link 1, can append n to current? n, number; current, list
D         - convert n to decimal list
     ¤    - nilad followed by link(s) as a nilad:
  ⁹       -   chain's right argument, current
   L      -   length
    D     -   convert to a decimal list
 f        - filter discard from left if not in right
       e  - n exists in current?
      ȯ   - left logical OR right (empty lists are falsey)
        Ṇ - logical NOT

0ç1#ɓ; - Link 2, append next number: current, List
   #   - n find (count up finding first n matches):
  1    - ...finding: 1 match
0      - ...stating at: n=0
 ç     - ...doing: the last link as a dyad (left=n, right=current)
    ɓ  - new swapped-arg-dyadic chain (left = current, right = list of the found n)
     ; - concatenate

1Ç¡ - Main link: no arguments
1   - initialise the return value to 1
  ¡ - repeat input() times:
 Ç  -   last link (2) as a monad
    - implicit print
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.