Обчисліть А190810


27

Ваше завдання досить просте, обчисліть n-й елемент A190810 .

Елементи A190810 обчислюються відповідно до цих правил:

  1. Перший елемент - 1
  2. Послідовність збільшується
  3. Якщо xвідбувається в послідовності, то 2x+1і 3x-1теж робимо

Ви можете використовувати індексацію на основі 1 або 0, але якщо ви використовуєте індексацію на основі 0, будь ласка, скажіть це у відповіді.

Тестові справи

a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255

Оскільки це код-гольф, найкоротша відповідь у байтах виграє!


2
Вам слід додати більші тестові випадки.
mbomb007

7
Чи можете ви пояснити це трохи чіткіше? Я є носієм англійської мови, і я не маю поняття, що "... і якщо x є, то 2x + 1 і 3x-1 знаходяться в a". має означати.
кіт

1
@cat x ϵ A → (2*x) + 1 ϵ Aі x ϵ A → (3*x)-1 ϵ A, де ϵозначає "є членом" і може розумітися як "мається на увазі".
Стівен Х.

3
Запропонований стан: Послідовність не містить цифр, які не вимагаються іншими правилами. (Інакше $ a (i) = i $ буде дійсною послідовністю)
Стиг Хеммер

1
І ви отримаєте безкоштовні відповіді Mathematica та Haskell, щоб почати з :)
Зупиніть шкодити Моніці

Відповіді:


9

Желе , 16 байт

×3’;Ḥ‘$;
1Ç¡ṢQ³ị

Дуже неефективно. Спробуйте в Інтернеті!

Як це працює

1Ç¡ṢQ³ị   Main link. Argument: n (integer)

1         Set the return value to 1.
 Ç¡       Execute the helper link n times.
   Ṣ      Sort the resulting array.
    Q     Unique; deduplicate the sorted array.
     ³ị   Retrieve its n-th element.


×3’;Ḥ‘$;  Helper link. Argument: A (array)

×3        Multiply all elements of A by 3.
  ’       Decrement the resulting products.
      $   Combine the two links to the left into a monadic chain.
    Ḥ     Unhalve; multiply all elements of A by 2.
     ‘    Increment the resulting products.
   ;      Concatenate 3A-1 and 2A+1.
       ;  Concatenate the result with A.

1
Це може бути 16 символів , але я не знаю жодного кодування, яке представляє його менш ніж у 30 байт .
багатий ремер

18
У Jelly є своя кодова сторінка, яка дозволяє цим символам бути 1 байт кожен.

15

Python 2, 88 83 72 байт

Ви можете прочитати програми у цій відповіді у зворотному порядку ...

Ще повільніше і коротше, завдяки Деннісу:

L=1,;exec'L+=2*L[0]+1,3*L[0]-1;L=sorted(set(L))[1:];'*input()
print L[0]

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


Це не працює так швидко, але коротше ( 83 байти .) Сортуючи та видаляючи дублікати кожної ітерації, а також видаляючи перший елемент, я видаляю необхідність в індексі до списку. Результат - просто перший елемент після nітерацій.

Можливо, у мене був гольф Денніса. : D

L=[1]
n=input()
while n:L+=[2*L[0]+1,3*L[0]-1];n-=1;L=sorted(set(L))[1:]
print L[0]

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


Ця версія нижче ( 88 байт ) працює дуже швидко, знаходячи 500000-й елемент приблизно за дві секунди.

Це досить просто. Обчислюйте елементи списку, поки не буде втричі більше елементів n, оскільки кожен доданий елемент може додати не більше ніж 2 унікальних елементів. Потім видаліть дублікати, сортуйте та надрукуйте nth елемент (індексований нулем.)

L=[1]
i=0
n=input()
while len(L)<3*n:L+=[2*L[i]+1,3*L[i]-1];i+=1
print sorted(set(L))[n]

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


8

Python 2, 59 байт

t={1}
exec'm=min(t);t=t-{m}|{2*m+1,3*m-1};'*input()
print m

На основі Python відповіді @ mbomb007 ігрових . Перевірте це на Ideone .


"Один не просто перевершує Денніса" ... Я б хотів, щоб я подумав про використання набору літералів. Зараз це здається очевидним. Це відповідь швидше, ніж моя "швидка" програма, якщо ви переходите від виконання рядка до фактичного коду?
mbomb007

Ні. Це повільніше. Встановити операції дорожче.
mbomb007

Так, minце O (n), а індексація списку - O (1) , тож це рішення принаймні O (n²) ...
Dennis

8

Haskell, 76 73 69 байт

a#b=mod a b<1&&t(div a b)
t x=x<2||(x-1)#2||(x+1)#3
(filter t[1..]!!)

Використовує індекс на основі 0. Приклад використання: (filter t[1..]!!) 54-> 255.

Замість того щоб будувати список, багаторазово вставляючи 2x+1і , 3x-1як видно в більшості інших відповідей, я йду через все цілі числа і перевірити , якщо вони можуть зменшити до 1багаторазового застосування (x-1) / 2або (x+1) / 3якщо діляться.


Це насправді не визначає функцію чи дійсний фрагмент коду, чи не так?
Зета

@Zeta Останній рядок оцінює неназвану функцію.
Згарб

@Zgarb Яка помилка у файлі Haskell, і жоден інтерпретатор, про який я знаю, не підтримує цю функцію. Тож, будь ласка, просвітліть мене, як користувач повинен використовувати це, не змінюючи коду вище? Або ви могли б вказати мені на мета-пост, який дозволяє подібний код?
Зета

2
@ Zgarb Я думаю, що для останнього рядка призначаю його для прив'язки (як f=filter t[1..]!!), тому що я не думаю, що це правильно.
TuxCrafting

1
@ TùxCräftîñg У цьому пості на Meta було визначено, що додаткові функції помічників у цій ситуації за замовчуванням прийнятні. Це також формат, який я зазвичай бачу тут для відповідей Haskell. Звичайно, ви як автор виклику маєте остаточний авторитет.
Згарб

7

Haskell, 77 74 байти

import Data.List
i=insert
f(x:y)=x:f(i(2*x+1)$i(3*x-1)y)
a=(!!)(nub$f[1])

Це забезпечує функцію aдля n-го запису. Він індексується нулем. Як варіант, a=nub$f[1]створимо весь список (ліниво).

Це варіант списку Setкоду Рейнхарда Зумкеллера .


Чому б не yзамість цього xsзберегти два байти? Також я вважаю, що ви, можливо, зможете скоротити останній рядок до чогось подібного(!!)$nub.f[1]
Michael Klein

@MichaelKlein: Я занадто звик (x:xs), повністю забув це, дякую.
Зета

6

Python 2, 88 84 байт

g=lambda k:g(k%2*k/2)|g(k%3/2*-~k/3)if k>1else k
f=lambda n,k=1:n and-~f(n-g(k),k+1)

Перевірте це на Ideone .


13
Ви професіонал, який перетворює щось просте в щось нечитабельне.
mbomb007


5

Брахілог , 45 байт

:1-I,?:?*:1ydo:Im.
1.|:1-:1&I(:3*:1-.;I*:1+.)

Обчислює N = 1000приблизно 6 секунд на моїй машині.

Це 1-індексований, напр

run_from_file('code.brachylog',1000,Z).
Z = 13961 .

Пояснення

  • Основний предикат:

    :1-I,               I = Input - 1
         ?:?*           Square the Input
             :1y        Find the first Input*Input valid outputs of predicate 1
                do      Remove duplicates and order
                  :Im.  Output is the Ith element
    
  • Предикат 1:

    1.                  Input = Output = 1
    |                   Or
    :1-:1&I             I is the output of predicate 1 called with Input - 1 as input
           (            
             :3*:1-.      Output is 3*I-1
           ;            Or
             I*:1+.       Output is 2*I+1
           )
    

Ви можете зауважити, що ми не передаємо жодного вводу в предикат 1 під час дзвінка y - Yield. Через розповсюдження обмежень він знайде правильний вклад, як тільки досягне 1.положення, який поширюватиме правильні вхідні значення.


4

MATL, 19, 18 17 байт

1w:"tEQy3*qvSu]G)

Це надзвичайно неефективний алгоритм. У інтернет-перекладача не вистачає пам’яті для входів більше 13.

Один байт збережено, завдяки Луїсу Мендо!

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

Ця версія довша, але ефективніша (21 байт)

1`tEQy3*qvSutnG3*<]G)

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

Пояснення:

Логічний спосіб зробити це - додати елементи до масиву, поки він не буде достатньо довгим, щоб захопити i-й елемент. Ось так працює ефективно. Golfy (і неефективний) спосіб зробити це, щоб просто збільшити розмір масиву я раз.

Таким чином , по- перше, ми визначаємо масив запуску: 1. Потім ми поміняємо два верхні елементи, щоб вхід був зверху. w. Тепер ми пробираємося через вхід з :". Отже, я раз:

t             %Duplicate our starting (or current) array.
 EQ           %Double it and increment
   y          %Push our starting array again
    3*q       %Multiply by 3 and decrement
       v      %Concatenate these two arrays and the starting array
        Su    %Sort them and remove all duplicate elements.

Тепер у нас є гігантський масив послідовності. (Шлях більше, ніж потрібно для обчислення) Отже, ми припиняємо циклічно циклічно записувати ], і захоплюємо i -ве число з цього масиву G)(1-індексований)


@LuisMendo Дякую за пораду! Як би ви переписали це за допомогою циклу while замість циклу for? (Можливо, це було б краще питання для чату MATL)
DJMcMayhem

Це може бути зроблено таким чином: 1`tEQy3*qvuStnG<]G). Умова циклу є tnG<(вихід, коли масив вже має необхідний розмір)
Луїс Мендо

Не впевнений, скільки це обман, але у forверсії -loop ви можете взяти дані в одинаковому вигляді як рядок і видалити:
Луїс Мендо

4

JavaScript (ES6), 63 байти

 f=(n,a=[1],i=0)=>a[i++]?--n?f(n,a,a[i*2]=a[i*3-2]=1):i:f(n,a,i)

Ймовірно, здається швидко через рекурсію.


4

Сітківка, 57

^.+
$*¶¶1
¶¶(1(1*))
¶1$1$1¶$2$1$1
O`
}`(¶1+)\1\b
$1
G2`
1

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

0-індексований. Слід часто використовуваний алгоритм: видалити мінімальне значення з поточного набору, назве його x, а також додавати 2x+1і 3x-1до набору кілька разів рівному вхідного, то провідне число є результатом. "Набір" у Retina - це лише список, який неодноразово сортується та робиться таким, що містить лише унікальні елементи. До алгоритму для гольфу додано кілька підступних шматочків, які я поясню, як тільки у мене з’явиться ще деякий час.

Велика подяка Мартіну за те, що він заграв близько 20 байт!


4

Clojure, 114 108 байт

#(loop[a(sorted-set 1)n 1](let[x(first a)](if(= n %)x(recur(conj(disj a x)(+(* 2 x)1)(-(* 3 x)1))(inc n)))))

Я не був би здивований, якби це можна було гольфу / зменшити на значну суму, але set це не підтримка nth дуже пошкодило мій потяг думок.

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

Версія з пробілами:

#(loop [a (sorted-set 1)
        n 1]
  (let [x (first a)]
    (if (= n %)
      x
      (recur (conj (disj a x) (+ (* 2 x) 1) (- (* 3 x) 1)) (inc n))
      )))

4

05AB1E, 18 17 байт

Використовує кодування CP-1252 .

$Fз>s3*<)˜Ù}ï{¹è

Пояснення

$                  # initialize with 1
 F          }      # input number of times do
  Ð                # triplicate current list/number
   ·>              # double one copy and add 1
     s3*<          # multiply one copy by 3 and subtract 1
         )˜Ù       # combine the 3 lists to 1 list and remove duplicates
             ï{    # convert list to int and sort
               ¹è  # take the element from the list at index input

Спробуйте його в Інтернеті для невеликої кількості

Дуже повільно.
Використовує індексацію на основі 0.


3

C ++, 102 байти

[](int i){int t;map<int,int>k;for(k[1];i--;k.erase(t))t=k.begin()->first,k[t*2+1],k[t*3-1];return t;};

Ця лямбда-функція вимагає #include <map>і using std::map.

mapТут це просто набір ключів; їхні значення ігноруються. Я використовую mapдля того, щоб скористатись тимчасовим кодом для вставки:

k[1]; // inserts the key 1 into the map

Завдяки відсортованому порядку mapнайменший елемент видобувається за допомогою k.begin()->first.


1
Трохи коротше (97) з використанням setі ініціалізатор списків: [](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};.
1616

3

Власне, 27 байт

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E

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

Ця програма використовує індексацію на основі 0. Цей підхід дуже жорстокий, тому не сподівайтеся, що він буде працювати в онлайн-перекладачі для отримання більшого обсягу інформації.

Пояснення:

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E
╗                            save input (n) in register 0
 1#                          push [1]
   ╜                         push n
    `;;2*1+)3*1@-#++╔S`n     do the following n times:
     ;;                        make two copies of the list
       2*1+                    apply 2x+1 to each element in one copy
           )3*1@-              and 3x-1 to each element in the other copy
                 #             workaround for a weird list bug
                  ++           append those two lists to the original list
                    ╔S         uniquify and sort
                        ╜@E  get the nth element (0-indexed)

2

CJam (25 байт)

ri1a1${{_2*)1$3*(}%_&}*$=

Інтернет демо . Зауважте, що тут використовується індексація на основі нуля.

Для цього використовується аналогічний підхід до більшості: застосувати nперіоди перетворень, а потім сортувати та витягувати цей nелемент. Як кивок на ефективність, дедуплікація застосовується всередині циклу, а сортування застосовується поза циклом.


2
22: 1ari{(_2*)\3*(@||$}*0=(Також набагато ефективніше.)
Мартін Ендер

2

Сітківка , 48 байт

.+
$*
+1`^(((!*)!(!|\3)(?=\3!1))*!)1|\b
!$1
-2`.

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

Натхненний відповіддю Німі, я подумав, що спробую інший підхід для Retina, використовуючи зворотний трекінг двигуна regex, щоб з'ясувати, чи є вказаний (неоднаковий) номер у послідовності чи ні. Виявляється, це можна визначити за допомогою 27-байтового регулярного вираження, але використання його коштує ще трохи, але воно все-таки закінчується коротше, ніж генеративний підхід.

Ось альтернативне 48-байтне рішення:

.+
$*
{`1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!

І за допомогою унарного вводу / виводу ми можемо робити 42 байти, але я намагаюся цього уникати, а інша відповідь Retina також використовує десятковий:

1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!
1

2

Рубін, 70 байт

->n{a=*1
n.times{a<<a.map{|i|([2*i+1,3*i-1]-a).min||1.0/0}.min}
a[-2]}

Пояснення

->n{
    # Magical, golfy way of initializing an array. Equivalent to a = [1].
    a=*1
    n.times{
        # Generate the next element in the sequence, by...
        a<<
            # ... finding the minimal term that will appear at some point.
            a.map{|i|
                ([2*i+1,3*i-1]-a).min||1.0/0
            }.min
    }
    # We generated n+1 elements, so we'll take the *second* to last one.
    a[-2]
}

1
Цей *1трюк акуратний
TuxCrafting

1

J, 31 байт

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]

Використовується індексація на основі нуля. Дуже неефективна пам'ять.

Пояснення

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]  Input: n
                              ]  Identity function, gets n
 1                               The constant 1
  (                      )^:[~   Repeat n times with an initial array a = [1]
                       >:          Increment each in a
                     2*            Multiply by 2 to get 2a+2
             3&*                   Multiply each in a by 3 to get 3a
                 &:<:              Decrement both x and y to get 2a+1 and 3a-1
                ,                  Join them
    ]                              Identity function, gets a
            ,                      Join a with 2a+1 and 3a-1
         ~.@                       Take the distinct values
     /:~@                          Sort up
   ]                               Return the sorted list
{                                Select the value from the list at index n and return it

1

Октава, 68 байт

function r=a(n)s=1;for(i=1:n)r=s(i);s=union(s,[r*2+1 r*3-1]);end;end

Ви можете зняти фінал;end
Луїс Мендо

У версії, якою я користуюся, принаймні (4.0.0), ви не можете ...
dcsohl

1

Perl, 173 132 байт +1 для -n = 133

sub c{my$a=pop;return($a==1||($a%2&&c(($a-1)/2))?1:$a%3!=2?0:$a%3==2?c(($a+1)/3):1)}while($#b<$_){$i++;@b=(@b,$i)if c$i}say$b[$_-1];

Безголівки:

my @array = ();
my $n = <>;
sub chk {
    my $a = shift;
    return 1 if ($a == 1);
    if ($a % 2 == 0) {
        if ($a % 3 != 2) {
            return 0;
        } else {
            return chk(($a + 1) / 3);
        }
    } else {
        if (chk(($a - 1) / 2) == 0) {
            if ($a % 3 != 2) {
                return 0;
            } else {
                return chk(($a + 1) / 3);
            }
        } else {
            return 1
        }
    }
}
my $i = 1;
while ($#array < $n-1) {
    push(@array,$i) if (chk($i) == 1);
    $i++;
}
print $array[$n];

Я, мабуть, можу зробити краще, якщо б більше подумав про це, але це те, що я придумав лише через кілька хвилин. Мій перший гольф, так це було досить весело!

Завдяки @Dada та @ TùxCräftîñg (і купа незначних оптимізацій байтів) на -40 байт


1
Я думаю, що ти можеш залишити пробіли після mys, the returnта print(Не можу тестувати, не маю
перл

1
@ TùxCräftîñg правий про те return. printМоже замінити say. Більшість з myних не потрібні (вам потрібна лише одна раніше $aу функції, на яку я думаю. Не ініціалізуйте і не заявляйте @b. Ви, ймовірно, можете відмовитися від ініціалізації, $iякщо ви зробите $i++на початку часу, а не в кінці. pop) коротше , ніж shiftмати у вигляді , що є набагато більше PERL гри в гольф , ніж просто видалення пробілів і нового рядка ....
дада

0

JavaScript (ES6), 58

n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

Менше гольфу

n=>{
  a=[];
  a[1] = 1;
  for(i = 0; n;)
  {
    ++i
    if (a[i])
    {
      a[2*i+1] = 1;
      a[3*i-1] = 1;
      --n;
    }
  }
  return i
}

Тест

Про час і пам'ять: елемент 500000 в ~ 20 сек і 300 МБ, використовуваний моїм 64-бітним альфам FireFox

F=
n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

function test() {
  var n=+I.value, t0=+new Date
  O.textContent = F(n)
  console.log((+new Date-t0)/1000,'sec')
}  

test()
#I { width:5em}
<input id=I type=number value=10 oninput="test()"> 
<span id=O></span>

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