Послідовність Seqindignot


27

Заголовок складається з "Число індексу послідовності не".

Виклик:

Враховуючи ціле число, 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

Як працює ця послідовність?

Число в індексі 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значення, як:

  • 0: Перше число ( 0) містить ту саму цифру, тому ми шукаємо наступну ( 1), яка не містить однакової цифри. Тож n=0виходи 1.
  • 1: Перше число ( 0) не містить однакової цифри, тому n=1виводиться 0.
  • 2: Ми вже зустрічалися з 0і 1, і наступна цифра ( 2) містить ту саму цифру, тому ми шукаємо наступну ( 3), яка не містить тієї ж цифри. Тож n=2виходи3 .
  • ...
  • 10: Ми вже стикалися 0-9, тож наступний рядок - це 10. 10-19містить відповідну цифру 1, 20містить відповідну цифру 0, 21містить відповідну цифру 1знову, 22є дійсною, тому n=10виводить 22.
  • тощо.

Правила виклику:

  • Якщо ваша мова є 1-індексованою (або ви вирішите), вам дозволяється починати послідовність з 3 2 5 4 7 ...(пропускаючи 1в n=0і 0в n=1).
  • Мінімальний найбільший індекс, який ви повинні підтримувати, - це 25,000. ПРИМІТКА: Послідовність зупиняється на індексі 1,023,456,788, оскільки наступний індекс у рядку містить усі 10 цифр.
  • Вам також дозволено виводити / повертати масив / список всієї послідовності до та включаючи індекс, 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

Ось клейстер з перших 25001 тестових випадків, якщо ви хочете спробувати інші.



3
Як і у зв'язку з цим викликом, розсіювач досить веселий . :)
Мартін Ендер

@MartinEnder Коли я побачив розсип пов'язаних з цим викликів, я дійсно зрозумів, що це буде подібне. Виявляється, це справді досить схоже, але все-таки різне. :)
Кевін Круїссен

Чому така важлива послідовність відсутня на OEIS?
Стюі Гріффін

@StewieGriffin Добре запитання. Насправді, я думаю, що всі мої виклики щодо послідовності поки що не були в OEIS (поки), коли я їх розміщував. ;)
Кевін Круїссен

Відповіді:


3

Піт , 18 байт

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

Спробуйте тут! або Перевірте більше тестових випадків!

Зауважте, що це повертає всю послідовність до індексу N , але посилання повертає лише останнє число, попередньо додавши e(кінець). Якщо ви хочете побачити неотримане значення, повернене цією програмою, просто видаліть його .

Як це працює

u + Gf! |} TG @ `H`T0hQY - Повна програма.

u ... hQY - Зменшити hQ (посилений вхід) зліва направо, за допомогою
                       функція ... (G, H), із початковим значенням Y (порожній список).
                       G - поточне значення, а H - індекс ітерації.
   f 0 - Перше ціле число, починаючи з 0, яке задовольняє наступному:
      } TG - з'являється в G ...
     | @ `H`T - або його (рядкове) перетин з поточним індексом (H) є
                        не порожній.
    ! - Логічний НЕ (булеве заперечення).
 + G - Додайте отримане вище значення до поточного значення (G).
                      Це стає заданим значенням для наступної ітерації.
                    - Непередбачувано надрукувати всі проміжні результати або додати е до друку 
                      останній.

6

Python 2 , 92 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 (Діалог) , 39 байт

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

Використання ⎕IO←0.

Спробуйте в Інтернеті!

Як?

Рекурсія.

0=⍵:1 - Вгадай.

~⍺∊0∇¨⍳⍵ - лівий аргумент (акумулятор) вже не в попередніх результатах

∧⊃∧/≠/⍕¨⍺⍵- і рядкове представлення акумулятора і nрізні

:⍺ - тоді поверніть акумулятор.

⍵∇⍨⍺+1 - інакше акумулятор приросту та рекурс.


Вау .. Я знаю, що за замовчуванням правило "надається будь-яка кількість пам'яті та часу", але ваш код уже вичерпано n=10в TIO ..: S Це повинно бути дуже важкою роботою, яку ви робите там. Це причиною цього є рекурсія чи це щось інше?
Кевін Кройсейсен

2
@KevinCruijssen друга умова в основному застосовує функцію в діапазоні 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. І здається , що ви можете грати в гольф , for(char f:(""+k).toCharArray())щоб for(int f:(""+k).getBytes()), r.substring(-~r.trim().lastIndexOf(32));і r.substring(r.lastIndexOf(32)-1).
Кевін Кройсейсен

Потрібно обрізати перед lastIndexOf, оскільки в кінці є місце,
Роберто Грем

Ах, я дійсно допустив помилку .. Я знав , що рядок містила як початкові і завершальні простір, але моє неправильно запропонована зміна працює тільки в протягом перших 10 однозначних чисел .. Мій поганий
Кевін Cruijssen

2

Ідіть , 217 205 байт

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.Printкоротший, ніж os.Stdout.WriteString(затримка, package mainколи були потрібні os.Args)

Приємно, ваша відповідь перша, яка не вичерпується через 1 хвилину, коли я спробую 25000тестовий випадок. :) Тож не лише правильне рішення, але і порівняно хороші показники. +1 від мене! (PS: У вашому 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)роботою?
Ніл

Я думаю , що ви можете зберегти ще один байт, змінюючи 0до j++, видаляючи ++з 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")
Ніл

@Neil один цикл був би чудовим
edc65

@Neil Один цикл чудовий, дякую
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]

Спробуйте в Інтернеті!

Завдяки Кевіну Крейсейну та Dlosc за порівняння персонажів у гольфі .

Безумовно

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]

Основне пояснення:

  • Зовнішній і внутрішній цикл, один для індексу i, а інший для додавання значенняj
  • Для кожного iпродовжуйте збільшувати, jякщо виконано будь-яке з наведеного нижче:

    1. Будь-які jраніше використовувалися
    2. Цей отримує задоволення. Спочатку розділіть кожне числове значення на вектор цифр (наприклад, 10стає [1 0]), використовуючи int2str. Потім порівняйте два числа за допомогою ismember(наприклад, [1 0]і [2 1]повернеться [1 0]), а потім, nnzщоб побачити, чи збігаються стовпці.
  • Якщо нічого з перерахованого вище не виконано, у вас є наступний номер! Додати доo вихідної матриці

  • Друкуйте оригінальні індекси вихідною матрицею

Приємна відповідь, +1 від мене. І, здається, @DLosc має рацію, працює навіть без обох -'0'. Але якщо є якийсь крайовий випадок, про який ми обидва не думали, -48була б коротшою альтернативою. Також обидва sprintf('%d',...)можуть бути int2str(...).
Kevin Cruijssen


1

Піп , 30 байт

29 байт коду, +1 для -pпрапора.

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це рядок, але додавання для мене перетворює на ціле число. Цілі числа перетворюються на булеві, де 0є, Falseі решта True.

Спробуйте в Інтернеті!


Я ніколи не програмував у Visual Basic, але, здається, ви можете видалити простір так If Not p.Contains(j)Thenсамо, як ви робили If j.Contains(c)Then g=0внизу. Також 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безпосередньо у for-loop:, 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 байтом за його зовнішнім виглядом.
Кевін Круїссен

@KevinCruijssen Однозначно можна видалити простір, щоб зробити його Contains(c)Then, я просто пропустив його. Мені подобається те, що ти думаєш, але я використовую gяк дозорний, щоб побачити, чи містить рядок число чи ні. Ваше посилання дає невірні відповіді, але я побачу, чи зможу я переробити якусь внутрішню логіку уздовж того, що ти думаєш.
Брайан J

Ах ой .. Це справді не виходить .. Тепер це лише виведення вводу. Моє ліжко. Не варто робити ці коментарі, коли вечір, і я втомився від роботи. ;)
Кевін Круїссен

1

Желе , 20 байт

Піт б’є желе. Іди, містер 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.