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

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


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"


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!


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)

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

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!


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~#&

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)

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.




Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.