poprzedzająca, dołączająca-Sekwencja

14

Zadanie

Przedrostek, append-Sequence jest definiowany rekurencyjnie, w ten sposób

  • a (1) = 1
  • a (n) = a (n-1) .n, jeśli n jest parzyste
  • a (n) = na (n-1), jeśli n jest nieparzyste

gdzie . reprezentuje konkatenację liczb całkowitych.

Tak więc kilka pierwszych terminów to: 1,12,312,3124,53124,531246,7531246,...To jest A053064 .

Twoim zadaniem jest, biorąc pod uwagę liczbę całkowitą a> 0, aby zwrócić n , tak aby n- ty element w przedrostku, append-Sequence był równy a, a jeśli nie istnieje n , zwróć 0, ujemna liczba lub błąd itp.

Zasady

  • Dane wejściowe można traktować jako liczbę całkowitą, ciąg, listę znaków / cyfr itp.
  • Dane wyjściowe można wydrukować do STDOUT lub zwrócić (liczba całkowita, łańcuch itp. Jest w porządku)
  • W przypadku niepoprawnego wejścia iw przypadku, gdy takie n nie istnieje, program może zrobić cokolwiek innego niż zwrócić dodatnią liczbę całkowitą (np. Zapętlić na zawsze, zwrócić 0 itd.)
  • Możesz zdecydować się na użycie indeksowania 0, ale wtedy wyjście w przypadku, gdy nie istnieje n , nie może wynosić 0

Przypadki testowe

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100
ბიმო
źródło
Bardziej formalne: a(n-1)*(int(log(n))+1)+ni n*(int(log(n))+1)+a(n-1)?
Pan Xcoder,
1
@ Mr.Xcoder Nazwałbym to mniej formalnym: P
Post Rock Garf Hunter
@JonathanAllan To już pytanie ~ 10 minut.
Pan Xcoder,
2
Sugeruję dopuszczenie błędów dla nieprawidłowych danych wejściowych.
user41805,
Sugeruję zezwolenie na niezdefiniowane zachowanie dla nieprawidłowych danych wejściowych.
Pan Xcoder,

Odpowiedzi:

6

JavaScript (ES6), 40 bajtów

Pobiera dane wejściowe jako ciąg. Zgłasza błąd rekurencji, jeśli nie znaleziono indeksu.

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

Próbny

Arnauld
źródło
Myślę , że możesz uratować bajt dzięki temu: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock,
@ RickHitchcock Niestety wymusiłoby to porównania liczb i wprowadziłoby fałszywe alarmy przy dużych nakładach spowodowanych utratą precyzji.
Arnauld
Gotcha Działa na testach, ale nie był pewien, jak poradzi sobie w innych sytuacjach.
Rick Hitchcock,
6

C # (.NET Core) , 83, 80, 60 59 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako ciąg znaków do funkcji lambda. 1-indeksowany. Zwraca indeks wartości truey lub nieskończenie pętli dla „falsey”

jkelm
źródło
6

Python 2 , 63 bajty

-1 bajt dzięki @EriktheOutgolfer .

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

Wypróbuj online!

Python 2 , 64 bajty

-18 bajtów dzięki @officialaimm , ponieważ nie zauważyłem, że pomyłka była dozwolona!

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

Wypróbuj online!

Python 2 , 82 bajty (nie zapętla się wiecznie)

Ten zwraca 0niepoprawne dane wejściowe.

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

Wypróbuj online!

Pan Xcoder
źródło
2
Ninja'd: D 65 bajtów
officialaimm
@officialaimm Dziękuję bardzo! Nie zauważyłem, że zawsze można było błędnie wykonać pętlę / pętla na zawsze.
Pan Xcoder,
Uratuj bajt z 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 Poczekaj, generuje błąd rekurencji dla wszystkiego, chociaż ustawiłem sys.setrecursionlimit(). Czy możesz podać tio?
Mr. Xcoder,
@ Mr.Xcoder Czy generuje błąd x=1? Czy x=12? Myślałem, że to rzuciło taki błąd przynajmniej na x=151311975312468101214coś takiego.
Erik the Outgolfer
3

Galaretka , 12 bajtów

Rs2ZU1¦ẎVµ€i

Wypróbuj online!

Wyjaśnienie:

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 the Outgolfer
źródło
3

05AB1E , 14 bajtów

$vDNÌNFs}«})Ik

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

0-indeksowane .
Zwraca -1, jeśli danych wejściowych nie ma w sekwencji.

$                 # 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
źródło
Haha, to w zasadzie moje rozwiązanie z gusuniętą i skróconą funkcją dodawania / dodawania.
Usunę
@Okx: Oh tak, widzę, że grałeś w golfa prawie dokładnie w kilka minut po moim poście. Wielkie umysły;)
Emigna
2

R , 73 bajty

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

Odczytuje ze standardowego wejścia i zwraca wartość indeksu (niejawnie wydrukowanego). Nieskończone pętle, gdy wartość nie jest w sekwencji. Fjest domyślnie FALSErzutowany, 0gdy jest używany w arytmetyce.

Wypróbuj online!

Giuseppe
źródło
1

Mathematica, 135 bajtów

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
źródło
1

Galaretka ,  19 18  15 bajtów

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

Monadyczny link przyjmujący i zwracający liczby całkowite.

Wypróbuj online! (bardzo wolno - zajmuje ~ 50 s na TIO tylko po to, aby potwierdzić, że3124jest na indeksie4)

Aby uzyskać znacznie szybszą wersję, użyj poprzednich 18 bajtów (sprawdza tylko długość wejściową, co jest wystarczające).

W jaki sposób?

+ḂḶṚ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
źródło
Jak długo potrwa obliczenie 211917151311975312468101214161820?
Okx,
Długi, długi czas: p
Jonathan Allan,
Tak, ale jak długo?
Okx,
Wygląda na to, że jest to kolejność v do kwadratu, gdzie v jest liczbą całkowitą wejściową.
Jonathan Allan,
@JonathanAllan Technicznie nazywacie to : p
Erik the Outgolfer
1

Swift 4 , 92 bajty

Zapętla się w nieskończoność w przypadku nieprawidłowych przypadków, więc nie umieściłem ich w łączu testowym.

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

Pakiet testowy.

Zabawne, że jest dłużej z zamknięciem:

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}

Pakiet testowy.

Pan Xcoder
źródło
1

Haskell , 115 85 bajtów

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

Wypróbuj online!

Post Rock Garf Hunter
źródło
@BruceForte Rzeczywiście udało mi się zaoszczędzić 30 dzięki twojej sugestii.
Post Rock Garf Hunter
1

Perl 5 , 54 + 1 (-n) = 55 bajtów

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

Wypróbuj online!

Nic nie zwraca, jeśli nie zostanie znalezione.

Xcali
źródło
1

Haskell, 75 71 57 bajtów

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

Przyjmuje njako sznur.

Wypróbuj online!

nimi
źródło