Tytuł składa się z „Sequence Index Digit Not”.
Wyzwanie:
Biorąc pod uwagę liczbę całkowitą, n
która jest >= 0
, n
wypisz 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 n
musi być pierwsza w kolejności, która nie ma żadnych wspólnych cyfr n
i 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 n
wartości:
0
: Pierwsza liczba (0
) zawiera tę samą cyfrę, więc szukamy następnej (1
), która nie zawiera tej samej cyfry. Więcn=0
wyjścia1
.1
: Pierwsza liczba (0
) nie zawiera tej samej cyfry, więcn=1
wypisuje0
.2
: Już się spotkaliśmy0
i1
, a następna cyfra (2
) zawiera tę samą cyfrę, więc szukamy następnej (3
), która nie zawiera tej samej cyfry. Więcn=2
wyjścia3
.- ...
10
: Już się spotkaliśmy0-9
, więc następny jest10
.10-19
zawiera pasującą cyfrę1
,20
zawiera pasującą cyfrę0
, ponownie21
zawiera pasującą cyfrę1
,22
jest poprawna, więcn=10
generuje22
.- 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ąc1
atn=0
i0
atn=1
). - Najmniejszy największy indeks, który powinieneś wesprzeć to
25,000
. UWAGA: Sekwencja kończy się na indeksie1,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,
n
jeśli chcesz.
Główne zasady:
- To jest golf golfowy , 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 n
wyjściowe o
indeksu, dane o
wyjś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.
Odpowiedzi:
Pyth , 18 bajtów
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
źródło
Python 2 ,
92918988 bajtówWypróbuj online!
Drukuje listę pierwszych
n+1
liczbInne podejście, które jest znacznie szybsze:
Python 2 , 96 bajtów
Wypróbuj online!
źródło
Haskell,
8069 bajtówWypróbuj online!
Bardzo wolny dla dużych
n
.Edycja: @Laikoni zapisał 10 bajtów. Dzięki!
źródło
APL (Dyalog) , 39 bajtów
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 in
są różne:⍺
- następnie zwróć akumulator.⍵∇⍨⍺+1
- w przeciwnym razie, zwiększ akumulator i powtórz.źródło
n=10
przekroczył 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?Python 3 , 92 bajty
Wypróbuj online!
Spowoduje to wydrukowanie wszystkich terminów do N- tego. Dzięki Dennis za
-4-5 bajtów!źródło
Java (OpenJDK 8) ,
218217213210202200172171170168167 bajtówNie mogę uwierzyć, że nie wróciłem
k
cały ten czas ...Wypróbuj online!
źródło
for(char f:(""+k).toCharArray())
dofor(int f:(""+k).getBytes())
,r.substring(-~r.trim().lastIndexOf(32));
i dor.substring(r.lastIndexOf(32)-1)
.Idź ,
217205 bajtówAlternatywna wersja (program zamiast pakietu): Wypróbuj online!
Ulepszenia:
for
za pomocą wielokrotnego przypisania dlai,k
"fmt";
+fmt.Print
jest krótszy niżos.Stdout.WriteString
(zatrzymanie odpackage main
momentu, gdy potrzebny był os.Args)źródło
25000
testowego 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.)JavaScript (ES6),
103 8881Edytuj Zmodyfikowane, w tym wiele sprytnych pomysłów autorstwa @Neil
Punkt początkowy
Podstawowa idea: pętla od 0 do n, a wartości kontroli wewnętrznej pętli nadal nie są używane
Aktualna wersja bardziej czytelna
Test
źródło
~s.search(d)
zs.match(d)
pracy?0
naj++
, usuwając++
z tego,j
który był wcześniej, a następnie zaczynającj
od0
zamiast-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")
Oktawa , 114 bajtów
Wypróbuj online!
Dzięki Kevin Cruijssen i Dlosc za porównanie postaci w golfa.
Nie golfił
Podstawowe wyjaśnienie:
i
, a druga do dodania wartościj
Dla każdego
i
kontynuuj zwiększanie,j
jeśli spełniony jest jeden z poniższych warunków:j
był używany wcześniej10
Staje 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ępniennz
sprawdź, czy kolumny są dopasowane.Jeśli żadne z powyższych nie jest spełnione, masz następny numer! Dołącz do
o
macierzy wyjściowejźródło
-'0'
. Ale jeśli jest jakiś przypadek, o którym oboje nie pomyśleliśmy,-48
byłaby krótsza alternatywa. Obasprintf('%d',...)
mogą byćint2str(...)
.Perl 5 , 60 bajtów
59 bajtów kodu + 1 dla
-p
.Wypróbuj online! (Obejmuje
-l
w celach wizualnych i$-=0;
do resetowania każdej iteracji)źródło
Pip , 30 bajtów
29 bajtów kodu, +1 dla
-p
flagi.Wypróbuj online!
Wyświetla całą listę. Ostrzeżenie: wysoce nieefektywny;
2231
przypadek wejściowy został uruchomiony dla 35+ minuty na moim laptopie i nadal nie zostało zakończone.Wyjaśnienie
źródło
Visual Basic .NET (.NET 4.5) ,
260259 bajtów-1 bajt dzięki Kevin Cruijssen
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
j
jest ciągiem, ale dodanie jednego powoduje dla mnie konwersję na liczbę całkowitą. Liczby całkowite są konwertowane na logiczne, gdzie0
jestFalse
i resztaTrue
.Wypróbuj online!
źródło
If Not p.Contains(j)Then
tak samo jak naIf j.Contains(c)Then g=0
poniż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 If
można skrócić poprzez usunięcieg
i stosującExit While
bezpoś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.Contains(c)Then
, właśnie go przegapiłem. Podoba mi się to, co myślisz, ale używamg
jako 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.Galaretka , 20 bajtów
Pyth bije Jelly. Idź Mr. Xcoder!
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ęc0
wyjścia1
, podczas gdy1
wyjścia[1, 0]
itp.Wypróbuj online!
W jaki sposób?
źródło