Утворіть невидимі числа


15

Скажімо, підрядка - це будь-який безперервний розділ початкового рядка. Наприклад cat, це підрядок concatenate. Ми скажемо, що правильна підрядка - це підряд, який не дорівнює початковому рядку. Наприклад concatenate, це підрядок, concatenateале не належна підрядка. (в рядках для одного символу немає належних підрядків)

Тепер ми визначимо послідовність, використовуючи ці терміни. П - й член цієї послідовності буде найменше число таке , що існує правильна подстрока його двійкове подання , яке не є підрядок будь-який більш ранній термін у послідовності. Перший термін - 10.

Як вправа дозволяє генерувати перші 5 термінів. Я буду працювати в двійковому, щоб полегшити справи.

Перший термін - 10. Оскільки 11наступне найменше число має лише одну належну підрядку, 1яка також є підрядкою 10, 11не є в послідовності. 100однак містить правильну підрядку, 00яка не є підрядкою, 10так 100це наш наступний термін. Далі, 101що містить унікальну належну підрядку, 01додаючи її до послідовності, потім 110містить належну підрядку, 11яка є новою, додаючи її до послідовності.

Зараз у нас є

10, 100, 101, 110

111є наступним , але він містить тільки подстроку 1і 11робимо його не термін. 1000однак містить 000додавання його до послідовності.

Ось перші пари термінів у десятковій частині

2, 4, 5, 6, 8, 9, 10, 11, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 54, 56, 58

Завдання

Або

  • Візьміть n як вхідний і генеруйте n- й доданок у цій послідовності (або 0, або 1 індексується)

  • Постійно виводите умови послідовності

Це відповіді на які набираються у байтах, а менше байтів - краще.


Вихід повинен бути десятковим чи двійковим? Або інакше?
AdmBorkBork

@AdmBorkBork Я думаю, що це повинні бути цілі числа.
Erik the Outgolfer

Чи можете додати 100-й термін (чи будь-який інший великий n)?
Прут

@AdmBorkBork Ви повинні виводити в будь-якому стандартному дозволеному форматі.
Опублікувати Rock Garf Hunter

@Rod 36 досить великий? a(36)становить 47 (1 індексований).
Опублікувати Rock Garf Hunter

Відповіді:


5

Python 3 , 88 80 78 75 байт

-6 байт завдяки Wheat Wizard
-2 байту, завдяки RootTwo
-3 байти завдяки notjagan

s={0}
n=1
while 1:n+=1;b=f"{n:b}";p={b[1:],b[:-1]};s|=p-s and{b,print(n)}|p

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




@WheatWizard ninja'd
Rod

У Python 3.6 ви можете зберегти ще 2, замінивши bin(n)[2:]на f"{n:b}".
RootTwo

-3 байти з деякими по-справжньому дивними змінами.
notjagan


1

Математика, 116 110 байт

x={};f=Subsequences[#~IntegerDigits~2]&;Do[MemberQ[Most@f@n,s_/;FreeQ[f/@x,s,2]]&&x~AppendTo~Echo@n,{n,2,∞}]

Нескінченно виводить умови послідовності.

Пояснення

x={};

x - це перелік термінів послідовності до цих пір.

f=Subsequences[#~IntegerDigits~2]&

fявляє Functionсобою ціле число і повертає все Subsequencesйого базове 2представлення (включаючи порожній список {}і повний список самого IntegerDigitsсебе).

Do[...,{n,2,∞}]

Оцініть ...для значення nвід 2до .

...&&x~AppendTo~Echo@n

Якщо ...є False, то другий аргумент And( &&) ніколи не оцінював. Якщо ...є True, то Echo@nдрукує і повертає n, які ми потім AppendToперелічуємоx .

MemberQ[Most@f@n,s_/;FreeQ[f/@x,s,2]]

Ми хочемо перевірити, що якась правильна підрядка nне є підрядкою жодного попереднього терміна в послідовності. Most@f@nсписок відповідних подстрок n, ми потім перевірити , чи є підрядка , s_який є MemberQв цей список , так що список f/@xсписків подстрок попередніх членів послідовності знаходиться FreeQна sна рівні 2.


1

Математика, 109 94 байт

s={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]


Постійно виводите умови послідовності

Спеціальний дяк @ngenisis на -15 байт


Математика, 123 байти

(s=r={};For[i=2,i<2#,i++,If[!ContainsAll[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]],s=s~Join~t;r~AppendTo~i]];r[[#]])&


Візьміть n як вхідний і генеруйте n-й член у цій послідовності (1 індексований)

вхід

[1000]

вихід

1342 рік


Гарна ідея відстежувати наявні досі підряди! Я шпигую за принаймні 15байтами, які можуть перейти: SubsetQкоротше та еквівалентне ContainsAll, ви можете використовувати Andзамість If, Unionнепотрібне, і Doмайже завжди коротше, ніж For:s={};Do[!SubsetQ[s,(t=Subsequences@IntegerDigits[i,2])[[2;;-2]]]&&(s=s~Join~t;Echo@i),{i,∞}]
ngenisis

3більше байтів, використовуючи Most:s={};Do[!SubsetQ[s,Most[t=Subsequences@IntegerDigits[i,2]]]&&(s=s~Join~t;Echo@i),{i,2,∞}]
ngenisis

0

Pyth , 20 байт

u+G
fP-Fm.:.Bd)+TG1Y

Це друкує послідовність нескінченно. Це може бути використане лише офлайн як наслідок.

Пояснення (Пробіл - це новий рядок):

u+G fP-Fm.:.Bd)+TG1Y
u                  Y    Apply the following function to the previous output
                        until it stops changing (or forever, in this case),
                        starting with the empty list
    f             1     Find the first positive integer where
               +TG      The integer prepended to the current list
        m               Map to
           .Bd          Convert to binary
         .:   )         Form all subsequences
      -F                Fold the filter-out function over the list
                        This iteratively removes all subsequences already seen
                        from the candidate
     P                  Remove the last subsequence which is the whole number.
   (newline)            Print that first integer
 +G                     Prepend that first integer to the list


0

Haskell, 172 байти

import Data.List
b 0=""
b n=b(n`div`2)++(show$n`mod`2)
s=nub.(tails=<<).inits
p x=s x\\[x]
n(_,l)x|(p.b)x\\l/=[]=(x,l++(s.b)x)|1<2=(0,l)
filter(>1)$fst<$>scanl n(1,[])[1..]

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

Пояснення

Код генерує послідовність постійно.

  • bповертає двійкове представлення а Intяк aString
  • s повертає всі підрядки рядка
  • p повертає всі належні підрядки рядка
  • n це функція, яка застосовується ітеративно і повертає кортеж, що містить:
    • поточний елемент, якщо він є членом послідовності, інакше 0
    • список усіх підрядків, щоб перевірити наявність усіх наступних номерів
  • нарешті, scanlвикористовується для виклику nзнову і знову, і його вихід фільтрується, щоб містити лише елементи, що перевищують 1

Ось трохи легше читається версія перед гольфом:

import Data.List

binary :: Int -> String
binary 0=""
binary n|(d,r)<-divMod n 2=binary d++["01"!!r]

substrings :: String -> [String]
substrings xs = nub$inits xs>>=tails

properSubstrings :: String -> [String]
properSubstrings xs = substrings xs\\[xs]

sb  = substrings.binary
psb = properSubstrings.binary

g = scanl step (1,[]) [1..]
  where step (_,l) x | psb x \\ l /= [] = (x,l++sb x)
                     | otherwise        = (0,l)

f=filter(>1)$fst<$>g

0

JavaScript, 57 байт

for(x=1;;x++)/^10|10(00)*$/.test(x.toString(2))&&alert(x)

Запишемо задане число n у двійковій формі, тоді:

  • Якщо число починається з 10, n повинно бути у послідовності:
    • видаліть першу 1в ній, решту двійкового рядка не слід бачити, оскільки n - найменше число, яке може містити такий рядок
  • Якщо число починається з 11:
    • Видаливши першу 1в ній, решту бінарного рядка (давайте ми пожертвуємо його так, як це 1xслід побачити з:
      • число 1xв послідовності, або
      • число 1x0знаходиться в послідовності, оскільки містить унікальний підряд1x
    • Якщо вона непарна (закінчується на 1), вона не повинна в послідовності, оскільки:
      • ( n - 1) / 2 у послідовності, або
      • ( n - 1) у послідовності, оскільки вона містить унікальну підрядку ( n - 1) / 2
    • Якщо воно парне (закінчується на 0), воно є в послідовності iff n / 2 не в послідовності
      • з тією ж ідеєю, n / 2 не в послідовності iff n / 2 є непарною, або n / 4 знаходиться в послідовності

Висновок:

двійкова форма числа починається з 10або закінчується 1подальшим непарним числом 0. Або опишіть у регулярному вираженні: x match /^10|10(00)*$/.

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