Створіть послідовність покажчиків


12

Дозволяє визначити послідовність покажчиків , щоб бути будь-якою послідовністю таким чином, що а (п) = а ((п-1) - (а (п-1))) FORALL п більше деякого кінцевого числа. Наприклад, якщо наша послідовність розпочалася з

3 2 1 

Наступним нашим терміном буде 2, тому що a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (цей приклад - нульовий індекс, проте не має значення, для якого індексу ви використовуєте обчислення завжди бути однаковим.). Якщо ми повторимо процес, отримаємо нескінченну послідовність

3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2

Завдання

З огляду на деякий початковий масив додатних цілих чисел вивести послідовність покажчиків, починаючи з цього масиву.

Типи виводу

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

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


Вам ніколи не буде надана послідовність, яка потребує індексації до початку послідовності. Наприклад 3, не є дійсним введенням, тому що вам потрібні терміни до, 3щоб вирішити наступний термін.

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

Випробування

тестові випадки усічені для простоти

2 1   -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...

Чи дозволено виводити n додаткових термінів на додаток до вхідного масиву? Або n -й термін, що починається після тих, що надаються як вхідні дані?
Луїс Мендо

@LuisMendo Впевнений, що будь-яка індексація нормальна.
Ad Hoc Hunter Hunter

Відповіді:


8

JavaScript (ES6), 25 байт

a=>f=n=>a[n]||f(--n-f(n))

Анонімна функція, яка при виклику створює функцію, fяка дає елемент у заданому індексі в послідовності.

Будь ласка, дайте мені знати, якщо я щось зрозумів неправильно ...


Ви телефонуєте f(n)з f(n). Я не думаю, що це колись припиниться, але я не знаю JS.
Ad Hoc Hunter Hunter

@FunkyComputerMan Коли nбуде достатньо низький, a[n]поверне триєдне значення, тому ||коротке замикання і запобіжить його нескінченному повторенню.
ETHproductions

Так, я це зрозумів, але nне опускається під час кожного дзвінка. Я впевнений, що якщо nбільша довжина, то aви ніколи не зупиняться.
Ad Hoc Hunter Hunter

2
@FunkyComputerMan Він йде отримати нижче при кожному виклику, --nпризначити nдля n-1так що наступна посилання на нього буде посилатися на декрементируется n.
Ерік Аутгольфер

2
@FunkyComputerMan --nдекременти n, це означає, що f(--n-f(n))це те саме, щоf((n-1)-f(n-1))
ETHproductions

5

Лушпиння , 7 6 байт

¡S!o_L

Повертає нескінченний список. Спробуйте в Інтернеті! Зауважте, що TIO потребує деякого часу, щоб обрізати та надрукувати результат.

Пояснення

Оператор ¡має кілька значень. Тут я використовую "побудувати нескінченний список шляхом ітерації функції, яка обчислює новий елемент зі списку існуючих". Враховуючи список довжини N , новий елемент матиме індекс на основі N + 1 . Все, що нам потрібно зробити, це заперечити останній елемент списку (який є попереднім значенням) та індексувати його до списку, використовуючи результат.

¡S!o_L  Implicit input.
¡       Construct infinite list by iterating this function on input:
 S!      Element at index
    →    last element
  o_     negated.

4

Haskell , 36 байт

Бере список і повертає функцію, яка індексує послідовність

l!n|n<length l=l!!n|e<-n-1=l!(e-l!e)

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

Пояснення

Тут ми визначаємо функцію, !яка бере список lта індекс n. Якщо nменше , ніж довжина lіндексованих lпо n, в іншому випадку ми повертаємо l!((n-1)-l!(n-1)). З цього випливає рекурсивне визначення функції, яку я дав у питанні.

Ось та сама програма невольф.

a l n
 |n<length l = l!!n
 |otherwise = (a l) ((n-1) - (a l) (n-1))

Я використовую e<-n-1замість іншого, щоб зберегти байти, призначаючи n-1їх, eщоб потім можна було використовувати.


4

MATL , 13 9 байт

:"tt0)_)h

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

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

Пояснення

:"      % Implicitly input n. Do the following n times
  tt    %    Duplicate the sequence so far, twice. In the first iteration this
        %    implicitly inputs the array of initial terms
  0)    %    Get value of the last entry, say m
  _)    %    Get value of the entry which is m positions back from the last
  h     %    Append. This extends the array with the new entry
        % Implicit end. Implicitly display




2

Желе , 6 байт

NṪịṭµ¡

Приймає послідовність S і ціле число K , і додає K терміни для S .

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

Як це працює

NṪịṭµ¡  Main link. Left argument: S (sequence). Right argument: k (integer)

    µ¡  Combine the links to the left into a (variadic) chain and call it k times.
        The new chain started by µ is monadic, so the chain to the left will be
        called monadically.
N           Negate; multiply all elements in S by -1.
 Ṫ          Tail; retrieve the last element, i.e., -a(n-1).
  ị         At-index; retrieve the element of S at index -a(n-1).
            Since indexing is modular and the last element has indices n-1 and 0,
            this computes a( (n-1) - a(n-1) ).
   ṭ        Tack; append the result to S.


1

CJam, 10 байт

{{(_j-j}j}

Для CJam це дуже добре (це навіть б'є 05ab1e!).

Це анонімний блок, який очікує введення у формі i nна стеку, де iє індекс у послідовності та nє масивом стартових чисел.

Причина цього працює так добре в jоператорі, який забезпечує запам'ятовується рекурсію з набору вихідних значень.

Пояснення:

{    Function j(n) with [j(0), j(1), j(2)] = [4, 3, 1], return j(6):
 (    Decrement:    5
 _    Duplicate:    5 5
 j    j(5):
  (    Decrement:   5 4
  _    Duplicate:   5 4 4
  j    j(4):
   (    Decrement:  5 4 3
   _    Duplicate:  5 4 3 3
   j    j(3):
    (    Decrement: 5 4 3 2
    _    Duplicate: 5 4 3 2 2
    j    j(2) = 1:  5 4 3 2 1
    -    Subtract:  5 4 3 1
    j    j(1) = 3:  5 4 3 3
   -    Subtract:   5 4 0
   j    j(0) = 4:   5 4 4
  -    Subtract:    5 0
  j    j(0) = 4:    5 4
 -    Subtract:     1
 j    j(1) = 3:     3
}j   End:           3

1

Java (8), 60 байт

int a(int[]a,int n){return n<a.length?a[n]:a(a,--n-a(a,n));}

Бере два входи (цілий масив aі ціле число n) і виводить n'-ме значення послідовності.

Пояснення:

Спробуйте тут. (Може зайняти кілька секунд.)

int a(int[]a,int n){        // Method with int[] and int parameters and int return-type
  return n<a.length?        //  If input `n` is smaller than the length of the array:
          a[n]              //   Output the `n`'th item of the array
         :                  //  Else:
          a(a,--n-a(a,n));  //   Recursive call with `n-1-a(n-1)`
}                           // End of method


0

05AB1E , 20 байт

#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼

Очікує, що введення є розділеним пробілом рядком, продовжує виводити нескінченно; досить просто реалізація

Приклад виконання:

$ 05ab1e -e '#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼' <<< '3 2 1'
3
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2

0

Java (OpenJDK 8) , 95 93 91 90 байт

a->i->{int j=0,b[]=new int[++i];for(;j<i;j++)b[j]=j<a.length?a[j]:b[~-j-b[j-1]];return b;}

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


Чи не b[(j-1)-...]рівнозначно b[~-j-...]?
Джонатан Фрех

Ви можете звернути трійчастий від j>=a.lengthдо j<a.lengthзберегти байти: j<a.length?a[j]:b[~-j-b[j-1]]. Мені також цікаво: чому ви пішли з циклічним підходом, коли рекурсивний підхід, який також пояснюється в описі завдання, складає всього 60 байт?
Кевін Кройсейсен

Мені не подобається відповідати методами, і AFAIK на функцію самопосилань потрібна відповідь на повну програму
Роберто Грем

@RobertoGraham Ні, рекурсивний метод не може бути лямбда, тому це повинен бути метод стилю Java 7. Але все ж дозволяється просто розміщувати метод (стиль Java 7) замість повної програми.
Кевін Кройсейсен

@KevinCruijssen Я зробив вашу відповідь на BiFunction. Спробуйте в Інтернеті! . Це можливо, але вам потрібно опублікувати всю програму, оскільки вона посилається на Main
Roberto Graham

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