ajouter, ajouter-séquence

14

Tâche

Le préfixe, la séquence append est défini de manière récursive, comme ceci

  • a (1) = 1
  • a (n) = a (n-1) .n, si n est pair
  • a (n) = na (n-1), si n est impair

où le . représente une concaténation entière.

Les premiers termes sont donc les suivants: 1,12,312,3124,53124,531246,7531246,...Il s'agit du A053064 .

Votre tâche est, étant donné un entier a> 0 pour revenir n , tel que le n ième élément dans le précédez, append-séquence est égal à un et si aucun n existe return 0, un numéro de négatif ou d'une erreur sur etc.

Règles

  • L'entrée peut être prise comme un entier, une chaîne, une liste de caractères / chiffres, etc.
  • La sortie peut être imprimée sur STDOUT ou renvoyée (entier, chaîne, etc. est très bien)
  • Sur une entrée invalide et dans le cas où un tel n n'existe pas, votre programme peut faire autre chose que retourner un entier positif (par exemple, boucle pour toujours, retourne 0, etc.)
  • Vous pouvez choisir d'utiliser l'indexation 0, mais la sortie dans le cas où aucun n n'existe ne peut pas être 0

Cas de test

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100
ბიმო
la source
Plus formel: a(n-1)*(int(log(n))+1)+net n*(int(log(n))+1)+a(n-1)?
M. Xcoder
1
@ Mr.Xcoder J'appellerais cela moins formel: P
Post Rock Garf Hunter
@JonathanAllan C'est déjà dans la question depuis ~ 10 minutes.
M. Xcoder
2
Je suggère d'autoriser les erreurs pour les entrées invalides.
Kritixi Lithos
Je suggère d'autoriser un comportement non défini pour les entrées non valides.
M. Xcoder

Réponses:

6

JavaScript (ES6), 40 octets

Prend l'entrée sous forme de chaîne. Lance une erreur de récursivité si aucun index n'est trouvé.

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

Démo

Arnauld
la source
Je pense que vous pouvez économiser un octet avec ceci: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock
@RickHitchcock Malheureusement, cela forcerait les comparaisons de nombres et introduirait des faux positifs sur les grandes entrées causées par la perte de précision.
Arnauld
Je t'ai eu. Il fonctionne sur les cas de test, mais n'était pas sûr de savoir comment il gérerait d'autres situations.
Rick Hitchcock
6

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

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

Essayez-le en ligne!

Prend l'entrée sous forme de chaîne dans une fonction lambda. 1 indexé. Renvoie l'index de la valeur pour truey, ou boucle infiniment pour un "falsey"

jkelm
la source
6

Python 2 , 63 octets

-1 octet grâce à @EriktheOutgolfer .

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

Essayez-le en ligne!

Python 2 , 64 octets

-18 octets grâce à @officialaimm , car je n'ai pas remarqué que l'erreur était autorisée!

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

Essayez-le en ligne!

Python 2 , 82 octets (ne boucle pas indéfiniment)

Celui-ci renvoie 0des entrées non valides.

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

Essayez-le en ligne!

M. Xcoder
la source
2
Ninja'd: D 65 octets
officialaimm
@officialaimm Merci beaucoup! Je n'ai pas remarqué qu'une erreur de sortie / boucle pour toujours était autorisée.
M. Xcoder
Enregistrer un octet avec un 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 Attendez, cela lance une erreur de récursivité pour tout, même si je l'ai défini sys.setrecursionlimit(). Pouvez-vous fournir un tio?
M. Xcoder
@ Mr.Xcoder Lance-t-il une erreur x=1? Ou x=12? Je pensais que cela ne faisait que jeter une telle erreur pour au moins x=151311975312468101214ou quelque chose.
Erik the Outgolfer
3

Gelée , 12 octets

Rs2ZU1¦ẎVµ€i

Essayez-le en ligne!

Explication:

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 le Outgolfer
la source
3

05AB1E , 14 octets

$vDNÌNFs}«})Ik

Essayez-le en ligne! ou comme suite de tests

Explication

0 indexé .
Renvoie -1 si l'entrée n'est pas dans la séquence.

$                 # 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
la source
Haha, c'est fondamentalement ma solution avec la gsuppression et la chose append / prepend raccourcie. Je vais supprimer ma réponse
Okx
@Okx: Oh oui, je vois que vous avez joué le vôtre presque exactement cela quelques minutes seulement après mon message. Great minds;)
Emigna
2

R , 73 octets

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

Lit à partir de stdin et renvoie la valeur de l'index (imprimée implicitement). Boucles infinies lorsque la valeur n'est pas dans la séquence. Fest par défaut FALSEqui est converti en 0lorsqu'il est utilisé en arithmétique.

Essayez-le en ligne!

Giuseppe
la source
1

Mathematica, 135 octets

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
la source
1

Gelée ,  19 18  15 octets

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

Un lien monadique prenant et renvoyant des entiers.

Essayez-le en ligne! (très lent - prend ~ 50s sur TIO juste pour confirmer que3124c'est à l'index4)

Pour une version beaucoup plus rapide, utilisez les 18 octets précédents (vérifie uniquement jusqu'à la longueur de l'entrée, ce qui est suffisant).

Comment?

+ḂḶṚ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
la source
Combien de temps faudrait-il pour calculer 211917151311975312468101214161820?
Okx
Un long, très long: p
Jonathan Allan
Oui, mais combien de temps?
Okx
On dirait bien que c'est l'ordre v au carré où v est l'entier d'entrée.
Jonathan Allan
@JonathanAllan Techniquement, vous appelez cela : p
Erik the Outgolfer
1

Swift 4 , 92 octets

Cela fait une boucle infinie pour les cas invalides, donc je ne les ai pas inclus dans le lien de test.

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

Suite de tests.

Amusant, il est plus long avec une fermeture:

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}

Suite de tests.

M. Xcoder
la source
1

Haskell , 115 85 octets

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

Essayez-le en ligne!

Post Rock Garf Hunter
la source
@BruceForte J'ai réussi à économiser 30 grâce à votre suggestion.
Post Rock Garf Hunter
1

Haskell, 75 71 57 octets

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

Prend ncomme une chaîne.

Essayez-le en ligne!

nimi
la source