追加字符串长度


51

挑战:

给定s字符a- zA- Z0- 上的字符串9,将其长度附加s到其自身,将长度中的其他字符计为的总长度s

输入:

只是任意长度的字符串(可以为空)。

输出:

相同的字符串,但其长度附加到末尾。代表长度的字符也应算作长度的一部分。如果要附加多个有效长度,请选择最小的长度(有关示例,请参见测试用例)。

测试用例:

INPUT     -> OUTPUT       // Comment
aaa       -> aaa4
          -> 1            // Empty string
aaaaaaaa  -> aaaaaaaa9    // aaaaaaaa10 would also normally be valid, but violates using the smallest number rule mentioned above
aaaaaaaaa -> aaaaaaaaa11
a1        -> a13          // Input can contain numbers at the end of the string, you do not have to handle the fact that it looks like 13 rather than 3.

Longer test case(s):

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa101
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa102

规则:

这是,因此以字节为单位的最短代码获胜。禁止出现标准漏洞。提交可以是整个程序或函数,您可以将结果打印到stdout或将其作为变量从函数返回。


输入中可以显示哪些字符?
Martin Ender

@MartinEnder仅字母数字字符,0-9和AZ / az。是的,您可以在字符串的末尾加上数字。我将添加一个测试用例。
Yodle

Answers:



18

JavaScript(ES6),32个字节

f=(s,n=0)=>(s+n)[n]?f(s,n+1):s+n

这个怎么运作

f = (s, n = 0) =>   // given a string 's' and starting with n = 0:
  (s + n)[n] ?      // if the Nth character of (s + n) exists:
    f(s, n + 1)     //   try again with n + 1
  :                 // else
    s + n           //   return s + n

首先N=0,我们测试由原始输入字符串和的十进制表示形式串联而成的字符串的第N个字符(从0开始)N。我们递增N直到该字符不再存在。

例:

N =  0 : abcdefghi0
         ^
N =  1 : abcdefghi1
          ^
N =  2 : abcdefghi2
           ^
...
N =  8 : abcdefghi8
                 ^
N =  9 : abcdefghi9
                  ^
N = 10 : abcdefghi10
                   ^
N = 11 : abcdefghi11    -> success
                    ^

测试用例


哇,为此,JS比Python更加简洁。
mbomb007 '16

@Arnauld我无法解决这个问题。您介意解释此代码的工作原理吗?
哥谭2013年

12

乳胶,108/171

\newcounter{c}\def\s#1#2]{\stepcounter{c}\def\t{#2}\ifx\empty\t\arabic{c}\else#1\s#2]\fi}\def\q[#1]{\s#10]}

\q[] //1


哇,我认为我以前从未在ppcg上看到过乳胶的答案。
pajonk

5

JavaScript(ES6),37个字节

f=(s,t=s,u=s+t.length)=>t==u?t:f(s,u)
<input oninput=o.textContent=f(this.value)><pre id=o>


当我单击时,Run Code Snippet我看到一条错误消息。我不了解Javascript-我只是在尝试
Prasanna

@Prasanna在Firefox中为我工作;您正在使用哪个浏览器?
尼尔

@Prasanna在最新的Google Chrome浏览器上工作。您确定没有使用IE11或更早的版本,Opera或任何不支持ES6的版本吗?
Ismael Miguel

我使用的是旧的优质chrome(Version 48.0.2564.97)。我也将尝试使用IE。无法更新我的浏览器-办公室安全问题
Prasanna

5

C,67 65 61字节

x;f(*v){printf("%d",(int)log10(x=-~printf(v))*-~(x%10>8)+x);}

魔盒


1
哦,是的,我应该进行打印...总之,恭喜拥有较短的C解决方案:D +1
cat

4

Lua 5.2,32字节

a=arg[1]print(a..#a+#(''..#a+1))

其中变量a是输入字符串。


3

Pyke,8个字节(旧版本

.f+liq)+

说明:

.f    )  -  first where (i++)
  +      -    input + i
   l     -    len(^)
    iq   -   ^ == i
       + - input + ^

在这里尝试!(新版本,9字节)


它总是让我感到困惑,实际输出是如何被警告或其他消息掩盖的:-)
Luis Mendo

2
我应该真正解决固定在复制链接中的网络错误,该错误会自动禁用警告开关
Blue Blue

3

Python 2,54 48 46字节

简单的解决方案。递归最终变得更短。

f=lambda s,n=0:f(s,n+1)if(s+`n`)[n:]else s+`n`

在线尝试


1
我认为你可以做(s+`n`)[n:]n<len(s+`n`)
xnor

3

Haskell,46个字节

f s=[l|i<-[0..],l<-[s++show i],length l==i]!!0

用法示例:f "aaaaaaaa"-> "aaaaaaaa9"

只需尝试从0开始的所有数字,然后选择适合的第一个数字即可。


3

Mathematica,57个字节

#<>ToString[(a=Length@#)+(i=IntegerLength)[a+i@a]~Max~1]&

未命名函数,将字符数组作为输入并返回字符串。使用以下事实:如果a是输入的长度,则要追加到输入a的数字是加(a+的长度a)中a的位数,而不仅仅是加的位数a。不幸的是,如果没有~Max~1特殊情况,它将无法为空字符串输入提供正确的答案。


3

Brachylog,13个字节

l<L$@:?rc.lL,

在线尝试!

说明

基本上是问题的描述。它将尝试L大于输入长度的每个值,直到找到一个值,该值在连接到输入时就是该连接的长度。

l<L              length(Input) < L
  L$@            Convert L to a string
     :?rc.       The Output is the concatenation of the Input with L as string
         .lL,    The length of the Output is L itself

3

Brainfuck,258字节

,>+<----------[++++++++++>+[>+<-],----------]<[<]>[.>]>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

输入必须由换行(LF)终止。仅适用于长度小于256(包括LF)的输入。

在线尝试!

说明

# read first char and add one to cell #1
# the cell after the input will contain the length
,>+<
# subtract 10 to check for LF
----------
# while the input is not 10 (LF)
[
# restore the input to its original value
++++++++++
# add one to the length
>+
# cut and paste the length to the next cell, then read the input
[>+<-],
# subtract 10 to check for LF
----------
]
# for input abc, the tape here would be: a b c *0* 4
# rewind to the beginning of the input
<[<]>
# print the input string
[.>]>
# convert the length to ascii chars and output them
>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-
<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++
<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

注意:我使用了这个SO答案中的代码来将长度转换为ascii输出。我希望这在PPCG上是可以接受的。这是我第一次提交Codegolf,也是我第二次BF程序。欢迎反馈。


1
这是无效的,它必须通过所有测试用例
2016年

那么支持不超过999的长度就足够了吗?
Forcent Vintier

规范说“任意长度”,意思是“只要您的语言能够处理或不耗尽内存”
cat

您使用的Brainfuck解释器具有8位单元格,因此,只要您的算法适用于任意长度的字符串,对于长度为256或更高长度的字符串失败,就可以了。一旦字符串太长,C和JavaScript提交也将失败。
丹尼斯

谢谢丹尼斯,我会相应地修改我的提交
Forcent Vintier


2

Ruby,62 58 56字节

s=gets.chomp;p s+"#{(s+"#{(s+"#{s.size}").size}").size}"

在中测试irb

可能有更好的方法来做到这一点,但这是我想到的第一件事。任何打高尔夫球的帮助将不胜感激。

编辑:我意识到我对括号的使用过多。


您只能l在一个地方使用。如果内联,将节省3个字节l=;。但您的解决方案仍将比我的解决方案长;)
DepressedDaniel

2

Perl 6的 46  35个字节

{$_~(.chars,*.chars+.chars...{$^a==$^b})[*-1]}
{$_~(.chars,*.chars+.chars...*)[2]}

试试吧

展开:

{   # bare block lambda with implicit parameter 「$_」

  $_  # the input

  ~   # concatenated with

  (  # sequence generator

    .chars,  # the number of chars in 「$_」 (seed the generator)


    *\      # Whatever lambda input (represents previous value)
    .chars  # number of chars in that
    +       # plus
    .chars  # the number of chars in 「$_」


    ...     # keep doing that until

    *       # indefinitely

  )[2] # get the value at index 2 of the sequence
}

2

05AB1E,11个字节

[¹¾JDg¾Q#¼\

非常简单的蛮力:

            Implicit i = 0
[           while true
 ¹¾J        Concatenate input and i -> str
    Dg¾Q#   Break if length(str) == i
         ¼\ Else, i += 1

在线尝试!


2

Python,39个字节

lambda a:eval('a+str(len('*3+'a))))))')

较长的形式:

lambda a:a+str(len(a+str(len(a+str(len(a))))))

在Python 2中迭代(41个字节):

x=a=input();exec"x=a+`len(x)`;"*3;print x

x作为输入字符串开始a,应用转换x -> a + str(len(x))三次。我仍然不清楚为什么需要三个应用程序才能始终达到目标。


为什么3次?首先添加文本的长度,其次调整包含数字的长度,如果调整增加了一个额外的数字,则第三个。
Tom Viner


2

bash,47个字节

 for((n=-1;${#s} != $n;));{ s=$1$[++n];};echo $s

将其另存为脚本,然后将输入字符串作为参数传递。

这是一个蛮力的实现:依次尝试每个数字,直到找到一个有效的数字。


2

> <>(鱼)35字节

i:1+?!v:o
ln;v9l<  >
*9+>:&)?!^1l&a

将输入输入堆栈,根据值9,99,999 ...检查长度,如果长度大于堆栈长度加1。



1

C#,77个字节

n=>{int a=n.Length;int c=(a+1).ToString().Length-1;return(n+(n.Length+1+c));}

1
我现在不使用C#,但您不能使用return(n+(a+1+c))as a=n.Length吗?
Laikoni '16

同时,也是下降-1int c=(a+1).ToString().Length-1+1从回报?
Laikoni '16

1
等一下,这样可以正确处理较大的测试用例吗?看起来它返回aa...a100而不是aa...a101针对99 a测试用例。
Laikoni '16

1

MATL,11个字节

`G@Vhtn@>]&

在线尝试!验证所有测试用例

`      % Do...while
  G    %   Push input
  @    %   Push iteration index (1-based)
  V    %   Convert number to string
  h    %   Concatenate horizontally
  t    %   Duplicate
  n    %   Get length of concatenated string
  @    %   Push iteration index
  >    %   True if length of concatenated string exceeds iteration index
]      % End. Run next iteration if top of stack is true; else exit loop
&      % Specifiy that next function (implicit display) takes only one input
       % Implicitly display top of the stack. This is the concatenated string
       % that had a length equal to the iteration index

1

Ruby,51个字节(程序)

Ruby,49个字节(功能)

程序(不需要最后一个换行符,因此不计分):

x=gets.strip
i=0
i+=1 until(y=x+i.to_s).size==i
p y

函数(对最后一个换行符进行评分):

def f x
i=0
i+=1 until(y=x+i.to_s).size==i
y
end

1

因子,55字节

在公园里散步!读完问题,我脑子里就想到了这个。

[ dup length dup log10 ⌈ + >integer 10 >base append ]

1

Clojure,72个字节

(defn f([s](f s 1))([s n](if(=(count(str s n))n)(str s n)(f s(inc n)))))

1

R,49个字节

cat(a<-scan(,""),(t<-nchar(a))+nchar(t+1),sep='')

非常简单的解决方案。


这对我不起作用:Read 1 item Error in nchar(x + 1) : object 'x' not found。我发现(t<-nchar(a))+...确实有效。
2016年

@JarkoDubbeldam:我的坏!
弗雷德里克

1

沃尔夫拉姆,56岁

#<>ToString@Nest[l+IntegerLength@#&,l=StringLength@#,2]&

给定l = StringLength[x]它附加l + IntegerLength[l + IntegerLength[l]]x



1

ForceLang,83个字节

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
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.