Обчисліть А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.