卷尺字符串


15

动机:有时您需要知道字符串中的位置。您希望能够查看字符串的任何部分,并尽可能准确地知道您的位置。

挑战:编写程序以输出给定长度的卷尺字符串。一个卷尺字符串自我介绍它的长度那么远尽可能多地沿着它自己的长度。

规则

  1. 您的程序必须使用一个正整数参数,表示卷尺字符串的总长度
  2. 对于输出的数字每个连续的字符串,这些数字必须如实申报输出的长度为止- 包容
    1. 长度从字符串的开头到每个数字的结尾进行测量
  3. 字符串中应包含尽可能多的长度数字
  4. 避免歧义。分隔符/分隔符可用于避免数字并置,即12说十二个不是一,二。
  5. 字符串必须始终准确地报告其末尾的总长度,且没有结尾的分隔符
  6. 您可能需要多个分隔符以保持长度准确,例如,这是一个长度为4的卷尺示例: 1--4

非说明性/详尽的示例:

  • 卷尺长度为1的卷尺 1
  • 长度为2的卷尺字符串: -2
  • 卷尺长度为3的卷尺 1-3
  • 卷尺长度为4的卷尺:1--4-2-4(两个报告长度都应尽可能长,即两次,并以正确的总长度结尾)
  • 卷尺长度为10的卷尺: 1-3-5-7-10
  • 卷尺长度为11的卷尺:1-3-5-7--111-3-5--8-111-3--6-8-111--4-6-8-11-2-4-6-8-11(所有长度都尽可能长,并以总字符串长度结尾)

因此,字符串中的每个数字都与另一个数字不相邻,字符串完全由破折号组成-,并且您需要在字符串中尽可能多地添加长度标记吗?
Rɪᴋᴇʀ

我们可以使用基于0的索引吗?
Rɪᴋᴇʀ

@EasterlyIrk规则3是必须将尽可能多的数字放入字符串中。
发布Rock Garf Hunter,


@EasterlyIrk您不能使用所有破折号,因为这不能满足动机并破坏规则3和5。没有索引。只是长度。因此,不能,长度为1的卷尺字符串不能为0
Tom Viner

Answers:


12

Python,50 48 47 46字节

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

说明

相当简单的递归lambda解决方案

我们的基本情况是1和0,它们被覆盖, "1"*x否则我们得到-xwith 的字符串,`-x`并在len(`-x`)less 上加上调用函数的结果。


1
您可以通过字符串保存字节-x吗?
Martin Ender

@MartinEnder好,我知道了。谢谢你的提示!我没有提前注意到这一点而感到愚蠢。
发布Rock Garf Hunter,

5

Mathematica,67 57字节

感谢Martin Ender抛弃10个字节!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

带有非负整数参数并返回字符串的未命名函数。显而易见的递归算法非常明显:确保字符串以输入数字结尾并以a开头"-",然后使用再次调用该函数#0

但是在实现算法方面有很多乐趣。""["1"][[#]]表示#表达式""["1"]的第一个参数:第0个参数是head "",第一个参数是visible "1",这提供了递归的基本情况。如果#超过1,则""["1"][[#]]引发错误消息,并保留为未评估的功能。但是然后/._@__:>是一条规则,该规则接受任何未求值的函数并将其转换为下一个表达式,这是对原始函数的递归调用。

原始提交:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&保存通过避免一个字节If并通过避免一串字节IntegerString"-"<>
马丁·恩德

1
天哪,_@__是邪恶的魔法
格雷格·马丁

3

JavaScript(ES6),49个字节

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
我认为您需要定义f
Tom Viner

@TomViner我一直在这样做。(至少我有正确的字节数。)
尼尔(Neil


1

Perl 6、43字节

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

说明:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

因此,例如对于输入10,它将生成序列(-10, -7, -5, -3, -1),并根据该字符串-1-3-5-7-10和最后一个字符串生成序列1-3-5-7-10

在线尝试

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.