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

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


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"


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!


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)

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

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!


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

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)

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.



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.


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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.