Trình tự Seqindignot


27

Tiêu đề được tạo thành, từ 'Chỉ số chuỗi số không'.

Thử thách:

Cho một số nguyên n>= 0, xuất nsố thứ tự của dãy sau.
Dưới đây là 50 mục đầu tiên, với chỉ mục (được lập chỉ mục 0) phía trên nó:

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

Trình tự này hoạt động như thế nào?

Số tại chỉ mục nphải là số đầu tiên không có bất kỳ chữ số nào chung nvà chưa xảy ra đối với các chỉ mục trước đó. Vì vậy, khi chúng ta nhìn vào chuỗi bình thường như thế này từ 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

Chúng tôi xác định các ngiá trị như thế này:

  • 0: Số đầu tiên ( 0) chứa cùng một chữ số, vì vậy chúng tôi tìm số tiếp theo ( 1) không chứa cùng một chữ số. Vì vậy, n=0đầu ra 1.
  • 1: Số đầu tiên ( 0) không chứa cùng một chữ số, do đó, n=1đầu ra 0.
  • 2: Chúng tôi đã gặp 01và chữ số tiếp theo ( 2) chứa cùng một chữ số, vì vậy chúng tôi tìm kiếm ( 3) không chứa cùng một chữ số. Vì vậy, n=2đầu ra 3.
  • ...
  • 10: Chúng tôi đã gặp phải 0-9, vì vậy dòng tiếp theo là 10. 10-19chứa chữ số phù hợp 1, 20chứa chữ số phù hợp 0, lại 21chứa chữ số phù hợp 1, 22là hợp lệ, do đó, n=10đầu ra 22.
  • v.v.

Quy tắc thử thách:

  • Nếu ngôn ngữ của bạn được lập chỉ mục 1 (hoặc bạn chọn), bạn được phép bắt đầu chuỗi tại 3 2 5 4 7 ...(bỏ qua 1tại n=00tại n=1).
  • Chỉ số lớn nhất tối thiểu bạn nên hỗ trợ là 25,000. LƯU Ý: Chuỗi dừng tại chỉ mục 1,023,456,788, vì chỉ mục tiếp theo trong dòng chứa tất cả 10 chữ số.
  • Bạn cũng được phép xuất / trả về một mảng / danh sách của toàn bộ chuỗi lên đến và bao gồm chỉ mục nnếu bạn muốn.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

Trình tự này thực sự tạo ra các cặp liên quan đến chỉ số và đầu ra. Nếu nđầu ra ochỉ mục, ođầu ra chỉ mục n. Vì vậy, bạn có thể nhập bên trái hoặc bên phải và đầu ra sẽ là phía bên kia:

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

Dưới đây là một pastebin của 25.001 trường hợp thử nghiệm đầu tiên nếu bạn muốn thử người khác.



3
Như với các thử thách liên quan, scatterplot khá thú vị . :)
Martin Ender

@MartinEnder Khi tôi nhìn thấy sự phân tán của thử thách liên quan, tôi thực sự đã hình dung ra điều này sẽ tương tự. Hóa ra nó thực sự khá giống nhau, nhưng vẫn khác. :)
Kevin Cruijssen

Tại sao một chuỗi quan trọng như vậy không có trên OEIS?
Stewie Griffin

@StewieGriffin Câu hỏi hay. Trên thực tế, tôi nghĩ rằng tất cả các thử thách theo trình tự của tôi cho đến nay vẫn chưa có trong OEIS (khi tôi) đăng chúng. ;)
Kevin Cruijssen

Câu trả lời:


3

Bình thường , 18 byte

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

Hãy thử nó ở đây! hoặc Kiểm tra thêm các trường hợp thử nghiệm!

Lưu ý rằng điều này trả về toàn bộ chuỗi lên đến chỉ mục N , nhưng liên kết chỉ trả về số cuối cùng, bằng cách thêm vào một e(kết thúc). Nếu bạn muốn xem giá trị thô được trả về bởi chương trình này, chỉ cần xóa nó .

Làm thế nào nó hoạt động

u + Gf! |} TG @ `H`T0hQY - Chương trình đầy đủ.

u ... hQY - Giảm hQ (đầu vào tăng dần) từ trái sang phải, với
                       hàm ... (G, H), với giá trị bắt đầu Y (danh sách trống).
                       G là giá trị hiện tại và H là chỉ số lặp.
   f 0 - Số nguyên đầu tiên bắt đầu từ 0, thỏa mãn các yêu cầu sau:
      } TG - Xuất hiện trong ...
     | @ `H`T - Hoặc giao điểm (chuỗi) của nó với chỉ mục hiện tại (H) là
                        không trống rỗng.
    ! - Logic KHÔNG (phủ định boolean).
 + G - Nối giá trị thu được ở trên vào giá trị hiện tại (G).
                      Điều này trở thành giá trị nhất định cho lần lặp tiếp theo.
                    - Hoàn toàn in tất cả các kết quả trung gian hoặc thêm e để in 
                      Cái cuối cùng.


3

Haskell, 80 69 byte

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

Hãy thử trực tuyến!

Rất chậm cho lớn 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]

Chỉnh sửa: @Laikoni lưu 10 byte. Cảm ơn!


Tính toán thuật ngữ thứ n trực tiếp thay vì lập chỉ mục vào chuỗi ngắn hơn: Hãy thử trực tuyến!
Laikoni

2

APL (Dyalog) , 39 byte

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

Công dụng ⎕IO←0.

Hãy thử trực tuyến!

Làm sao?

Đệ quy.

0=⍵:1 - hãy đoán.

~⍺∊0∇¨⍳⍵ - arg arg (tích lũy) chưa có trong các kết quả trước đó

∧⊃∧/≠/⍕¨⍺⍵- và biểu diễn chuỗi của bộ tích lũy và nkhác nhau

:⍺ - sau đó trả lại bộ tích lũy.

⍵∇⍨⍺+1 - nếu không, tích lũy gia tăng và tái diễn.


Wow .. Tôi biết quy tắc mặc định là "được cung cấp bất kỳ dung lượng bộ nhớ và thời gian nào", nhưng mã của bạn đã hết thời gian n=10trong TIO ..: S Đó phải là một hoạt động rất nặng về hiệu năng mà bạn đang thực hiện ở đó. Đó có phải là đệ quy gây ra điều này, hay là một cái gì đó khác là nút cổ chai?
Kevin Cruijssen

2
@KevinCruijssen điều kiện thứ hai về cơ bản áp dụng hàm trên phạm vi 0..n-1 và xem xét áp dụng tương tự cho mỗi cuộc gọi, điều đó sẽ xảy ra ở mức O (2 ^ n) rất lớn. tất nhiên nó sẽ thấp hơn với một mã hợp lý hơn, nhưng đó là nơi nút cổ chai nằm
Uriel


2

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

Tôi không thể tin rằng tôi đã không trở lại ktất cả thời gian này ...

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

Hãy thử trực tuyến!


Hmm, đó là một cách tiếp cận hoàn toàn khác mà tôi đã sử dụng khi tôi tạo ra pastebin với chương trình Java của mình. Và có vẻ như bạn có thể chơi golf for(char f:(""+k).toCharArray())đến for(int f:(""+k).getBytes()), r.substring(-~r.trim().lastIndexOf(32));và để r.substring(r.lastIndexOf(32)-1).
Kevin Cruijssen

Phải được cắt bớt trước Last IndexOf vì có một khoảng trống ở cuối
Roberto Graham

À, tôi thực sự đã mắc lỗi .. Tôi biết Chuỗi chứa cả không gian hàng đầu và dấu, nhưng thay đổi được đề xuất không chính xác của tôi chỉ hoạt động cho 10 số có một chữ số đầu tiên .. Xấu của tôi
Kevin Cruijssen

2

Đi , 217 205 byte

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

Phiên bản thay thế (chương trình thay vì gói): Dùng thử trực tuyến!

Cải tiến:

  • loại bỏ không gian sau bên ngoài forbằng cách sử dụng nhiều gán choi,k
  • nhập "fmt";+ fmt.Printngắn hơn os.Stdout.WriteString(giữ lại từ package mainkhi cần os.Arss)

Thật tuyệt, câu trả lời của bạn là lần đầu tiên không hết thời gian sau 1 phút khi tôi thử 25000trường hợp thử nghiệm. :) Vì vậy, không chỉ là một giải pháp hợp lệ, mà với hiệu suất tương đối tốt là tốt. +1 từ tôi! (PS: Trong liên kết TIO của bạn, đó là đối số bạn sử dụng, đầu vào có thể bị xóa / không được sử dụng.)
Kevin Cruijssen

2

JavaScript (ES6), 103 88 81

Chỉnh sửa Sửa đổi bao gồm nhiều ý tưởng thông minh của @Neil

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

Điểm khởi đầu

Ý tưởng cơ bản: một vòng lặp từ 0 đến n và các giá trị kiểm tra vòng lặp bên trong vẫn chưa được sử dụng

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
}

Phiên bản hiện tại dễ đọc hơn

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

Kiểm tra

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ẽ thay thế ~s.search(d)bằng s.match(d)công việc?
Neil

Tôi nghĩ rằng bạn có thể lưu một byte khác bằng cách thay đổi 0thành j++, loại bỏ nó ++khỏi jnó trước đó và sau đó bắt đầu jtừ 0thay vì -1.
Neil

Tôi nghĩ rằng tôi đã có thể chuyển sang một vòng lặp duy nhất: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 một vòng lặp sẽ là tuyệt vời
edc65

@Neil vòng lặp đơn rất tuyệt, cảm ơn
edc65

2

Octave , 114 byte

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]

Hãy thử trực tuyến!

Cảm ơn Kevin CruijssenDlosc cho việc chơi golf so sánh nhân vật.

Bị đánh cắp

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]

Giải thích cơ bản:

  • Vòng lặp bên ngoài và vòng lặp bên trong, một cho chỉ mục ivà một cho giá trị để thêmj
  • Đối với mỗi i, tiếp tục tăng jnếu một trong hai điều sau đây được đáp ứng:

    1. Bất kỳ jđã được sử dụng trước đây
    2. Điều này được vui vẻ. Đầu tiên, chia từng giá trị số thành một vectơ chữ số (ví dụ, 10trở thành [1 0]) bằng cách sử dụng int2str. Sau đó, so sánh hai số bằng cách sử dụng ismember(ví dụ: [1 0][2 1]sẽ trả về [1 0]) và sau đó nnzđể xem liệu có cột nào khớp không.
  • Nếu không có điều nào ở trên được đáp ứng, bạn có số tiếp theo! Nối vào o, ma trận đầu ra

  • In các chỉ mục gốc với ma trận đầu ra

Câu trả lời hay, +1 từ tôi. Và dường như @DLosc đã đúng, nó hoạt động ngay cả khi không có cả hai -'0'. Nhưng nếu có một số trường hợp cạnh mà cả hai chúng tôi không nghĩ tới, -48sẽ là một sự thay thế ngắn hơn. Ngoài ra, cả hai sprintf('%d',...)có thể được int2str(...).
Kevin Cruijssen


1

Pip , 30 byte

29 byte mã, +1 cho -pcờ.

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

Hãy thử trực tuyến!

Đầu ra toàn bộ danh sách. Cảnh báo: kém hiệu quả; các 2231trường hợp đầu vào đã được chạy trong hơn 35 phút trên máy tính xách tay của tôi và vẫn chưa kết thúc.

Giải trình

                               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 byte

-1 byte nhờ Kevin Cruijssen

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

Vòng lặp thông qua, tạo các thuật ngữ trước trong chuỗi để so sánh sau. Sau đó lặp lại số dưới dạng một chuỗi tìm kiếm kết quả khớp.

Lạm dụng hệ thống gõ của VB.NET. Ví dụ, jlà một chuỗi, nhưng thêm một chuyển đổi thành một số nguyên cho tôi. Số nguyên được chuyển đổi thành Booleans nơi 0Falsevà còn lại là True.

Hãy thử trực tuyến!


Tôi chưa bao giờ lập trình trong Visual Basic, nhưng có vẻ như bạn có thể loại bỏ không gian If Not p.Contains(j)Thengiống như bạn đã làm ở If j.Contains(c)Then g=0bên dưới. Ngoài ra, 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 Ifcó thể rút ngắn bằng cách loại bỏ gvà sử dụng Exit Whiletrực tiếp trong vòng lặp for : 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 If, nó sẽ trở thành 241 byte bởi vẻ ngoài của nó.
Kevin Cruijssen

@KevinCruijssen Chắc chắn có thể loại bỏ không gian để tạo ra nó Contains(c)Then, tôi chỉ bỏ lỡ nó. Tôi thích những gì bạn đang nghĩ, nhưng tôi đang sử dụng gnhư một trọng điểm để xem chuỗi có chứa số đó hay không. Liên kết của bạn đưa ra câu trả lời sai, nhưng tôi sẽ xem liệu tôi có thể làm lại một số logic bên trong cùng với những gì bạn đang nghĩ không.
Brian J

Ah oops .. Nó thực sự thất bại .. Bây giờ nó chỉ xuất ra đầu vào. Lỗi của tôi. Không nên đưa ra những bình luận này khi trời tối và tôi mệt mỏi vì công việc. ;)
Kevin Cruijssen

1

Thạch , 20 byte

Nhịp đập của Jelly. Đi ông Xcoder!

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

Một chương trình đầy đủ lấy đầu vào từ STDIN và xuất ra tùy chọn định dạng danh sách bằng cách sử dụng biểu diễn danh sách của Jelly *. Sử dụng lập chỉ mục dựa trên 0 tiêu chuẩn.

* danh sách thành phần đơn lẻ không có xung quanh [], do đó , 0đầu ra 1, trong khi 1đầu ra, [1, 0]v.v.

Hãy thử trực tuyến!

Làm sao?

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.