препенд, додавання-Послідовність


14

Завдання

Попередження, додавання-послідовність визначається рекурсивно, як це

  • a (1) = 1
  • a (n) = a (n-1) .n, якщо n парне
  • a (n) = na (n-1), якщо n непарне

де . являє собою ціле число конкатенації.

Тож перші кілька термінів: 1,12,312,3124,53124,531246,7531246,...Це A053064 .

Ваше завдання задається цілим числом a> 0, щоб повернути n , таким чином, що n- й елемент в препендері, append-Послідовність дорівнює a, а якщо такого n немає, повертається 0, від'ємне число або помилка і т.д.

Правила

  • Введення можна сприймати як ціле число, рядок, список символів / цифр тощо.
  • Вихід можна надрукувати в STDOUT або повернути (ціле число, рядок тощо).
  • На неприпустимому введенні і в разі відсутності такого п не існує ваша програма може зробити що - небудь , але повертає позитивне ціле число (наприклад, нескінченний цикл, повернення 0 і т.д.)
  • Ви можете скористатися 0-індексуванням, але тоді вихід у випадку, коли немає n, не може бути 0

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

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100

Більш офіційні: a(n-1)*(int(log(n))+1)+n і n*(int(log(n))+1)+a(n-1)?
Містер Xcoder

1
@ Mr.Xcoder Я б назвав це менш формальним: P
Post Rock Garf Hunter

@JonathanAllan Про це вже йдеться за ~ 10 хвилин.
Містер Xcoder

2
Я пропоную дозволити помилки для недійсних даних.
користувач41805

Я пропоную дозволити невизначене поведінку для недійсних даних.
Містер Xcoder

Відповіді:


6

JavaScript (ES6), 40 байт

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

f=(n,s=k='1')=>n==s?k:f(n,++k&1?k+s:s+k)

Демо


Я думаю, ви можете зберегти байт за допомогою цього: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Рік Хічкок

@RickHitchcock На жаль, це змусить порівняти кількість і ввести помилкові позитиви на великих входах, спричинені втратою точності.
Арнольд

Готча. Він працює на тестових випадках, але не знав, як він вирішить інші ситуації.
Рік Хічкок

6

C # (.NET Core) , 83, 80, 60 59 байт

n=>{int i=0;for(var t="";t!=n;)t=++i%2<1?t+i:i+t;return i;}

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

Приймає вхід як рядок у функцію лямбда. 1-індексований. Повертає індекс значення для truthy або нескінченно циклів для "falsey"


6

Python 2 , 63 байти

-1 байт завдяки @EriktheOutgolfer .

f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j

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

Python 2 , 64 байти

-18 байт завдяки @officialaimm , тому що я не помітив помилок, було дозволено!

x,i,j=input(),'1',1
while i!=x:j+=1;i=[i+`j`,`j`+i][j%2]
print j

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

Python 2 , 82 байти (не циклічно вічно)

Ця повертається 0за недійсні введення.

def f(n,t="",i=1):
 while len(t)<len(n):t=[t+`i`,`i`+t][i%2];i+=1
 print(n==t)*~-i

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


2
Ninja'd: D 65 байт
officialaimm

@officialaimm Дякую велике! Я не помітив помилок / цикл назавжди було дозволено.
Містер Xcoder

Збережіть байт з лямбда:f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j
Ерік Аутгольфер

@EriktheOutgolfer Зачекайте, вона кидає помилку рекурсії на все, хоча я встановив sys.setrecursionlimit(). Чи можете ви надати tio?
Містер Xcoder

@ Mr.Xcoder Чи видає це помилку x=1? Або x=12? Я думав, що це лише кинуло таку помилку хоча б x=151311975312468101214чи щось.
Ерік Аутгольфер


3

05AB1E , 14 байт

$vDNÌNFs}«})Ik

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

0-індексований .
Повертає -1, якщо введення не в послідовності.

$                 # push 1 and input
 v                # for each y,N (element, index) in input do:
  D               # duplicate top of stack
   NÌ             # push N+2
     NF }         # N times do:
       s          # swap the top 2 elements on the stack
         «        # concatenate the top 2 elements on the stack
          })      # end loop and wrap in a list
            Ik    # get the index of the input in this list

Ха-ха, це в основному моє рішення із gвидаленою та доданою / доданою річчю скороченою. Я
видалю

@Okx: О так, я бачу, що ти переграв своїх майже до цього лише через кілька хвилин після моєї публікації. Великі уми;)
Емінья

2

R , 73 байти

p=paste0;n=scan(,'');l='';while(l!=n){F=F+1;l="if"(F%%2,p(F,l),p(l,F))};F

Читає з stdin та повертає значення індексу (друкується неявно). Нескінченні цикли, коли значення не в послідовності. Fза замовчуванням FALSEпризначається, 0коли використовується в арифметиці.

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


1

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

s=t={};x=1;While[x<5!,{s~AppendTo~#&,s~PrependTo~#&}[[x~Mod~2+1]]@x;AppendTo[t,FromDigits@Flatten[IntegerDigits/@s]];x++];t~Position~#&

1

Желе ,  19 18  15 байт

+ḂḶṚm2;RḤ$ṁµ€Vi

Монадійне посилання, що приймає і повертає цілі числа.

Спробуйте в Інтернеті! (дуже повільно - займає ~ 50 секунд на TIO просто для підтвердження того, що3124знаходиться в індексі4)

Для набагато швидшої версії використовуйте попередній 18 байт (перевіряє лише довжину введення, що достатньо).

Як?

+ḂḶṚm2;RḤ$ṁµ€Vi - Link: number, v
           µ€   - perform the monadic link to the left for €ach k in [1,2,3,...v]
                -                 (v can be big, lots of k values makes it slow!)
 Ḃ              -   modulo k by 2  = 1 if odd 0 if even
+               -   add to k = k+isOdd(k)
  Ḷ             -   lowered range = [0,1,2,...,k+isOdd(k)]
   Ṛ            -   reverse = [k+isOdd(k),...,2,1,0])
    m2          -   modulo slice by 2 = [k+isOdd(k),k+isOdd(k)-2,...,3,1]
         $      - last two links as a monad:
       R        -   range(k) = [1,2,3,...,k]
        Ḥ       -   double = [2,4,6,...,2k]
     ;          - concatenate = [k+isOdd(k),k+isOdd(k)-2,...,3,1,2,4,6,...,2k]
         ṁ      - mould like range(k) = [k+isOdd(k),k+isOdd(k)-2,...,3,1,2,4,6,...,k-isOdd(k)]
                -   (this is a list of the integers to be concatenated for index k)
             V  - evaluate as Jelly code (yields a list of the concatenated integers)
              i - first index of v in that (or 0 if not found)

Скільки часу знадобиться для обчислення 211917151311975312468101214161820?
Okx

Довгий, довгий час: p
Джонатан Аллан

Так, але як довго?
Okx

Добре виглядає, що це порядок v квадрат, де v - ціле число введення.
Джонатан Аллан

@JonathanAllan Технічно ви називаєте це : p
Ерік Попечитель

1

Швидкий 4 , 92 байти

Це петлі нескінченно для недійсних випадків, тому я не включав їх у посилання для тестування.

func f(x:String){var i="1",j=1;while i != x{j+=1;i=[i+String(j),String(j)+i][j%2]};print(j)}

Тестовий сюїт.

Кумедно, це довше із закриттям:

var f:(String)->Int={var i="1",j=1;while i != $0{j+=1;i=[i+String(j),String(j)+i][j%2]};return j}

Тестовий сюїт.




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