编写程序以使字符串弹性化


33

标题中的动词。

编写一个给定输入字符串的程序,该程序将“弹性化”该字符串并输出结果。弹性化字符串的步骤如下:

第一个字符显示一次。第二个字符显示两次。第三个字符显示三次,依此类推。

如您所见,某个字符的重复次数与该字符的索引有关,而不是该字符先前在字符串中出现的次数。

您可以期望只接收可打印的ASCII字符。根据以下链接,这些字符的十进制值为32-126。

例子:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (请注意,由于第一个b显示了3次,第二个b显示了4次,所以总共有7个b),所以总共有7个b。)

A and B: A aaannnnddddd BBBBBBB

最短的字节获胜:)


2
这似乎与“除空格字符外无需支持空白”不同。那么输出应该与输入相同吗?(两个字母一个单词?)还要注意,我们有一个名为“ 沙箱”的好地方,您可以在此发布挑战,让人们在发布挑战之前给您反馈。
FryAmTheEggman '16

FryAmTheEggman您的假设有效。@TimmyD我知道我不清楚的地方,您可能最终会用多个空格分隔字符串,如FryAmTheEggman所发布的示例所示。
Mario Ishac '16

我假设最短的代码获胜?;)
Adnan

@Adnan Yep,尽管我不确定是否应该用短程序标记答案是否被接受,因为某些语言是为打高尔夫球目的而制作的,与其他语言不同。
Mario Ishac '16

2
相关:12
SP3000

Answers:


34

果冻,3个字节

码:

ĖP€

说明:

Ė     # Enumerate.
 P€   # Product of each.
      # Implicit joining of everything.

使用Jelly编码在线尝试!


16
很好地滥用了Python进行*字符串乘法的事实。那不是真的打算,但是可以。
丹尼斯

1
@丹尼斯:哪个*?整个答案中没有这样的东西。
Thomas Weller

10
@Thomas:Jelly用Python编写,并且Jelly P命令使用Python *运算符在后台计算乘积。这篇文章滥用了实际上在Python中的底层代码的泄漏抽象,因此P对字符串执行(product)命令可以按预期工作。
mellamokb

16

J,4个字节

#~#\

用法

   f =: #~#\
   f 'Why'
Whhyyy
   f 'SKype'
SKKyyyppppeeeee
   f 'LobbY'
LoobbbbbbbYYYYY
   f 'A and B'
A  aaannnnddddd      BBBBBBB

说明

#~#\  Input: s
  #\  Computes the length of each prefix of s
      This forms the range [1, 2, ..., len(s)]
#~    For each value in the range, copy the character at the
      corresponding index that many times
      Return the created string

12

Brainfuck,15个字节

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

非常简单的实现,将每个输入字符的存储空间移1。需要一个解释器,该解释器在EOF上给出0,并为长度超过255个字符的输入提供32位/任意精度单元。

在线尝试!(注意:TIO使用8位单元)


1
另外,我认为这不适用于超过255个字符的字符串。
Ismael Miguel

@IsmaelMiguel这将取决于所讨论的解释器是否具有任意精度的整数(但实际上,对于大多数实现而言,其上限为255)
Sp3000

约定是使用8位。这是1个字符。但是有些确实可以用32位数字实现。由于您指定EOF为0(这是特定于编译器/解释器的行为),因此应注意,对于长度超过255个字符的字符串,您需要具有32位单元的编译器/解释器。我只是将其添加到答案中,因为它也是编译器/解释器的特定行为。
Ismael Miguel

1
@IsmaelMiguel当然可以。
Sp3000

8

Java 158121字节

多亏了Kevin Cruijssen,节省了多达37个字节!

interface a{static void main(String[]A){int b=0,B;for(char c:A[0].toCharArray())for(B=b+++2;--B>0;)System.out.print(c);}}

另外,该程序可以处理存在的所有 Unicode字符,包括位于Basic Multilingual Plane末尾的控制字符


3
,,这对于Java代码来说非常短。
大街

1
您可以将其缩短1个字节,方法是将其替换for(int C=c+1;C>0;C--)for(int C=c+2;--C>0;)
Kevin Cruijssen

2
甚至更短(121个字节):interface a{static void main(String[]A){int x=0,i;for(char c:A[0].toCharArray())for(i=x+++2;--i>0;)System.out.print(c);}}
凯文·克鲁伊森

好了,只是让一个lambda或方法
漏嫩

2
哇,使用interface默认public方法。太聪明了
贾斯汀

7

Perl,16个字节

s/./$&x$+[0]/ge

+1字节的-p标志。

s/./        /    find every character
             g   globally
              e  and replace with the eval'd result of
    $&           the matched string
      x          repeated
       $+[0]     by the index of the character after the match

7

Haskell,29个字节

concat.zipWith replicate[1..]

用法示例:concat.zipWith replicate[1..] $ "SKype"-> "SKKyyyppppeeeee"

replicate n c制作c的n个副本,并concat在所有子列表中制作一个列表。


id=<<是一个很好的接触。:)
sudee

我只是想尝试一下,但是分配f = id=<<zipWith replicate[1..](在文件中)确实导致了难看的错误,您能告诉我我做错了吗?
瑕疵的

应该不能将此函数(未命名,对吗?)分配给一个名称,以便我们可以将其用作函数?我的意思是,如果它是一个函数,那么(id=<<zipWith replicate[1..] ) "SKype"应该仍然有效吗?否则,我会将其视为摘要。您提供的完整程序确实已对“ SKype”进行了硬编码。
瑕疵的

我想说的是,如果您不能像其他任何功能一样使用它,则它不是一个功能。例如:t,不将其id=<<zipWith replicate[1..]视为函数(它只会引发错误),但是(id=<<).zipWith replicate[1..]将其视为函数。我想说第一个只是一个片段,如果您对输入进行硬编码,它就可以工作,但是您刚刚发布的第二个函数是一个函数(并:t同意),您是否同意?
瑕疵的

好的,不错!如果您不同意我的“定义”,我认为我们应该启动一个元帖子来解决此问题。同时,我正在尝试寻找其他哈斯克里人对此发表看法,因为这只是我的观点。
瑕疵的

7

CJam,9 8 7字节

感谢jimmy23013节省了1个字节。

Sl+eee~

在这里测试。

说明

使用LobbY示例:

                                      Stack:
S    e# Push space.                   [" "]
l    e# Read input.                   [" " "LobbY"]
+    e# Append.                       [" LobbY"]
ee   e# Enumerate.                    [[[0 ' ] [1 'L] [2 'o] [3 'b] [4 'b] [5 'Y]]]
e~   e# Run-length decode.            ["LoobbbbbbbYYYYY"]


5

Javascript ES6,39个字节

x=>x.replace(/./g,(y,i)=>y+y.repeat(i))

长度相同,但更有趣:

x=>x.replace(i=/./g,y=>y.repeat(i=-~i))

片段演示:

f= x=>x.replace(/./g,(y,i)=>y+y.repeat(i))
run.onclick=_=>output.textContent=f(input.value)
<input id="input" value="SKype">
<button id="run">Go</button>
<pre id="output"></pre>


小错误,程序不支持空格,这是提交所必需的(请检查OP)。
Mario Ishac '16

@MarDev我将代码段更改为<pre>而不是<div>,应该会有所帮助。
尼尔

1
@Neil嗯,所以结果是正确计算的,但是HTML错误地渲染了输出。忘记了<div>那样做。
Mario Ishac '16

...“并输出结果”
支出者

1
@spender返回是输出的用于功能的有效形式

4

杀伤人员地雷(8)

{⍵/⍨⍳⍴⍵}

即:

      {⍵/⍨⍳⍴⍵} ¨  'Why' 'SKype' 'LobbY'
┌──────┬───────────────┬───────────────┐
│Whhyyy│SKKyyyppppeeeee│LoobbbbbbbYYYYY│
└──────┴───────────────┴───────────────┘

说明:

  • ⍴⍵:给定向量的长度
  • :数字1..N
  • ⍵/⍨:将每个元素复制N次。

4

MATLAB,45个字节

g=@(m)sort(m(m>0));@(s)s(g(hankel(1:nnz(s))))

说明:关键是hankel,它产生给定向量的汉克矩阵。从该矩阵中,我们可以提取一个索引向量,该向量定义了字符串的哪个字符位于输出中的哪个位置。例如,hankel(1:4)产生以下矩阵:

 1  2  3  4
 2  3  4  0
 3  4  0  0
 4  0  0  0

从这个矩阵我们可以提取向量1,2,2,3,3,3,4,4,4,4,4。这个向量允许我们输出字符串的第一个字符一次,第二个字符输出两次,依此类推


4

NARS2000,6个字符= 12个字节

⍳∘⍴/⊙⊢

⍳∘⍴参数的枚举...(其长度的索引)
/⊙复制了...
未修改参数的元素


链接到口译员?

@cat请参阅编辑(在标题中)。
亚当

@cat您的编辑是什么?
亚当

等同于你下到性格,因为我GOOGLE了它我自己和我编辑了10分钟提交

另外,这6个字节在哪个代码页中?

3

PowerShell v2 +,36个字节

-join([char[]]$args[0]|%{"$_"*++$i})

接受输入$args[0],将其显式转换为char数组,然后将其发送到循环中|%{...}。每次迭代时,我们都使用当前字母/字符,"$_"并使用*重载运算符将字符串的预递增$i时间串联起来。每次循环迭代的结果都封装在括号中以形成数组,然后-join一起编辑以形成字符串。该字符串保留在管道上,并且输出是隐式的。

例子

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 Why
Whhyyy

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 SKype
SKKyyyppppeeeee

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 LobbY
LoobbbbbbbYYYYY

PS C:\Tools\Scripts\golfing> .\elasticize-a-word.ps1 'a b'
a  bbb

3

Brachylog,13个字节

:ImC,0:Ie,Cw\

这会将结果打印到STDOUT

说明

这是利用回溯循环的一个很好的例子。

:ImC            C is the Ith character of the Input
    ,
     0:Ie       Unify an implicit variable with an integer between 0 and I
         ,
          Cw    Write C to STDOUT
            \   False, trigger backtracking. It will go back to 0:Ie and unify the implicit
                variable with another integer, until all integers were used. After that, it
                will backtrack to :ImC and unify I and C with the next character.

3

MATLAB,23个字节

@(x)repelem(x,1:nnz(x))

创建一个ans可以使用调用的匿名函数ans('stringtoelacticize')


您使用什么版本?repelem在我的(相对较旧的)版本中找不到=(
瑕疵的

1
@flawr repelem在R2015a介绍
路易斯Mendo


3

Perl 6的 22 20  19个字节

{S:g/(.)/{$0 x$/.to}/}
{S:g[(.)]=$0 x$/.to}
{[~] .comb Zx 1..*}

说明:

{          # implicit parameter $_
  [~]      # string concatenate the following list
    .comb  # the NFG characters from $_
    Z[x]   # zip combined using the string repetition operator
    1 .. * # 1 to infinity
}

3

VBA,75个字节

Function e(s):For a=1 To Len(s):e=e &String(a,Mid(s,a,1)):Next:End Function

在电子表格中作为用户函数进行调用。

= e(A1)

┌─────────┬───────────────┐
│   SKype │SKKyyyppppeeeee│
└─────────┴───────────────┘

如果您将其自身的输出喂入几次,它将被截断:-)。


2
欢迎光临本站!=)
DJMcMayhem

3

PHP,68字节

<?php foreach(str_split($argv[1])as$i=>$a)echo str_repeat($a,$i+1);

嗨,欢迎来到PPCG!不错的第一篇文章!
Rɪᴋᴇʀ

您可以减少到47个字节for(;$a=$argv[1][$i++];)echo str_repeat($a,$i);
insertusername此处,2016年

3

的Javascript ES6,42 41个字节

s=>[,...s].map((e,i)=>e.repeat(i)).join``

示例运行:

f=s=>[,...s].map((e,i)=>e.repeat(i)).join``

f("Why")   => "Whhyyy"
f("SKype") => "SKKyyyppppeeeee"
f("LobbY") => "LoobbbbbbbYYYYY"

同一长度:s=>[...s].reduce((a,b,i)=>a+b.repeat(i+1))
Bassdrop Cumberwubwubwub

2
-1个字节:s=>[,...s].map((e,i)=>e.repeat(i)).join``
nderscore

@nderscore啊哈,那很聪明,谢谢!
Dendrobium

3

视网膜,22字节

字节数假定为ISO 8859-1编码。

.
$&$.`$*·
+`(.)·
$1$1

在线尝试!

基本上,我们·在字符之间插入适量的占位符(因为这些扩展的ASCII字符不能出现在输入中),然后在第二阶段用相邻的字符填充它们。


3

R83 50字节

-23感谢朱塞佩(Giuseppe),尽管他实际上完全使用了一种全新的方法

function(s)intToUtf8(rep(utf8ToInt(s),1:nchar(s)))

我的原始帖子:

function(s){r="";for(i in 1:nchar(s))r=paste0(r,strrep(el(strsplit(s,""))[i],i));r}

在线尝试!

我觉得肯定有更好的方法可以执行此操作,但是根据我对R中一些函数的新知识,这是我的方法。


1
不是打高尔夫球的技巧,但是您的代码链接输出混乱了。此处
罗伯特·S。,

知道了 我是TIO的新手,所以我不太了解页眉/页脚部分。谢谢!
Sumner18 '18


1
非常好!但是,使用rep和参数collapse=""to paste会更短,并且utf8ToInt还会更短!TIO
朱塞佩

2

其实是7个位元组

' +ñ♂πΣ

在线尝试!

说明:

' +ñ♂πΣ
' +      prepend a space
   ñ     enumerate ("abc" -> [[0, 'a'], [1, 'b'], [2, 'c']])
    ♂π   map: for each character, repeat it n times
      Σ  concatenate


2

Python 3,48 47字节

感谢mego用这个-~i技巧节省了一个字节。

lambda s:''.join(c*-~i for i,c in enumerate(s))

这主要是不言自明的。对于那些不熟悉Python的人来说,一件事:*运算符被重载以像Perl的x运算符那样工作,重复其字符串参数由其数字参数指定的次数。例如'foo' * 3 == 'foofoofoo'


c*-~i比短c*(i+1)
Mego

2

C#,81字节

void f(string s){for(int i=0;i<s.Length;i++)Console.Write(new String(s[i],i+1));}

您可以通过更改为foreach循环来节省1个字节,例如foreach(var a in s)Console.Write(new C(a,1*i++));
Abbath

但是,如果它是一个foreach,则我们没有i变量,因此您需要对其进行声明。
ScifiDeath

看来您在前面缺少using System或。System.Console
Martin Ender

@ScifiDeath是的,但是最终结果仍然短了一个字节。抱歉忽略它并引起混乱int i=1;
Abbath

使用Linq:还要短一个字节void f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}。但是,需要一个(未使用的)返回值是很丑陋的。编辑:只是在其他答案中找到了类似的片段。
利纳克

2

MATL,5个字节

tn:Y"

在线尝试

说明

    % Implictly grab input as a string
tn  % Duplicate and compute the length (N)
:   % Create an array from [1...N]
Y"  % Perform run-length decoding to elacticize the string
    % Implicitly display the result

2

Python,40个字节

f=lambda s,i=1:s and s[0]*i+f(s[1:],i+1)

2

朱莉娅,34个字节

!s=s>""?!s[1:(e=end)-1]*s[e:e]^e:s

在线尝试!


您的解决方案很好。但是我设法击败了它。
Glen O

我看见。我有c%n="$c"^n;~s=join([s[r=1:end]...].%r),但实际上更长。split是拼图中遗漏的部分。
丹尼斯

2

TSQL,97个字节

打高尔夫球:

DECLARE @x varchar(max)='Lobby'
DECLARE @ int=LEN(@x)WHILE @>0SELECT
@x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),@-=1PRINT @x

取消高尔夫:

DECLARE @x varchar(max)='Lobby'

DECLARE @ int=LEN(@x)
WHILE @>0
  SELECT 
    @x=STUFF(@x,@,1,REPLICATE(SUBSTRING(@x,@,1),@)),
    @-=1

PRINT @x

在线尝试

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.