prepend, append-Sequence

14

Tugas

Urutan, tambahkan-urutan didefinisikan secara rekursif, seperti ini

  • a (1) = 1
  • a (n) = a (n-1) .n, jika n adalah genap
  • a (n) = na (n-1), jika n ganjil

Dimana . mewakili gabungan bilangan bulat.

Jadi beberapa istilah pertama adalah: 1,12,312,3124,53124,531246,7531246,...Ini adalah A053064 .

Tugas Anda adalah, diberi bilangan bulat a> 0 untuk mengembalikan n , sedemikian sehingga elemen ke- n dalam prependensi, tambahkan-Urutan sama dengan a dan jika tidak ada n seperti itu mengembalikan 0, angka negatif atau kesalahan keluar dll.

Aturan

  • Input dapat diambil sebagai integer, string, daftar karakter / digit dll.
  • Output dapat dicetak ke STDOUT atau dikembalikan (integer, string, dll.)
  • Pada input yang tidak valid & dalam hal tidak ada n seperti itu, program Anda dapat melakukan apa pun kecuali mengembalikan bilangan bulat positif (mis. Loop selamanya, mengembalikan 0 dll.)
  • Anda dapat memilih untuk menggunakan pengindeksan 0, tetapi kemudian output jika tidak ada n tidak dapat 0

Uji kasus

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100
ბიმო
sumber
Lebih formal: a(n-1)*(int(log(n))+1)+ndan n*(int(log(n))+1)+a(n-1)?
Tn. Xcoder
1
@ Mr.Xcoder Saya akan menyebutnya kurang formal: P
Post Rock Garf Hunter
@ JonathanAllan Itu sudah ada dalam pertanyaan selama ~ 10 menit.
Tn. Xcoder
2
Saya sarankan memperbolehkan kesalahan untuk input yang tidak valid.
Kritixi Lithos
Saya sarankan mengizinkan perilaku tidak terdefinisi untuk input yang tidak valid.
Tn. Xcoder

Jawaban:

6

JavaScript (ES6), 40 byte

Mengambil input sebagai string. Melempar kesalahan rekursi jika tidak ada indeks yang ditemukan.

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

Demo

Arnauld
sumber
Saya pikir Anda dapat menyimpan byte dengan ini: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock
@RickHitchcock Sayangnya, itu akan memaksa perbandingan Nomor dan memperkenalkan positif palsu pada input besar yang disebabkan oleh hilangnya presisi.
Arnauld
Kena kau. Ini bekerja pada kasus uji tetapi tidak yakin bagaimana ia akan menangani situasi lain.
Rick Hitchcock
6

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

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

Cobalah online!

Mengambil input sebagai string ke fungsi lambda. 1-diindeks. Mengembalikan indeks nilai untuk truey, atau loop tak terhingga untuk "falsey"

jkelm
sumber
6

Python 2 , 63 byte

-1 byte terima kasih @EriktheOutgolfer .

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

Cobalah online!

Python 2 , 64 byte

-18 byte terima kasih kepada @officialaimm , karena saya tidak melihat kesalahan diizinkan!

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

Cobalah online!

Python 2 , 82 byte (tidak berulang selamanya)

Yang ini mengembalikan 0input yang tidak valid.

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

Cobalah online!

Tuan Xcoder
sumber
2
Ninja'd: D 65 byte
officialaimm
@officialaimm Terima kasih banyak! Saya tidak melihat kesalahan keluar / loop selamanya diizinkan.
Tn. Xcoder
Simpan satu byte dengan 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 Tunggu, ini melempar kesalahan rekursi untuk semuanya, meskipun saya atur sys.setrecursionlimit(). Bisakah Anda memberikan tio?
Tn. Xcoder
@ Mr.Xcoder Apakah ada kesalahan untuk melempar x=1? Atau x=12? Saya pikir itu hanya melemparkan kesalahan seperti itu untuk setidaknya x=151311975312468101214atau sesuatu.
Erik the Outgolfer
3

Jelly , 12 byte

Rs2ZU1¦ẎVµ€i

Cobalah online!

Penjelasan:

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
sumber
3

05AB1E , 14 byte

$vDNÌNFs}«})Ik

Cobalah online! atau sebagai Test suite

Penjelasan

Diindeks 0 .
Mengembalikan -1 jika input tidak dalam urutan.

$                 # 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
sumber
Haha, ini pada dasarnya solusi saya dengan yang gdihapus dan append / prepend dipersingkat. Saya akan menghapus jawaban saya
Okx
@Okx: Oh ya, saya melihat Anda bermain golf Anda hampir persis ini hanya beberapa menit setelah posting saya. Pikiran besar;)
Emigna
2

R , 73 byte

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

Membaca dari stdin dan mengembalikan nilai indeks (dicetak secara implisit). Infinite loop ketika nilainya tidak dalam urutan. Fsecara default FALSEyang dilemparkan ke0 saat digunakan dalam aritmatika.

Cobalah online!

Giuseppe
sumber
1

Mathematica, 135 byte

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
sumber
1

Jelly ,  19 18  15 byte

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

Tautan monadik mengambil dan mengembalikan bilangan bulat.

Cobalah online!(sangat lambat - membutuhkan ~ 50s pada TIO hanya untuk mengkonfirmasi bahwa 3124ada pada indeks4 )

Untuk versi yang jauh lebih cepat gunakan 18 byter sebelumnya (hanya memeriksa hingga panjang input, yang cukup).

Bagaimana?

+ḂḶṚ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
sumber
Berapa lama untuk menghitung 211917151311975312468101214161820?
Okx
Lama sekali: p
Jonathan Allan
Ya, tapi berapa lama?
Okx
Yah sepertinya urutan v kuadrat di mana v adalah integer input.
Jonathan Allan
@ Jonathan Allan Secara teknis Anda menyebutnya : p
Erik the Outgolfer
1

Cepat 4 , 92 byte

Loop ini jauh untuk kasus yang tidak valid, jadi saya tidak memasukkannya ke dalam tautan pengujian.

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

Test Suite.

Yang mengherankan, lebih lama dengan penutupan:

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}

Test Suite.

Tuan Xcoder
sumber
1

Haskell , 115 85 byte

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

Cobalah online!

Posting Rock Garf Hunter
sumber
@BruceForte Saya sebenarnya berhasil menyelamatkan 30 berkat saran Anda.
Post Rock Garf Hunter
1

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

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

Cobalah online!

Tidak menghasilkan apa-apa jika tidak ditemukan.

Xcali
sumber
1

Haskell, 75 71 57 byte

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

Dibutuhkan n sebagai string.

Cobalah online!

nimi
sumber