レターランを長くする


28

小文字のASCII文字の空でない文字列を指定a-zすると、同じ文字の連続した「実行」がその文字のもう1つのコピーによって延長された文字列を出力します。

例えば、dddogg3 d「S、1 o2 gの)になるddddooggg4 d「S、2 o「S、3 g「S)。

これはです。バイト単位の最短回答が勝ちです。

テストケース

aabbcccc-> aaabbbccccc
ドアベル-> ddooorrbbeelll
uuuuuuuuuz-> uuuuuuuuuuzz
q-> qq
xyxyxy-> xxyyxxyyxxyy
xxxyyy-> xxxxyyyy

関連(ランの長さが奇数の場合にのみ別の文字を追加)
MildlyMilquetoast

回答:


11

05AB1E、5バイト

.¡€ĆJ

説明:

Example input: "dddogg"
.¡       Split into chunks of consecutive equal elements
         stack: [['ddd', 'o', 'gg']]
  €      For each...
   Ć       Enclose; append the first character to the end of the string
         stack: [['dddd', 'oo', 'ggg']]
    J    Join array elements into one string
         stack: ['ddddooggg']
Implicitly output top element in stack: "ddddooggg"

オンラインまたはテストスイートとしてお試しください

Encloseは、かなり新しいビルトインです。それは私がそれを使用したのは初めてです。とても便利 ;)

05AB1E、4バイト(非競合)

γ€ĆJ

γ最新のアップデートで置き換えられました。


Encloseは、これまでで最もクレイジーなビルトインの1つです。
エリックアウトゴルファー

3
@EriktheOutgolferクレイジー?いや
Okx

dddd「enclose」が実行された後の説明のスタックの配列の最初の要素を意味すると思います。
エソランジングフルーツ

ちょっと待って、一体何だĆ
魔法のタコUr

また、xx -> xxxxいつになるべきかxx -> xxx...?
魔法のタコUr



8

Pyth、7バイト

r9hMMr8

テストスイート

使い方

r9hMMr8  example input: "xxyx"
     r8  run-length encoding
         [[2, "x"], [1, "y"], [1, "x"]]
  hMM    apply h to each item
         this takes advantage of the overloading
         of h, which adds 1 to numbers and
         takes the first element of arrays;
         since string is array of characters in
         Python, h is invariant on them
         [[3, "x"], [2, "y"], [2, "x"]]
r9       run-length decoding
         xxxyyxx


6

アリス、17バイト

/kf.>o./
@i$QowD\

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

説明

/.../
@...\

これは、完全に順序モードで動作し、本質的に線形であるプログラムのフレームワークです(単純なループを記述でき、このプログラムで使用されますが、ここで分岐制御フローを使用するのは難しいです)。命令ポインターは、コードを左から右に斜めに上下に跳ね返り、最後の2つのミラーによって1セル分シフトし、右から左に戻り、最初の反復でスキップしたセルを実行します。線形化された形式(ミラーを無視)は、基本的に次のようになります。

ifQ>w.Doo.$k@

これを見ていきましょう。

i     Read all input as a string and push it to the stack.
f     Split the string into runs of equal characters and push those
      onto the stack.
Q     Reverse the stack, so that the first run is on top.
>     Ensure that the horizontal component of the IP's movement is east.
      This doesn't do anything now, but we'll need it after each loop
      iteration.
w     Push the current IP address to the return address stack. This marks
      the beginning of the main loop.

  .     Duplicate the current run.
  D     Deduplicate the characters in that run so we just get the character
        the run is made up of.
  o     Output the character.
  o     Output the run.
  .     Duplicate the next run. When we've processed all runs, this will
        duplicate an implicit empty string at the bottom of the stack instead.
  $     If the string is non-empty (i.e. there's another run to process),
        execute the next command otherwise skip it.

k     Pop an address from the return address stack and jump there. Note that
      the return address stack stores no information about the IP's direction,
      so after this, the IP will move northwest from the w. That's the wrong
      direction though, but the > sets the horizontal component of the IP's
      direction to east now, so that the IP passes over the w again and can
      now execute the next iteration in the correct direction.
@     Terminate the program.


4

Brachylog、8バイト

ḅ{t,?}ᵐc

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

説明

             Example input: "doorbell"
ḅ            Blocks: ["d","oo","r","b","e","ll"]
 {   }ᵐ      Map: ["dd","ooo","rr","bb","ee","lll"]
  t            Tail: "d" | "o" | "r" | "b" | "e" | "l"
   ,?          Prepend to input: "dd" | "ooo" | "rr" | "bb" | "ee" | "lll"
       c     Concatenate: "ddooorrbbeelll"


@LeakyNun私は実際に、これを投稿した直後にそれを見つけました
-17:

~メタ述語よりも優先する必要があります(または後置操作に変更します)。あなたがした場合、あなたは7でこれを行うことができます。



3

C、53バイト

i;f(char*s){for(;i=*s++;)putchar(i^*s?putchar(i):i);}

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


1
このソリューションを投稿していただき、ありがとうございます。2番目のputcharを省略した短いソリューションを考え出すきっかけになりました。賛成。
2501


3

Japt、8バイト

7バイトのコード、-Pフラグの+1 。

ó¥ ®+Zg

オンラインでテストしてください!

説明

これは、ó昨日追加した(偽のパーティション)ビルトインを使用します。

ó¥  ®   +Zg
ó== mZ{Z+Zg}

ó==           // Split the input into runs of equal chars.
    mZ{    }  // Replace each item Z in this array with
       Z+Zg   //   Z, concatenated with the first char of Z.
-P            // Join the resulting array back into a string.
              // Implicit: output result of last expression

3

六角形、33バイト

\~..,}/',\<.-/.<@;$>.${;/${/"$.>$

拡張:

   \ ~ . .
  , } / ' ,
 \ < . - / .
< @ ; $ > . $
 { ; / $ { /
  " $ . > $
   . . . .

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

擬似コードは多かれ少なかれです:

char = readchar()
while (char > 0)
    print(char)
    run_char = char
    do
        print(char)
        char = readchar()
    while (run_char == char)

3

JavaScript(ES6)、33 30バイト

s=>s.replace(/(.)\1*/g,"$1$&")

それを試してみてください

f=
s=>s.replace(/(.)\1*/g,"$1$&")
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("aabbcccc")) // aaabbbccccc
console.log(f("doorbell")) // ddooorrbbeelll
console.log(f("uuuuuuuuuz")) // uuuuuuuuuuzz
console.log(f("q")) // qq
console.log(f("xyxyxy")) // xxyyxxyyxxyy
console.log(f("xxxyyy")) // xxxxyyyy
<input id=i><pre id=o>


3

brainfuck、23バイト

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

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

説明

,            read the first input character
 [           main loop to be run for each input character
 .           output the character once
 [->->+<<]   subtract from previous character (initially 0), and create a copy of this character
 >[          if different from previous character:
   [-]       zero out cell used for difference (so this doesn't loop)
   >.<       output character again from copy
 ]
 ,           read another input character
]

1
これは256文字以上のレターで動作しますか?
エソランジングフルーツ

@ Challenger5はい。ランレングスは追跡されないため、ランレングスがオーバーフローする方法はありません。
ニトロドン



2

Haskell、36バイト

f(a:b:c)=a:[a|a/=b]++f(b:c)
f x=x++x

使用例:f "aab"-> "aaabb"オンラインでお試しください!

文字列に少なくとも2つの文字がある場合、a最初の文字、b2番目の文字、およびc文字列の残りの部分にバインドします。出力のa後に、aif aが等しくない場合にb、再帰呼び出しが続きb:cます。文字が1つしかない場合、結果はこの文字の2倍になります。


2

CJam、10バイト

le`1af.+e~

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

説明:

e# Input: doorbell
l   e# Read line:              | "doorbell"
e`  e# Run-length encode:      | [[1 'd] [2 'o] [1 'r] [1 'b] [1 'e] [2 'l]]
1a  e# Push [1]:               | [[1 'd] [2 'o] [1 'r] [1 'b] [1 'e] [2 'l]] [1]
f.+ e# Vectorized add to each: | [[2 'd] [3 'o] [2 'r] [2 'b] [2 'e] [3 'l]]
e~  e# Run-length decode:      | "ddooorrbbeelll"
e# Implicit output: ddooorrbbeelll


2

ゼリー、5バイト

n2\׿

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

使い方

n2\׿  Main link. Argument: s (string)

n2\    Reduce all overlapping slices of length two by non-equal.
       For input "doorbell", this returns [1, 0, 1, 1, 1, 1, 0].
   ×   Multiply the characters of s by the Booleans in the resulting array. This is
       essentially a bug, but integer-by-string multiplication works as in Python.
       For input "doorbell", this returns ['d', '', 'o', 'r', 'b', 'e', '', 'l'].
       Note that the last character is always left unchanged, as the Boolean array
       has one fewer element than s.
    ż  Zip the result with s, yielding an array of pairs.
       For input "doorbell", this returns [['d', 'd'], [[], 'o'], ['o', 'o'],
           ['r', 'r'], ['b', 'b'], ['e', 'e'], [[], 'l'], ['l', 'l']].
       (implicit) Print the flattened result.

よくやった、デニス。
リーキー修道女

1

バッチ、140バイト

@set/ps=
@set r=
:g
@if not "%s:~,1%"=="%s:~1,1%" set r=%r%%s:~,1%
@set r=%r%%s:~,1%
@set s=%s:~1%
@if not "%s%"=="" goto g
@echo %r%

STDINで入力を受け取ります。





1

Mathematica、34 21バイト

Mathematicaでこれを行う正しい方法を見つけて13バイトを節約したMartin Enderに感謝します!

##&[#,##]&@@@Split@#&

入力フォーマットと出力フォーマットの両方として文字の配列を使用する純粋な機能。Splitリストを等しい文字の実行に分割します。##&[#,##]&引数のシーケンスを返す関数です:最初に渡された引数、次にすべての引数(したがって、特に最初の引数を繰り返します)。これは@@@Splitリストのすべてのサブリストに適用されます()。


1
たぶん##&[#,##]&@@@Split@#&?(テストなし)
マーティンエンダー

1
^テスト済み。ところで、Gather実際に同じ文字の複数の実行がある場合は動作しません(しかし、幸運にもSplitとにかく1バイト短くなっています)
マーティンエンダー

(そうそう、私はSplit私の心の中で意味した)あなたの最初のコメントで素晴らしい構築!
グレッグマーティン

1

Java、151 146 60バイト

String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
  • -5バイト、@ FryAmTheEggmanのおかげ
  • -86バイト、@ KevinCruijssenのおかげ

正規表現

(         )     group

 (.)            a character

     \\2*       optional repetition

詳細

import java.util.*;
import java.lang.*;
import java.io.*;

class H
{
    public static String f(String s)
    {
        return s.replaceAll("((.)\\2*)","$1$2");
    }

    public static void main(String[] args)
    {
        f("dddogg");
    }
}

すでにJavaの答えがあることに気づかなかったので、私は私のものを削除しました。しかし、なぜMatcherand Pattern?あなたはにゴルフをすることができます60バイト:このようなString f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
ケビンCruijssen

@KevinCruijssenは修正されました、thx。
Khaled.K

1

brainfuck、38バイト

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

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

,.               print the "doubling" of the first char of input
[                this main loop runs on every char
  .              print it "normally" (the not-doubling)
  >,             read the next char
  [              judiciously placed "loop" to prevent printing NULs
    [->+>+<<]    copy new char at position p to p+1 and p+2
    <[->>-<<]>>  subtract old char from p+1 - zero if same, nonzero otherwise
    [            if it *is* different (nonzero)...
      [-]        clear it
      >.<        print the char (at p+2 now) again
    ]
  ]
  >              the new char is now the old char
]

1

アリス、12バイト

この回答が投稿される前でも、Martin Enderのおかげで2バイトがゴルフされました。彼はあなたが想像するよりも強力です。

I4&.h%?-$OO!

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

説明

I                 Input a character and push its unicode value
 4&.              Push 4 more copies of this value to the stack
                  (they will be needed for the following operations)
    h%            Try to compute n%(n+1), exits with an error if n==-1
                  which happens on EOF
      ?           Push a copy of what's currently on the tape.
                  In the first iteration this will push -1, in following
                  iterations it will push the previous character.
       -$O        If the two topmost values on the stack are different
                  output the third one. This will output one more copy of
                  any new character encountered.
          O       Output this character.
           !      Store this character on the tape.

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