перед именем, конкатенирующего Sequence


14

задача

Prepend, append-Sequence определяется рекурсивно, как это

  • а (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- й элемент в prepend, append-Sequence был равен a, и если такого n не существует, вернуть 0, отрицательное число или ошибку и т. Д.

правила

  • Входные данные могут быть приняты как целое число, строка, список символов / цифр и т. Д.
  • Вывод может быть напечатан в STDOUT или возвращен (целое число, строка и т. Д. В порядке)
  • При неверном вводе и в случае, если такого n не существует, ваша программа может делать что угодно, но возвращать положительное целое число (например, цикл навсегда, возврат 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

@JonathanAllan Это уже в вопросе в течение ~ 10 минут.
г-н Xcoder

2
Я предлагаю разрешить ошибки для неверных входных данных.
Kritixi Lithos

Я предлагаю разрешить неопределенное поведение для некорректных входных данных.
г-н 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-индексироваться. Возвращает индекс значения для правдивых или бесконечных циклов для «фальси»


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

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



@officialaimm Большое спасибо! Я не заметил, что ошибка / цикл навсегда был разрешен.
Мистер Xcoder

Сохраните байт с помощью лямбды:f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j
Эрик Outgolfer

@EriktheOutgolfer Подождите, он выдает ошибку рекурсии для всего, хотя я установил sys.setrecursionlimit(). Можете ли вы предоставить TIO?
Мистер Кскодер

@ Mr.Xcoder Выдает ошибку для x=1? Или x=12? Я думал, что это только бросило такую ​​ошибку по крайней мере x=151311975312468101214или что-то.
Эрик Outgolfer

3

Желе , 12 байт

Rs2ZU1¦ẎVµ€i

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

Объяснение:

Rs2ZU1¦ẎVµ€i
         µ€  Eval this link for each (automatic [1..n] range)
R             Range
 s2           Split in pieces of: 2
   Z          Zip
    U1¦       Only keep index: 1 of: Vectorized reverse
       Ẏ      Flatten 1-deep
        V     Concatenate string versions and eval
           i Find index of y in x (y = implicit input)

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

@Okx: О, да, я вижу, ты играешь в гольф почти ровно через несколько минут после моего поста. Великие умы;)
Emigna

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

Читает из стандартного ввода и возвращает значение индекса (неявно печатается). Бесконечные циклы, когда значение отсутствует в последовательности. Fпо умолчанию, FALSEкоторый приводится 0при использовании в арифметике.

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


1

Mathematica, 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

Очень долго: р
Джонатан Аллан

Да, но как долго?
Okx

Похоже, это порядок v в квадрате, где v - входное целое число.
Джонатан Аллан

@JonathanAllan Технически вы называете это : р
Эрик Outgolfer

1

Swift 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.