Anexar, Anexar-Sequência

14

Tarefa

O prefpend, append-Sequence é definido recursivamente, como este

  • a (1) = 1
  • a (n) = a (n-1) .n, se n for par
  • a (n) = na (n-1), se n for ímpar

onde o . representa uma concatenação inteira.

Portanto, os primeiros termos são: 1,12,312,3124,53124,531246,7531246,...Este é A053064 .

Sua tarefa é, dado um inteiro a> 0 para retornar n , tais que o n º elemento na preceder, acrescentar-Sequence é igual a um e se existe tal n existe retorno 0, um número negativo ou erro fora etc.

Regras

  • A entrada pode ser tomada como um número inteiro, sequência, lista de caracteres / dígitos, etc.
  • A saída pode ser impressa em STDOUT ou retornada (número inteiro, sequência etc. está correto)
  • Na entrada inválida e, no caso de não existir esse n, seu programa pode fazer qualquer coisa, exceto retornar um número inteiro positivo (por exemplo: loop para sempre, retornar 0 etc.)
  • Você pode optar por usar a indexação 0, mas a saída, caso não exista n, não pode ser 0

Casos de teste

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100
ბიმო
fonte
Mais formal: a(n-1)*(int(log(n))+1)+ne n*(int(log(n))+1)+a(n-1)?
Mr. Xcoder
1
@ Mr.Xcoder eu chamaria que menos formais: P
post rock Garf Hunter
@ JonathanAllan Isso já está em questão há ~ 10 minutos.
Mr. Xcoder
2
Eu sugiro permitir erros para entradas inválidas.
Kritixi Lithos
Eu sugiro permitir um comportamento indefinido para entradas inválidas.
Mr. Xcoder

Respostas:

6

JavaScript (ES6), 40 bytes

Recebe a entrada como uma sequência. Lança um erro de recursão se nenhum índice for encontrado.

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

Demo

Arnauld
fonte
Eu acho que você pode salvar um byte com esta: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock
@ RickHitchcock Infelizmente, isso forçaria comparações de números e introduziria falsos positivos em entradas grandes causadas pela perda de precisão.
Arnauld
Peguei vocês. Ele funciona nos casos de teste, mas não tinha certeza de como lidaria com outras situações.
21717 Rick Stallone
6

C # (.NET Core) , 83, 80, 60 59 bytes

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

Experimente online!

Leva a entrada como uma string para uma função lambda. 1 indexado. Retorna o índice do valor para truthy ou infinitamente loops para um "falsey"

jkelm
fonte
6

Python 2 , 63 bytes

-1 byte graças a @EriktheOutgolfer .

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

Experimente online!

Python 2 , 64 bytes

-18 bytes graças a @officialaimm , porque eu não percebi que o erro era permitido!

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

Experimente online!

Python 2 , 82 bytes (não executa um loop para sempre)

Este retorna 0para entradas inválidas.

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

Experimente online!

Mr. Xcoder
fonte
2
Ninja'd: D 65 bytes
officialaimm
@officialaimm Muito obrigado! Eu não notei que o erro / loop para sempre foi permitido.
Mr. Xcoder
Salve um byte com uma lambda:f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j
Erik the Outgolfer
@EriktheOutgolfer Espere, gera erro de recursão para tudo, embora eu tenha definido sys.setrecursionlimit(). Você pode fornecer um tio?
Mr. Xcoder
@ Mr.Xcoder Isso gera um erro x=1? Ou x=12? Eu pensei que apenas jogou um erro para pelo menos x=151311975312468101214ou algo assim.
Erik the Outgolfer
3

Gelatina , 12 bytes

Rs2ZU1¦ẎVµ€i

Experimente online!

Explicação:

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)
Erik, o Outgolfer
fonte
3

05AB1E , 14 bytes

$vDNÌNFs}«})Ik

Experimente online! ou como um conjunto de testes

Explicação

Indexado a 0 .
Retorna -1 se a entrada não estiver na sequência.

$                 # 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
Emigna
fonte
Haha, essa é basicamente a minha solução com a coisa gremovida e a anexada / anexada abreviada. Excluirei minha resposta
Okx
@ Ok: Ah, sim, vejo que você jogou a sua quase exatamente isso apenas alguns minutos após o meu post. Grandes mentes;)
Emigna
2

R , 73 bytes

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

Lê de stdin e retorna o valor do índice (impresso implicitamente). Loops infinitos quando o valor não está na sequência. Fé por padrão FALSEconvertido para 0quando usado em aritmética.

Experimente online!

Giuseppe
fonte
1

Mathematica, 135 bytes

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~#&
J42161217
fonte
1

Geléia ,  19 18  15 bytes

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

Um link monádico recebendo e retornando números inteiros.

Experimente online! (muito lento - leva aproximadamente 50 anos no TIO apenas para confirmar que3124está no índice4)

Para uma versão muito mais rápida, use o 18 byter anterior (apenas verifica o comprimento da entrada, o que é suficiente).

Quão?

+ḂḶṚ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)
Jonathan Allan
fonte
Quanto tempo levaria para calcular 211917151311975312468101214161820?
Okx 07/08/19
Um longo, muito tempo: p
Jonathan Allan
Sim, mas quanto tempo?
Okx 07/08/19
Bem, parece que é a ordem v ao quadrado onde v é o número inteiro de entrada.
Jonathan Allan
@JonathanAllan Tecnicamente, você chama isso : p
Erik o Outgolfer
1

Swift 4 , 92 bytes

Isso faz loop infinitamente para casos inválidos, então não os incluí no link de teste.

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)}

Suíte de teste.

Divertidamente, é mais longo com um fechamento:

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}

Suíte de teste.

Mr. Xcoder
fonte
1

Haskell , 115 85 bytes

s=read.(show=<<)
f 1=1
f x|odd x=s[x,f$x-1]
f x=s[f$x-1,x]
g x=[n|n<-[1..],x==f n]!!0

Experimente online!

Post Rock Garf Hunter
fonte
@BruceForte Na verdade, consegui economizar 30 graças à sua sugestão.
Post Rock Garf Hunter
1

Perl 5 , 54 + 1 (-n) = 55 bytes

$a=++$,%2?$,.$a:$a.$,while length$a<length;say/$a/&&$,

Experimente online!

Retorna nada se não for encontrado.

Xcali
fonte
1

Haskell, 75 71 57 bytes

f n=[i|i<-[1..],(show=<<reverse[1,3..i]++[2,4..i])==n]!!0

Toma ncomo uma corda.

Experimente online!

nimi
fonte