Seqindignotシーケンス


27

タイトルは、「Sequence Index Digit Not」から作成されます。

チャレンジ:

である整数nを指定すると、次のシーケンスの '番目の数を>= 0出力しnます。
以下に、最初の50個のアイテムと、その上の(0インデックス付き)インデックスを示します。

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

このシーケンスはどのように機能しますか?

indexのn数字はn、と共通の数字がなく、以前のインデックスではまだ発生していない最初の数字である必要があります。だから私たちがこのように通常のシーケンスを見たとき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

n次のように 'th値を定義します。

  • 0:最初の数字(0)には同じ数字が含まれているため、同じ数字を含まない次の数字()を探します1。だから、n=0出力1
  • 1:最初の数字(0)には同じ数字が含まれていないため、がn=1出力されます0
  • 2:とにすでに遭遇01、次の数字(2)には同じ数字が含まれているため3、同じ数字を含まない次の()を探します。だから、n=2出力3
  • ...
  • 10:すでに遭遇0-9したので、次の行は1010-19一致する数字120含む、一致する数字021含む、1再び一致する数字を含む、22有効なので、をn=10出力します22

チャレンジルール:

  • 言語が1インデックスの場合(または選択した場合)、シーケンスを開始できます3 2 5 4 7 ...1at n=0とat をスキップ0しますn=1)。
  • サポートする必要がある最小の最大インデックスは25,000です。注:1,023,456,788行の次のインデックスには10桁すべてが含まれるため、シーケンスはindex で停止します。
  • n必要に応じて、インデックスまでのシーケンス全体の配列/リストを出力/返すこともできます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

このシーケンスは、実際にインデックスと出力に関するペアを作成しました。インデックスがn出力される場合o、インデックスがo出力されますnしたがって、左または右のいずれかを入力でき、出力は反対側になります。

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

他のテストケースを試したい場合の最初の25,001個のテストケースのペーストビンは次のとおりです。



3
関連する課題と同様に、散布図は非常に楽しいです。:)
マーティンエンダー

@MartinEnder関連するチャレンジの散布図を見たとき、実際にこれは似ていると思いました。実際、かなり似ていますが、まだ異なっています。:)
ケビンクルーイッセン

このような重要なシーケンスがOEISにないのはなぜですか?
スティーヴィーグリフィン

@StewieGriffin良い質問です。実際、私が投稿したとき、これまでのシーケンスチャレンジすべて OEIS(まだ)になかったと思います。;)
ケビンクルーイッセン

回答:


3

Pyth、18バイト

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

ここで試してみてください!またはさらにテストケースをチェックしてください!

これはインデックスNまでのシーケンス全体を返しますが、リンクはe(end)を前に付けて最後の番号のみを返すことに注意してください。このプログラムから返された生の値を表示したい場合は、単に削除してください

使い方

u + Gf!|} TG @ `H`T0hQY-完全なプログラム。

u ... hQY-hQ(入力をインクリメント)を左から右に減らし、
                       関数...(G、H)、開始値Y(空のリスト)。
                       Gは現在の値で、Hは反復インデックスです。
   f 0-0から始まり、次の条件を満たす最初の整数:
      } TG-Gに表示...
     | @ `H`T-または、現在のインデックス(H)との(文字列)交点は
                        空ではない。
    !-論理否定(ブール否定)。
 + G-上記で取得した値を現在の値(G)に追加します。
                      これは、次の反復で指定された値になります。
                    -中間結果をすべて暗黙的に印刷するか、eを追加して印刷します 
                      最後の1つ。

6

Pythonの292の 91 89 88バイト

a=()
i=0
exec"x=0\nwhile set(`x`)&set(`i`)or x in a:x+=1\na+=x,;i+=1;"*-~input()
print a

オンラインでお試しください!

最初のn+1番号のリストを印刷します


はるかに高速な別のアプローチ:

Python 2、96バイト

n=input()
r=range(9*n)
i=0
exec"x=0\nwhile set(`r[x]`)&set(`i`):x+=1\nprint r.pop(x),;i+=1;"*-~n

オンラインでお試しください!



3

Haskell、80 69バイト

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

オンラインでお試しください!

大規模な非常に遅い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]

編集:@Laikoniは10バイトを節約しました。ありがとう!


シーケンスにインデックスを付ける代わりに、n番目の用語を直接計算する方が簡単です。オンラインで試してください!
ライコニ

2

APL(Dyalog)、39バイト

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

を使用し⎕IO←0ます。

オンラインでお試しください!

どうやって?

再帰。

0=⍵:1 - 当ててみて。

~⍺∊0∇¨⍳⍵ -左引数(アキュムレーター)は以前の結果にはまだありません

∧⊃∧/≠/⍕¨⍺⍵-そして、アキュムレータの文字列表現とnは異なります

:⍺ -その後、アキュムレーターを返します。

⍵∇⍨⍺+1 -それ以外の場合、アキュムレータをインクリメントして再帰します。


うわー。デフォルトのルールは「メモリと時間を任意に与える」ことですがn=10、TIOでコードはすでにタイムアウトしています。:Sこれは、非常にパフォーマンスが高い操作であるに違いありません。これを引き起こすのは再帰ですか、それとも他の何かがボトルネックですか?
ケビンCruijssen

2
@KevinCruijssen 2番目の条件は、基本的に0..n-1の範囲で関数を適用し、すべての呼び出しに同じ適用を考慮すると、大まかなO(2 ^ n)になります。もちろんそれは、より合理的なコードと低くなるだろうが、ボトルネックが座っているところです
ウリエル


2

JAVA(OpenJDKの8) 218 217 213 210 202 200 172 171 170 168 167バイト

私はkこの間ずっと戻ってきたとは信じられません...

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

オンラインでお試しください!


うーん、それはまったく異なるアプローチで、Javaプログラムでpastebinを作成したときに使っていました。そして、それはゴルフのことができますようだfor(char f:(""+k).toCharArray())for(int f:(""+k).getBytes())r.substring(-~r.trim().lastIndexOf(32));としますr.substring(r.lastIndexOf(32)-1)
ケビンCruijssen

最後のスペースがありますとしてのlastIndexOf前にトリミングする必要があります
ロベルト・グラハム

ああ、私は確かにミスを犯した..私の悪い私は、文字列先頭と末尾のスペースの両方が含まれて知っていたが、私の誤っ提案変更は、最初の10一桁の数字のために働く
ケビンCruijssen

2

Go217205バイト

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

代替バージョン(パッケージではなくプログラム):オンラインでお試しください!

改善点:

  • for複数の割り当てを使用して、アウターの後にスペースを削除しましたi,k
  • インポート"fmt";+ fmt.Printos.Stdout.WriteStringpackage mainos.Argsが必要なとき からのホールドオーバー)よりも短い

いいですね、あなたの答えは、私が25000テストケースを試す1分後にタイムアウトしない最初のものです。:)したがって、有効なソリューションだけでなく、比較的良好なパフォーマンスも備えています。私から+1!(追記:TIOリンクでは、使用する引数です。入力は削除できますが、使用されません。)
ケビンクルーイッセン

2

JavaScript(ES6)、103 88 81

編集などの改訂多く @Neilによって巧妙なアイデア

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

出発点

基本的な考え方:0からnまでのループ、およびまだ使用されていない値をチェックする内部ループ

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
}

現在のバージョンの読みやすさ

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

テスト

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)してs.match(d)動作しますか?
ニール

私は、あなたが変更することで、別のバイトを保存することができると思う0j++、削除する++からjその前に、その後始めていたjから、0代わりに-1
ニール

私は単一のループに切り替えることができたと思います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")
ニール

@ニール1つのループは素晴らしいだろう
-edc65

@ニールシングルループは素晴らしいです、ありがとう
-edc65

2

オクターブ、114バイト

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]

オンラインでお試しください!

キャラクター比較ゴルフのケビン・クルーッセンドロスに感謝します。

非ゴルフ

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]

基本的な説明:

  • 外側のループと内側のループ、1つはインデックス用、もう1つはi追加する値用j
  • それぞれについて、次のいずれかが満たされている場合はi増加し続けますj

    1. いずれかがj前に使用されています
    2. これは楽しくなります。最初に、を使用して各数値を数字のベクトルに分割します(たとえばに10なります[1 0]int2str。次に、を使用して2つの数値を比較しismember(たとえば[1 0]and [2 1]を返します[1 0])、nnz一致する列があるかどうかを確認します。
  • 上記のいずれにも当てはまらない場合は、次の番号があります!に追加しo、出力行列

  • 出力行列で元のインデックスを印刷

いい答え、私からの+1。そして、@ DLoscは正しいようで、両方がなくても動作し-'0'ます。しかし、私たち二人が考えもしなかったエッジケースがあれば-48、より短い代替案になります。また、両方ともsprintf('%d',...)可能ですint2str(...)
ケビンCruijssen


1

ピップ、30バイト

29バイトのコード、-pフラグの場合は+1 。

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

オンラインでお試しください!

リスト全体を出力します。警告:非常に非効率的です。2231入力の場合は、私のラップトップ上の35+分間実行されていると、まだ完了していません。

説明

                               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バイト

-1バイト、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

ループし、シーケンス内の前の用語を生成して、後で比較します。次に、一致する文字列として番号を繰り返します。

VB.NETのタイピングシステムを悪用します。たとえば、jは文字列ですが、1を追加すると整数に変換されます。整数は0isでFalseあり、残りはであるブール値に変換されますTrue

オンラインでお試しください!


Visual BasicでプログラミングしたことはありませIf Not p.Contains(j)Thenんが、If j.Contains(c)Then g=0以下で行ったのと同じようにスペースを削除できるようです。また、for-loop:を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削除gして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 Ifこれは、見た目で241バイトになります
ケビンCruijssen

@KevinCruijssen間違いなくそれを作るためにスペースを削除することができますContains(c)Then、私はちょうどそれを逃しました。私はあなたが考えているものが好きですがg、文字列に数字が含まれているかどうかを確認するために歩sentとして使用しています。あなたのリンクは間違った答えを与えますが、私はあなたが考えていることに沿っていくつかの内部論理を作り直すことができるかどうかを確認します。
ブライアンJ

ああ、それは実際に失敗します。今は入力のみを出力しています。私の悪い。夕方になり、仕事に疲れたときにこれらのコメントをしてはいけません。;)
ケビンクルーイッセン

1

ゼリー、20 バイト

PythがJellyを打ちます。Xcoderさん

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

STDINから入力を取得し、Jellyのリスト表現を使用してリスト形式オプションで出力する完全なプログラム*。標準の0ベースのインデックスを使用します。

*単一の要素のリストには、周囲の持っていない[]ので、0出力を1しながら、1出力[1, 0]など

オンラインでお試しください!

どうやって?

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.