文字列を伸縮させるプログラムを書く


33

タイトルにある素敵な動詞。

入力文字列を指定したプログラムを作成し、この文字列を「弾性化」して結果を出力します。文字列の伸縮は、次のように行われます。

最初の文字は一度表示されます。2番目の文字は2回表示されます。3番目の文字が3回表示されます。

ご覧のとおり、特定の文字の重複の量は、文字列での以前の出現とは対照的に、文字のインデックスに関連しています。

印刷可能なASCII文字のみを受け取ることができます。次のリンクに基づいて、これらの文字には10進数値32-126があります。

例:

Why: Whhyyy

SKype: SKKyyyppppeeeee

LobbY: LoobbbbbbbYYYYY (最初のbが3回表示され、2番目のbが4回表示され、合計7つのbになるため、7つのbがあることに注意してください)。

A and B: A aaannnnddddd BBBBBBB

最短バイトが勝ちます:)


2
これは、「スペース文字以外の空白のサポートは必要ありません」に同意しないようです。出力は入力と同じですか?(2文字の単語ですか?)また、Sandboxと呼ばれる素敵な場所があることに注意してください。
FryAmTheEggman

FryAmTheEggmanの仮定は有効です。@TimmyD私が不明瞭だった場所に気付きました。FryAmTheEggmanが投稿した例に見られるように、複数のスペースで区切られた文字列になってしまうかもしれません。
マリオイシャック

最短のコードが勝ると仮定していますか?;)
アドナン

@Adnan Yep、特定の言語は他とは異なりゴルフを目的として作られているため、ショートプログラムで回答を承認済みとしてマークする必要があるかどうかはわかりませんが。
マリオイシャック

2
関連:12
SP3000

回答:


34

ゼリー、3バイト

コード:

ĖP€

説明:

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

Jellyエンコーディングを使用しますオンラインでお試しください!


16
Python *が文字列の乗算を行うという事実の悪用。これは実際には意図されていませんが、機能します。
デニス

1
@デニス:どれ*?全体の答えにはそのようなことはありません。
トーマスウェラー

10
@Thomas:JellyはPythonで書かれており、Jelly PコマンドはPython *演算子を使用して舞台裏の製品を計算します。この投稿は、実際にPythonにある基礎となるコードの漏れやすい抽象化を悪用しているためP、文字列に対して(製品)コマンドを実行すると、期待どおりに機能します。
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文字を超える文字列では機能しないと思います。
イスマエルミゲル

問題のインタプリタは、任意精度の整数を持っているかどうかに依存するであろう(しかし実際には、ほとんどの実装のために、それは255でキャップでしょう)それ@IsmaelMiguel
SP3000

規則では、8ビットを使用します。これは1文字です。ただし、実際には32ビットの数値で実装するものもあります。EOFが0(コンパイラー/インタープリター固有の動作)である必要があると指定しているため、255文字を超える文字列の場合、32ビットセルのコンパイラー/インタープリターが必要であることに注意してください。コンパイラー/インタープリター固有の動作でもあるため、答えに追加する必要があると思います。
イスマエルミゲル

1
@IsmaelMiguel確かに、注意した。
Sp3000

8

Java、158 121バイト

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

ボーナスとして、このプログラムは、Basic Multilingual Planeの最後にある制御文字を含む存在するすべての Unicode文字を処理できます。


3
ほら、これはJavaコードの非常に短いです。
アベニュー

1
あなたは置き換えることにより、1バイトで、それを短縮することができfor(int C=c+1;C>0;C--)for(int C=c+2;--C>0;)
ケビン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);}}
ケビンクルーッセン

まあ、ちょうどそれをラムダまたはメソッドにする
リーキー修道女

2
うわー、interfaceデフォルトのpublicメソッドを使用して。それは賢いです。
ジャスティン

7

Perl、16バイト

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

-pフラグ用に+1バイト。

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 ccのn個のコピーをconcat作成し、すべてのサブリストから単一のリストを作成します。


id=<<いい感じです。:)
スディー

私はそれを試してみたかっf = id=<<zipWith replicate[1..]たのですが、(ファイルで)割り当てるといエラーが発生しました。私が間違っていることを教えてもらえますか?
flawr

関数として使用できるように、この(名前のない、正しい?)関数を名前に割り当てることはできませんか?私はそれが機能であれば、(id=<<zipWith replicate[1..] ) "SKype"それでも動作するはずです?それ以外の場合は、スニペットと見なします。完全なプログラムあなたが提供するには、「スカイプ」ハードコードを持っています。
フレイ

他の関数と同じように使用できない場合、それは関数ではないと思います。たとえば、関数と:tは見なさid=<<zipWith replicate[1..]れません(エラーがスローされるだけです)が(id=<<).zipWith replicate[1..]、関数と見なされます。最初のものは単に切り取ったもので、入力をハードコーディングすれば機能しますが、2番目のものは関数であり(そして:t同意します)、それに同意しますか?
フレイ

いいね 私の「定義」に同意しない場合、これを解決するためにメタ投稿を開始する必要があると思います。それまでの間、これに関する意見を求めて他のハスケル人を見つけようとしていますが、これは単なる私の見解です。
フレイ

7

CJam、9 8 7バイト

1バイトを節約してくれたjimmy23013に感謝します。

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を確認してください)。
マリオイシャック

@MarDevの<pre>代わりに使用するようにスニペットを変更しました<div>
ニール

1
@Neil Ah。結果は正しく計算されましたが、出力はHTMLによって正しくレンダリングされませんでした。<div>がそれを行うことを忘れていました。
マリオイシャック

...「結果を出力する」
支出者

1
帰国@spender有効な機能のための出力の形式です
猫は

4

APL(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ます。このベクターは、文字列の最初の文字が出力に私たちを可能に一度、二1 など


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私の(比較的古い)バージョン=(
flawr

1
@flawr repelemはR2015a で紹介されました
ルイスメンドー


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

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ああ、賢い、ありがとう!
デンドロビウム


3

R83 50バイト

-23ジュゼッペのおかげで、彼は本質的にまったく新しい方法を使用しましたが

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


1
非常に素晴らしい!しかし、使用してrep、引数collapse=""にはpaste短く、utf8ToIntまだ短いです!TIO
ジュゼッペ



2

Pythonの3、48の 47バイト

トリックでバイトを保存してくれたmegoに感謝し-~iます。

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

これはほとんど自明です。Pythonに精通していない人のための1つ:*演算子はx、Perlの演算子のように動作するようにオーバーロードされ、数値引数で指定された回数だけ文字列引数を繰り返します。例えば'foo' * 3 == 'foofoofoo'


c*-~iはより短いc*(i+1)
メゴ

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
マーティンエンダー

@ScifiDeathそれは本当です-しかし、最終結果はまだ1バイト短くなっています。省略して混乱を招いて申し訳ありません。int i=1;
Abbath

また、Linq:を使用して1バイト短くなりますvoid f(string s){s.Select((c,i)=>{Console.Write(new string(c,i+1));return c;});}。(未使用の)戻り値の必要性はugいものです。編集:さらに戻って他の回答で同様のスニペットを見つけました。
リニアック

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

オンラインでお試しください!


あなたの解決策は良かった。しかし、なんとか打ち負かしました。
グレン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

オンラインで試す

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.