başa getirebilir, komuta-Dizi


14

Görev

Başa eklenen, Ek-Sıra, bu şekilde tekrarlı olarak tanımlanır

  • a (1) = 1
  • a (n) = a (n-1) .n, eğer n eşitse
  • a (n) = na (n-1), n ​​tekse

nerede . bir tamsayı birleşimidir.

İlk birkaç terim: 1,12,312,3124,53124,531246,7531246,...Bu A053064 .

Görev, tam sayı, bir verilen bir> 0 dönmek n olduğu, örneğin , n sona ekleme inci elemanı, ekleme-Dizi eşittir bir ve böyle bir durumunda , n dönüş 0, negatif bir sayı veya hata üzerinden vb vardır

kurallar

  • Giriş bir tamsayı, dize, karakter / rakam listesi vb. Olarak alınabilir.
  • Çıktı STDOUT'a yazdırılabilir veya döndürülebilir (tamsayı, dize vb. İyidir)
  • Geçersiz girişte ve böyle bir n olmaması durumunda, programınız pozitif bir tamsayı döndürmekten başka bir şey yapabilir (ör. Sonsuza kadar döngü, 0 dönüşü vb.)
  • 0 dizinleme kullanmayı seçebilirsiniz, ancak n olmaması durumunda çıktı 0 olamaz

Test senaryoları

1 -> 1
12 -> 2
21 -> 0
123 -> 0
312 -> 3
213 -> 0
211917151311975312468101214161820 -> 21
2119171513119753102468101214161820 -> 0
333129272523211917151311975312468101214161820222426283031 -> 0
999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100

Daha resmi: a(n-1)*(int(log(n))+1)+nve n*(int(log(n))+1)+a(n-1)?
Bay Xcoder

1
@ Mr.Xcoder Daha az resmi diyebilirim : P
Rock Garf Hunter Post

@JonathanAllan Bu soru zaten ~ 10 dakika.
Bay Xcoder

2
Geçersiz girişler için hatalara izin vermenizi öneririm.
user41805

Geçersiz girdiler için tanımlanmamış davranışa izin vermenizi öneririm.
Bay Xcoder

Yanıtlar:


6

JavaScript (ES6), 40 bayt

Girişi dize olarak alır. Dizin bulunmazsa bir özyineleme hatası atar.

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

gösteri


Ben bununla bir bayt kaydedebilirsiniz düşünüyorum : f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock

@RickHitchcock Ne yazık ki, bu sayı karşılaştırmalarını zorlar ve hassasiyet kaybının neden olduğu büyük girdilere yanlış pozitifler getirir.
Arnauld

Anladım. Test senaryolarında çalışır, ancak diğer durumları nasıl ele alacağından emin değildi.
Rick Hitchcock

6

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

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

Çevrimiçi deneyin!

Girişi bir string olarak lambda fonksiyonuna alır. 1 endeksli. Doğruluk için değerin dizinini veya "falsey" için sonsuz döngüler döndürür


6

Python 2 , 63 bayt

@EriktheOutgolfer sayesinde -1 bayt .

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

Çevrimiçi deneyin!

Python 2 , 64 bayt

@Officialaimm sayesinde -18 bayt , çünkü hataya izin verildiğini fark etmedim!

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

Çevrimiçi deneyin!

Python 2 , 82 bayt (sonsuza kadar döngü yapmaz)

Bu 0geçersiz girdiler için geri döner .

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

Çevrimiçi deneyin!


2
Ninja'd: D 65 bayt
officialaimm

@officialaimm Çok teşekkürler! Sonsuza kadar izin / döngü hata fark etmedi.
Bay Xcoder

Lambda ile bir bayt kaydedin:f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j
Outgolfer Erik

@EriktheOutgolfer Bekle, ben ayarlasam da, her şey için özyineleme hatası atıyor sys.setrecursionlimit(). Bir tio sağlayabilir misiniz?
Bay Xcoder

@ Mr.Xcoder Bir hata veriyor x=1mu? Yoksa x=12? Sadece en azından x=151311975312468101214falan böyle bir hata attığını düşündüm .
Outgolfer Erik

3

Jöle , 12 bayt

Rs2ZU1¦ẎVµ€i

Çevrimiçi deneyin!

Açıklama:

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 bayt

$vDNÌNFs}«})Ik

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

0 dizinli . Giriş dizide değilse -1 değerini
döndürür .

$                 # 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, temelde gkaldırılan ve ekleme / başa ekleme kısaltılmış çözümüm . Cevabımı sileceğim
Okx

@Okx: Oh evet, yazımdan sadece birkaç dakika sonra seninkini neredeyse tam olarak golf oynadığını görüyorum. Büyük beyinler;)
Emigna

2

R , 73 bayt

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

Stdin'den okur ve dizinin değerini döndürür (örtük olarak yazdırılır). Değer sırayla olmadığında sonsuz döngüler. Fvarsayılan olarak FALSEartığını hangi 0aritmetik kullanıldığında.

Çevrimiçi deneyin!


1

Mathematica, 135 bayt

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

Jöle ,  19 18  15 bayt

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

Tamsayıları alıp döndüren monadik bir bağlantı.

Çevrimiçi deneyin! (çok yavaş - sadece3124dizindeolduğunu onaylamak için TIO ~ 50s alır4)

Çok daha hızlı bir versiyon için önceki 18 byter'ı kullanın (sadece girişin uzunluğunu kontrol eder, bu yeterlidir).

Nasıl?

+ḂḶṚ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)

Hesaplamak ne kadar sürer 211917151311975312468101214161820?
Okx

Uzun, uzun bir süre: p
Jonathan Allan

Evet, ama ne kadar sürecek?
Okx

Görünüşe göre v düzeni kare, burada v girdi tamsayısıdır.
Jonathan Allan

@JonathanAllan Teknik olarak : p
Outgolfer Erik

1

Swift 4 , 92 bayt

Bu geçersiz durumlar için sonsuz döngüler, bu yüzden onları test bağlantısına dahil etmedim.

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 odası.

Eğlenceli, bir kapatma ile daha uzun:

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 odası.




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.