Sekwencja Seqindignot

27

Tytuł składa się z „Sequence Index Digit Not”.

Wyzwanie:

Biorąc pod uwagę liczbę całkowitą, nktóra jest >= 0, nwypisz liczbę w następującej kolejności.
Oto pierwsze 50 pozycji, nad którymi znajduje się indeks (indeksowany 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

Jak działa ta sekwencja?

Liczba w indeksie nmusi być pierwsza w kolejności, która nie ma żadnych wspólnych cyfr ni nie pojawiła się jeszcze dla poprzednich indeksów. Kiedy więc popatrzymy na taką normalną sekwencję z 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

Definiujemy następujące nwartości:

  • 0: Pierwsza liczba ( 0) zawiera tę samą cyfrę, więc szukamy następnej ( 1), która nie zawiera tej samej cyfry. Więc n=0wyjścia 1.
  • 1: Pierwsza liczba ( 0) nie zawiera tej samej cyfry, więc n=1wypisuje 0.
  • 2: Już się spotkaliśmy 0i 1, a następna cyfra ( 2) zawiera tę samą cyfrę, więc szukamy następnej ( 3), która nie zawiera tej samej cyfry. Więc n=2wyjścia 3.
  • ...
  • 10: Już się spotkaliśmy 0-9, więc następny jest 10. 10-19zawiera pasującą cyfrę 1, 20zawiera pasującą cyfrę 0, ponownie 21zawiera pasującą cyfrę 1, 22jest poprawna, więc n=10generuje 22.
  • itp.

Zasady konkursu:

  • Jeśli twój język jest indeksowany 1 (lub zdecydujesz się na to), możesz rozpocząć sekwencję od 3 2 5 4 7 ...(pomijając 1at n=0i 0at n=1).
  • Najmniejszy największy indeks, który powinieneś wesprzeć to 25,000. UWAGA: Sekwencja kończy się na indeksie 1,023,456,788, ponieważ następny indeks w wierszu zawiera wszystkie 10 cyfr.
  • Możesz także wyświetlać / zwracać tablicę / listę całej sekwencji do indeksu włącznie, njeśli chcesz.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

Ta sekwencja faktycznie utworzyła pary dotyczące indeksu i wyników. Jeśli dane nwyjściowe oindeksu, dane owyjściowe indeksu n. Możesz więc wprowadzić lewy lub prawy, a wyjście będzie po drugiej stronie:

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

Oto lista pierwszych 25001 przypadków testowych, jeśli chcesz wypróbować inne.

Kevin Cruijssen
źródło
3
Podobnie jak w przypadku pokrewnego wyzwania, wykres rozrzutu jest całkiem zabawny . :)
Martin Ender,
@MartinEnder Gdy zobaczyłem wykres punktowy powiązanego wyzwania, naprawdę pomyślałem, że ten będzie podobny. Okazuje się, że rzeczywiście jest raczej podobny, ale wciąż inny. :)
Kevin Cruijssen
Dlaczego tak ważnej sekwencji nie ma w OEIS?
Stewie Griffin
@StewieGriffin Dobre pytanie. Właściwie myślę, że wszystkie moje dotychczasowe wyzwania sekwencji nie były jeszcze w OEIS (jeszcze), kiedy je opublikowałem. ;)
Kevin Cruijssen

Odpowiedzi:

3

Pyth , 18 bajtów

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

Wypróbuj tutaj! lub Sprawdź więcej przypadków testowych!

Zauważ, że to zwraca całą sekwencję do indeksu N , ale link zwraca tylko ostatnią liczbę, poprzedzając znak e(koniec). Jeśli chcesz zobaczyć surową wartość zwracaną przez ten program, po prostu ją usuń .

Jak to działa

u + Gf! |} TG @ `H`T0hQY - Pełny program.

u ... hQY - Zmniejsz hQ (inkrementacja wejścia) od lewej do prawej za pomocą
                       funkcja ... (G, H), z wartością początkową Y (pusta lista).
                       G jest wartością bieżącą, a H jest wskaźnikiem iteracji.
   f 0 - pierwsza liczba całkowita zaczynająca się od 0, która spełnia następujące warunki:
      } TG - pojawia się w G ...
     | @ `H`T - Lub jego (ciąg) przecięcie z bieżącym indeksem (H) to
                        niepuste.
    ! - Logiczne NOT (negacja boolowska).
 + G - Dołącz wartość uzyskaną powyżej do bieżącej wartości (G).
                      Staje się to wartością podaną dla następnej iteracji.
                    - Niejawnie wydrukuj wszystkie wyniki pośrednie lub dodaj e do wydruku 
                      ostatni.
Pan Xcoder
źródło
6

Python 2 , 92 91 89 88 bajtów

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

Wypróbuj online!

Drukuje listę pierwszych n+1liczb


Inne podejście, które jest znacznie szybsze:

Python 2 , 96 bajtów

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

Wypróbuj online!

TFeld
źródło
3

Haskell, 80 69 bajtów

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

Wypróbuj online!

Bardzo wolny dla dużych 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]

Edycja: @Laikoni zapisał 10 bajtów. Dzięki!

nimi
źródło
Obliczenie n-tego terminu bezpośrednio zamiast indeksowania w sekwencji jest krótsze: Wypróbuj online!
Laikoni,
2

APL (Dyalog) , 39 bajtów

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

Zastosowania ⎕IO←0.

Wypróbuj online!

W jaki sposób?

Rekurencja

0=⍵:1 - zgadnij.

~⍺∊0∇¨⍳⍵ - left arg (akumulator) nie jest już w poprzednich wynikach

∧⊃∧/≠/⍕¨⍺⍵- oraz ciąg znaków akumulatora i nsą różne

:⍺ - następnie zwróć akumulator.

⍵∇⍨⍺+1 - w przeciwnym razie, zwiększ akumulator i powtórz.

Uriel
źródło
Wow .. Wiem, że domyślną regułą jest „dana dowolna ilość pamięci i czasu”, ale twój kod już n=10przekroczył limit czasu w TIO ..: S To musi być bardzo obciążająca wydajność operacja, którą tam wykonujesz. Czy powoduje to rekurencja, czy może jest to wąskie gardło?
Kevin Cruijssen
2
@KevinCruijssen drugi warunek w zasadzie stosuje funkcję w zakresie 0..n-1 i biorąc pod uwagę to samo zastosowanie do każdego wywołania, które przyjdzie z grubsza przy olbrzymim O (2 ^ n). oczywiście byłby niższy z bardziej rozsądnym kodem, ale to tam jest wąskie gardło
Uriel
2

Python 3 , 92 bajty

o=1,
for i in range(int(input())):
 x=0
 while{*str(x),x}&{*str(~i),*o}:x+=1
 o+=x,
print(o)

Wypróbuj online!

Spowoduje to wydrukowanie wszystkich terminów do N- tego. Dzięki Dennis za  -4  -5 bajtów!

Pan Xcoder
źródło
2

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

Nie mogę uwierzyć, że nie wróciłem kcały ten czas ...

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

Wypróbuj online!

Roberto Graham
źródło
Hmm, to całkiem inne podejście niż wtedy, kiedy tworzyłem pastebin za pomocą mojego programu Java. I wydaje się, można w golfa for(char f:(""+k).toCharArray())do for(int f:(""+k).getBytes()), r.substring(-~r.trim().lastIndexOf(32));i do r.substring(r.lastIndexOf(32)-1).
Kevin Cruijssen
Musi zostać przycięty przed ostatnimIndexOf, ponieważ na końcu jest spacja
Roberto Graham
Ach, rzeczywiście popełniłem błąd. Wiedziałem, że Łańcuch zawiera zarówno początkowe, jak i końcowe spacje, ale moja niepoprawnie sugerowana zmiana działa tylko dla pierwszych 10 cyfr jednocyfrowych. Mój zły
Kevin Cruijssen
2

Idź , 217 205 bajtów

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

Alternatywna wersja (program zamiast pakietu): Wypróbuj online!

Ulepszenia:

  • usunięto spację po zewnętrznej forza pomocą wielokrotnego przypisania dlai,k
  • import "fmt";+ fmt.Printjest krótszy niż os.Stdout.WriteString(zatrzymanie od package mainmomentu, gdy potrzebny był os.Args)
Riking
źródło
Fajnie, twoja odpowiedź jest pierwszą, która nie kończy się po 1 minucie, kiedy próbuję 25000testowego przypadku. :) Więc nie tylko prawidłowe rozwiązanie, ale także ze stosunkowo dobrą wydajnością. +1 ode mnie! (PS: W twoim łączu TIO to argument, którego używasz, dane wejściowe można usunąć / nie są używane.)
Kevin Cruijssen
2

JavaScript (ES6), 103 88 81

Edytuj Zmodyfikowane, w tym wiele sprytnych pomysłów autorstwa @Neil

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

Punkt początkowy

Podstawowa idea: pętla od 0 do n, a wartości kontroli wewnętrznej pętli nadal nie są używane

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
}

Aktualna wersja bardziej czytelna

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

Test

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>

edc65
źródło
Byłoby wymianie ~s.search(d)z s.match(d)pracy?
Neil,
Myślę, że możesz zapisać kolejny bajt, zmieniając 0na j++, usuwając ++z tego, jktóry był wcześniej, a następnie zaczynając jod 0zamiast -1.
Neil,
Myślę, że udało mi się przełączyć na pojedynczą pętlę: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 pojedyncza pętla byłaby cudowna
edc65
@Neil pojedyncza pętla jest świetna, dzięki
edc65
2

Oktawa , 114 bajtów

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]

Wypróbuj online!

Dzięki Kevin Cruijssen i Dlosc za porównanie postaci w golfa.

Nie golfił

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]

Podstawowe wyjaśnienie:

  • Pętla zewnętrzna i wewnętrzna, jedna do indeksu i, a druga do dodania wartościj
  • Dla każdego ikontynuuj zwiększanie, jjeśli spełniony jest jeden z poniższych warunków:

    1. Każdy jbył używany wcześniej
    2. Ten się bawi. Najpierw podziel każdą wartość liczbową na wektor cyfr (np. 10Staje się [1 0]) za pomocą int2str. Następnie porównaj dwie liczby za pomocą ismember(np. [1 0]I [2 1]zwróci [1 0]), a następnie nnzsprawdź, czy kolumny są dopasowane.
  • Jeśli żadne z powyższych nie jest spełnione, masz następny numer! Dołącz do omacierzy wyjściowej

  • Drukuj oryginalne wskaźniki z matrycą wyjściową
Alan
źródło
Dobra odpowiedź, +1 ode mnie. I wydaje się, że @DLosc ma rację, działa nawet bez obu -'0'. Ale jeśli jest jakiś przypadek, o którym oboje nie pomyśleliśmy, -48byłaby krótsza alternatywa. Oba sprintf('%d',...)mogą być int2str(...).
Kevin Cruijssen,
1

Perl 5 , 60 bajtów

59 bajtów kodu + 1 dla -p.

$_="@{[0..($;=++$_)*9]}";$_=eval's/\b[^ $-]+ //;$-++;$&;'x$

Wypróbuj online! (Obejmuje -lw celach wizualnych i $-=0;do resetowania każdej iteracji)

Dom Hastings
źródło
1

Pip , 30 bajtów

29 bajtów kodu, +1 dla -pflagi.

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

Wypróbuj online!

Wyświetla całą listę. Ostrzeżenie: wysoce nieefektywny; 2231przypadek wejściowy został uruchomiony dla 35+ minuty na moim laptopie i nadal nie zostało zakończone.

Wyjaśnienie

                               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)
DLosc
źródło
1

Visual Basic .NET (.NET 4.5) , 260 259 bajtów

-1 bajt dzięki 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

Pętli, generując poprzednie warunki w sekwencji, a następnie porównując później. Następnie iteruje liczbę jako ciąg szukający dopasowań.

Nadużywa systemu pisania VB.NET. Na przykład jjest ciągiem, ale dodanie jednego powoduje dla mnie konwersję na liczbę całkowitą. Liczby całkowite są konwertowane na logiczne, gdzie 0jest Falsei reszta True.

Wypróbuj online!

Brian J.
źródło
Nigdy nie programowałem w języku Visual Basic, ale wygląda na to, że możesz usunąć to miejsce If Not p.Contains(j)Thentak samo jak na If j.Contains(c)Then g=0poniższym przykładzie. Ponadto, 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 Ifmożna skrócić poprzez usunięcie gi stosując Exit Whilebezpośrednio w pętli 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, który stanie się 241 bajtów przez wygląda to.
Kevin Cruijssen
@KevinCruijssen Zdecydowanie mogę usunąć miejsce, aby je zrobić Contains(c)Then, właśnie go przegapiłem. Podoba mi się to, co myślisz, ale używam gjako wartownika, aby sprawdzić, czy ciąg zawiera liczbę, czy nie. Twój link zawiera błędne odpowiedzi, ale zobaczę, czy mogę przerobić część wewnętrznej logiki zgodnie z tym, co myślisz.
Brian J
Ach, ups ... To się naprawdę nie udaje ... Teraz tylko przekazuje dane wejściowe. Mój błąd. Nie powinienem robić tych komentarzy, gdy jest wieczór i jestem zmęczony pracą. ;)
Kevin Cruijssen
1

Galaretka , 20 bajtów

Pyth bije Jelly. Idź Mr. Xcoder!

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

Pełny program pobierający dane wejściowe ze STDIN i wysyłający dane w opcji formatu listy przy użyciu reprezentacji listy Jelly *. Wykorzystuje standardowe indeksowanie oparte na 0.

* Listy pojedynczych elementów nie mają otoczenia [], więc 0wyjścia 1, podczas gdy 1wyjścia [1, 0]itp.

Wypróbuj online!

W jaki sposób?

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
Jonathan Allan
źródło