前置,追加序列


14

任务

prepend,append-Sequence像这样递归定义

  • a(1)= 1
  • 如果n是偶数,则a(n)= a(n-1).n
  • 如果n为奇数,则a(n)= na(n-1)

哪里。表示整数串联。

因此,前几个术语是:1,12,312,3124,53124,531246,7531246,...这是A053064

您的任务是,给定a> 0的整数以返回n,以使prenend,append-Sequence中的第n个元素等于a,如果不存在n则返回0,负数或错误输出等。

规则

  • 输入可以作为整数,字符串,字符/数字列表等。
  • 输出可以打印到STDOUT或返回(整数,字符串等都可以)
  • 在输入无效的情况下,如果不存在这样的n,则您的程序可以执行任何操作,但返回正整数(例如,永远循环,返回0等)。
  • 您可以选择使用0索引,但是如果不存在n,则输出不能为0

测试用例

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

更正式:a(n-1)*(int(log(n))+1)+nn*(int(log(n))+1)+a(n-1)
Xcoder先生17年

1
@ Mr.Xcoder我称其不太正式:P
发布Rock Garf Hunter,

@JonathanAllan问题已经存在约10分钟了。
Xcoder先生17年

2
我建议允许输入无效的错误。
Kritixi Lithos

我建议为无效输入允许未定义的行为。
Xcoder先生17年

Answers:


6

JavaScript(ES6),40个字节

将输入作为字符串。如果找不到索引,则引发递归错误。

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

演示版


认为您可以使用以下方法保存一个字节: f=(n,s=k='1')=>n-s?f(n,++k&1?k+s:s+k):k
Rick Hitchcock

@RickHitchcock不幸的是,这将强制进行数字比较,并由于精度下降而导致对大输入的误报。
Arnauld

知道了 它适用于测试用例,但不确定如何处理其他情况。
里克·希区柯克

6

C#(.NET Core)83、80、60 59字节

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

在线尝试!

将输入作为字符串输入到lambda函数中。1个索引。返回值为true的值的索引,或者无限循环为“ falsey”


6

Python 2,63个字节

-1个字节感谢@EriktheOutgolfer

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

在线尝试!

Python 2,64个字节

由于@officialaimm,所以-18个字节,因为我没有注意到允许错误!

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

在线尝试!

Python 2,82个字节(不会永远循环)

这将返回0无效输入。

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

在线尝试!


2
忍者:D 65字节
Officialaimm'8

@officialaimm非常感谢!我没有注意到错误/永远允许循环。
Xcoder先生17年

用lambda保存一个字节:f=lambda x,i='1',j=2:i!=`x`and f(x,[i+`j`,`j`+i][j%2],j+1)or~-j
Egg the Outgolfer '17

@EriktheOutgolfer等待,尽管我设置了,但它会为所有内容引发递归错误sys.setrecursionlimit()。你可以提供提奥吗?
Xcoder先生17年

@ Mr.Xcoder是否会引发错误x=1?还是x=12?我以为它至少造成了这样的错误x=151311975312468101214
暴民埃里克(Erik the Outgolfer)'17年

3

果冻,12字节

Rs2ZU1¦ẎVµ€i

在线尝试!

说明:

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个字节

$vDNÌNFs}«})Ik

在线尝试! 或作为测试套件

说明

0索引。如果输入不在序列中,则
返回-1

$                 # 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

哈哈,这基本上是我的解决方案,g删除了内容并简化了添加/添加内容。我将删除答案
Okx

@Okx:哦,是的,我看到我的帖子仅在几分钟后就打到了几乎你的水平。好主意;)
艾米娜(Emigna

2

R,73字节

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

从stdin读取并返回索引的值(隐式打印)。当值不在序列中时,无限循环。F是默认值FALSE0用于算术时将强制转换为。

在线尝试!


1

Mathematica,135个字节

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

果冻 19 18  15 字节

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

取并返回整数的单子链接。

在线尝试!(非常慢-在TIO上花费〜50秒只是为了确认3124是否处于索引4

要获得更快的版本,请使用之前的18个字节(仅检查输入长度,这足够了)。

怎么样?

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

计算需要多长时间211917151311975312468101214161820
Okx

很长很长的时间:p
乔纳森·艾伦

是的,但是要多久?
Okx

好吧,看起来像是v阶的 平方,其中v是输入整数。
乔纳森·艾伦

@JonathanAllan从技术上讲,您称呼:p
独行侠埃里克(Erik the Outgolfer)

1

斯威夫特4 4,92字节

对于无效的情况,此循环无限循环,因此我没有在测试链接中包括它们。

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

测试套件。

有趣的是,使用闭包可以更长:

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}

测试套件。



1

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

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

在线尝试!

如果找不到,则不返回任何内容。


1

Haskell,75 71 57字节

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

需要 n作为一个字符串。

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.