Эта задача о рекурсии (нить Копса)

15

Нить ментов

В этой теме ваша задача - создать рекурсивную программу / функцию для генерации любых целочисленных рядов. Грабители попытаются найти более короткое нерекурсивное решение в теме Грабителей .

Краткий обзор задачи

Во многих языках рекурсивные функции могут значительно упростить задачу программирования. Тем не менее, синтаксические издержки для правильной рекурсии могут ограничивать ее применимость в коде-гольфе.

В копы будут создавать программу или функцию , принимая одно целое число n, которое будет генерировать первые nзаписи целочисленного ряда, используя только рекурсии 1 . Они также должны убедиться, что существует более короткий нерекурсивный способ генерации последовательности, чтобы пометить их запись как безопасную.

В разбойниках будут пытаться найти более короткую программу или функцию на том же языке, генерируя то же целое ряд, не используя рекурсии 2 .

Если представление полицейских не будет взломано в течение десяти дней (240 часов), полицейский докажет, что на самом деле можно было использовать более короткий нерекурсивный подход, раскрыв свое собственное решение. Затем они могут пометить свое представление как безопасное .

Победителем соревнования полицейских станет самое короткое (согласно ) представление на основе рекурсии, помеченное как безопасное.

Победителем конкурса грабителей станет грабитель, взломавший большинство решений.

1: он должен быть только рекурсивным в синтаксисе; Вам не нужно беспокоиться, например, об оптимизации хвостового вызова.

2: опять же, не рекурсивный в синтаксисе; поэтому вы не можете опубликовать рекурсивное решение и заявить, что оно скомпилировано в цикл благодаря оптимизации хвостового вызова.

Требования к подаче

Каждое представление будет принимать одно целое число n(от нуля до единицы). Затем отправка выведет или вернет первые nзаписи целочисленной серии по выбору. (обратите внимание, что этот целочисленный ряд не должен зависеть отn ). Метод ввода и вывода может отличаться между рекурсивным и нерекурсивным подходом. Целочисленный ряд может быть любым детерминированным рядом с длиной не менее 5. Ряд должен быть объяснен должным образом.

Ваше представление не должно работать для произвольно большого n, но должно работать по крайней мере n=5. Нерекурсивный подход должен быть способен работать, по крайней мере, так же, nкак рекурсивный подход, или до n=2^15-1того, что меньше.

Рекурсия

Ради этой задачи рекурсия определяется как создание желаемой последовательности с использованием функции (или подобной функции конструкции), которая вызывает себя (или вызывает последовательность функций, которая в конечном итоге вызывает сама себя; это включает в себя конструкции, подобные комбинатору Y). Глубина рекурсии должна уходить в бесконечность, а nв бесконечность. Нерекурсивный подход - это все, что не является рекурсивным.

Sanchises
источник
Для тимьяна, где forделается рекурсивный позади, forрекурсивный или цикл?
14 м2
Могу ли я сказать, что код работает для произвольно большого размера, nесли он теоретически верен, но его нельзя запустить из-за нехватки времени или памяти?
Bubbler
@Bubbler Конечно, но по крайней мере n=5должен быть вычислен
Sanchises
@ l4m2 Не все языки могут конкурировать. Кажется, что у этого языка нет родного способа не использовать рекурсию (если он xforне доступен через какой-то импорт?), Поэтому, возможно, этот язык не может конкурировать.
Sanchises
Рекурсив, который не идет так много, когда n становится большим, это рекурсив?
14 м2, 14

Ответы:

4

Python 3 , 65 байт (безопасно)

f=lambda n,a=3,b=0,c=6,d=6:n*[1]and[a+b]+f(n-1,c,d,2*c+d,2*a+3*b)

Попробуйте онлайн!

Еще одна попытка в Python.

Последовательность - это «количество способов заполнить доску размером 2 на n домино в трех цветах, чтобы никакие домино одного цвета не соприкасались друг с другом». Не в OEIS.


Давайте скажем n=6. Доска выглядит так:

######
######

и это действительные плитки домино в трех цветах ( 1-3представляют цвет каждый):

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

но это не так (два домино одного цвета касаются друг друга):

112323 332333 211113
112323 112311 233223

Последовательность подсчитывает все возможные значения домино, которые удовлетворяют правилам для каждого n.


Предполагаемое решение, 58 байт

n=int(input());a=3;b=12
for _ in[0]*n:print(a);a,b=b,a*4+b

Попробуйте онлайн!

К сожалению, похоже, никто не удосужился упростить рекуррентное отношение, что было ясно показано в рекурсивном коде. Создание программы с заданным двойным повторением как есть, не работает, так как это Python 3.

фонтанчик для питья
источник
1
Не могли бы вы дать более подробное объяснение последовательности, пожалуйста.
февраля
@tsh Добавил некоторые объяснения. Это выглядит лучше?
Bubbler
2

Октава , 47 байт, трещины на l4m2

@(n)(f=@(r,m){@()[r(r,m-1),m],[]}{~m+1}())(f,n)

Попробуйте онлайн!

Например, вот запись Octave, которая генерирует первые nположительные целые числа, https://oeis.org/A000027 .

Sanchises
источник
Трещины . +1 за создание рекурсивной анонимной функции, хотя ... Не часто они используются :)
Stewie Griffin
@StewieGriffin Мне очень нравятся рекурсивные анонимные функции игры в гольф в Octave, хотя они никогда не оказываются короче, чем их основанная на петлях версия. Обратной стороной этого вызова, безусловно, будет вызов в Октаве для полицейских.
Sanchises
@StewieGriffin Кстати, не уверен, что пинг в чате сработал, но l4m2побил вас.
Sanchises
2

Python 3 , 75 байт, взломан xnor

f=lambda n,a=[1]:a*n and[a[0]]+f(n-1,sorted({*a[1:],a[0]*2,a[0]*3,a[0]*5}))

Попробуйте онлайн!

Знаменитые числа Хэмминга, или 5-гладкие числа ( A051037 ).

Взломанное решение, 51 байт

lambda n:[k for k in range(1,2**n)if 60**k%k<1][:n]

Попробуйте онлайн!

Предполагаемое решение, 74 байта

lambda n:sorted(2**(i%n)*3**(i//n%n)*5**(i//n**2)for i in range(n**3))[:n]

Попробуйте онлайн!

фонтанчик для питья
источник
2

Forth (gforth) , 39 байт, взломан NieDzejkob

: | dup 1 > if dup 1 - recurse then . ;

Попробуйте онлайн!

jmarkmurphy
источник
1
Вам разрешено другое целочисленное число, чем [1,2,...,n], вы знаете, правильно?
Sanchises
Трещины
NieDzejkob
Я думал об этом, потому что крэк - это всего лишь поиск в Google для подсчитанных циклов с использованием вперед. Но на самом деле все, что находится внутри функции, в любом случае может быть легко воссоздано внутри цикла.
Jmarkmurphy
2

Рёда , 40 байт

f x,a=1,b=2{[a];f x-1,a=b,b=a+b if[x>1]}

Попробуйте онлайн!

Эта функция дает следующую конечную последовательность (90 первых чисел Фибоначчи):

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264
806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309

Я знаю, что он может генерировать больше чисел Фибоначчи, но для этой задачи достаточно произвести эти числа.

fergusq
источник
1

JavaScript (Node.js) , 91 байт, взломан l4m2

f=x=>[w=~-x&&(g=(n,y=2)=>~-n&&(n<y?1:n%y?g(n,y+1):1+g(n/y,y)))(x)+f(x-1),console.log(w)][0]

Попробуйте онлайн!

Печатает первые n членов последовательности OEIS A022559 (начиная с i = 1).

l4m2 поместил 3 петли в 74 72 байта и взломал мой пост полицейского:

n=>{for(i=s=0;j=i++<n;console.log(s))for(x=i;j++<i;)for(;x%j<1;x/=j)s++}

Тем не менее, мой предполагаемый ответ на самом деле имеет только 2 для циклов:

n=>{for(i=c=0;i++<n;console.log(c))for(p=2,z=i;p<=z;z%p?p++:(z/=p,c++));}

Попробуйте онлайн!

Сиеру Асакото
источник
@ l4m2 На самом деле у меня есть 73-байтовый;) В любом случае поздравляю
Shieru Asakoto
Играйте в гольф, парень. Сейчас 72 @ user71546
l4m2
1

x86 .COM функция, 12 байт, взломан NieDzejkob

0000 52                     push dx
0001 4A                     dec dx
0002 7403                   je 0007
0004 E8F9FF                 call 0000
0007 58                     pop ax
0008 F7E0                   mul ax
000A AB                     stosw


000B C3                     ret

Вход DX, Выход [DI] ~ [DI + 2 * DX-1]

Взломщик решение:

0: 31 C0    xor ax, ax
2: BF 01 00 mov di, 1
5: 01 F8    add ax, di
7: AB       stosw
8: E2 FB    loop 5
A: C3       ret

Предполагаемое решение:

  xor bx,bx
c:inc bx
  mov ax,bx
  mul ax
  stosw
  loop c
  ret
l4m2
источник
Трещины
NieDzejkob
Я изменил метод вывода. Ты можешь посмотреть?
NieDzejkob
1

Python 3 , 62 байт, Cracked по mwchase

def f(x):
 if(x<1):return[1]
 return f(x-1)+[sum(f(x-1)[-2:])]

Попробуйте онлайн!

Я чувствую, что это будет слишком легко ...

Последовательность представляет собой последовательность Фибоначчи f(n) = f(n-1) + f(n-2)сf(0) = f(1) = 1

PunPun1000
источник
Вы можете переключиться на встроенный троичный оператор, составленный из логических операторов, который помещает его в один оператор, который затем может идти непосредственно после двоеточия. Сохраняет не менее восьми байт.
mwchase
Переключение на лямбда сохраняет два (РЕДАКТИРОВАТЬ: четыре) больше.
mwchase
2
@mwchase, в то время как я ценю ваши предложения и буду помнить их для будущих представлений о гитаре с кодом Python, я не буду играть в копы с полицейскими и грабителями по нескольким причинам. Во-первых, если я продолжу играть в гольф, тогда он устанавливает движущуюся цель для грабителя, что нежелательно в этом типе поста. Во-вторых, это означало бы, что мне нужно будет сыграть итеративную версию в гольф, что я не смогу сделать в той же степени
PunPun1000
треснул
mwchase
1

Gol> <> , 15 байт, взломан mbomb007

I1AZZ;
M:K:?ZNB

Попробуйте онлайн!

Серия 0,1,2,3,4,5 каждый элемент, за которым следует столько нулей.

Например, первые несколько значений:

 1: 0  First element, followed by 0 zeroes
 2: 1  Followed by 1 zero
 3: 0
 4: 2  Followed by 2 zeroes
 5: 0
 6: 0
 7: 3  Followed by 3 zeroes
 8: 0
 9: 0
10: 0
    etc.
Джо Кинг
источник
Трещины
mbomb007
0

JavaScript, 63 байта, взломан

f=x=>(x?[f(x-1)[0]&&1?3*f(x-1)[0]+1:f(x-1)[0]/2,...f(x-1)]:[7])

Попробуйте онлайн!

Возвращает первые n элементов в обращенном массиве

fənɛtɪk
источник
Также обратный возврат массива в настоящее время не разрешен
l4m2
0

Windows .BAT, 80 байт

@set /a n=%1-1
@echo 8%3
@if 0 neq %n% @call %0 %n% 2%3 6%2%3

Использование:

CD <PATH>
<FILENAME> <N_1>
<FILENAME> <N_2>
<FILENAME> <N_3>

Версия цикла может предполагаться в текущем словаре, но должна быть инициализирована или сброшена

l4m2
источник
0

Python, 82 байта; Трещины

Это рекурсивная реализация Python последовательности OEIS A004001 в 82 байта. Дополнительную информацию об этой серии можно найти на Mathworld Вольфрама .

def A(n):
 if n in[1,2]:return[1]*n
 S=A(n-1);return S+[S[S[n-2]-1]+S[n-S[n-2]-1]]

Первые 30 чисел в этой последовательности:

1, 1, 2, 2, 3, 4, 4, 4, 5, 6, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16
agtoever
источник