Perpanjang surat berjalan

28

Diberikan string huruf ASCII huruf kecil yang tidak kosong a-z, mengeluarkan string itu dengan masing-masing "run" berturut-turut dari huruf yang sama diperpanjang dengan satu salinan lagi surat itu.

Misalnya, dddogg( 3 d 's, 1 o , 2 g 's) berubah menjadi ddddooggg( 4 d 's, 2 o 's, 3 g 's).

Ini adalah : jawaban tersingkat dalam byte menang.

Uji kasus

aabbcccc -> aaabbbccccc
bel pintu -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy
Lynn
sumber
Terkait (hanya tambahkan karakter lain jika panjang
prosesnya

Jawaban:

11

05AB1E , 5 byte

.¡€ĆJ

Penjelasan:

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"

Cobalah secara online atau sebagai test suite .

Enclose adalah builtin yang cukup baru; ini pertama kalinya saya menggunakannya. Sangat mudah ;)

05AB1E , 4 byte (tidak bersaing)

γ€ĆJ

telah diganti oleh γdalam pembaruan terbaru.

Okx
sumber
Lampirkan adalah salah satu builtin paling gila yang pernah ada.
Erik the Outgolfer
3
@EriktheOutgolfer Gila? Tidak
Okx
Saya pikir maksud Anda dddduntuk elemen pertama dari array pada stack dalam penjelasan setelah "terlampir" dieksekusi.
Buah Esolanging
Woah, tunggu sebentar, apa-apaan ini Ć?
Magic Gurita Guci
Juga, xx -> xxxxkapan seharusnya xx -> xxx...?
Magic Gurita Guci
15

Python 3 , 44 byte

for c in input():print(c,end=c[id==c:]);id=c

Cobalah online!

Dennis
sumber
10

Retina , 11 byte

(.)\1*
$1$&

Cobalah online!

Mengganti setiap run karakter dengan salah satu karakter run diikuti oleh run itu sendiri.

FryAmTheEggman
sumber
8

Pyth , 7 byte

r9hMMr8

Suite uji .

Bagaimana itu bekerja

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
Biarawati Bocor
sumber
7

MATL , 5 byte

Y'QY"

Cobalah online!

Penjelasan

Pertimbangkan input 'doorbell'.

Y'    % Implicit input. Run-length encoding
      % STACK: 'dorbel', [1 2 1 1 1 2]
Q     % Increase by 1, element-wise
      % STACK: 'dorbel', [2 3 2 2 2 3]
Y"    % Run-length decoding. Implicit display
      % STACK: 'ddooorrbbeelll'
Luis Mendo
sumber
6

Alice , 17 byte

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

Cobalah online!

Penjelasan

/.../
@...\

Ini adalah kerangka kerja untuk program yang beroperasi sepenuhnya dalam mode Ordinal dan pada dasarnya linier (loop sederhana dapat ditulis, dan satu digunakan dalam program ini, tetapi lebih sulit untuk bekerja dengan aliran kontrol bercabang di sini). Pointer instruksi memantul secara diagonal ke atas dan ke bawah melalui kode dari kiri ke kanan, kemudian digeser satu sel oleh dua mirror di akhir, dan bergerak kembali dari kanan ke kiri, mengeksekusi sel yang dilompati pada iterasi pertama. Bentuk linear (mengabaikan cermin) maka pada dasarnya terlihat seperti ini:

ifQ>w.Doo.$k@

Mari kita lalui ini:

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.
Martin Ender
sumber
5

Jelly , 6 byte

Œg;Q$€

Cobalah online!

Hanya berfungsi sebagai program lengkap (yaitu keluaran yang dirubah).

Erik the Outgolfer
sumber
4

Brachylog , 8 byte

ḅ{t,?}ᵐc

Cobalah online!

Penjelasan

             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"
Fatalisasi
sumber
@ LeakyNun Saya benar-benar menemukan itu juga setelah memposting yang ini
Fatalize
Anda benar-benar harus ~didahulukan daripada metapredicate (atau ubah ke operasi postfix); jika Anda melakukannya, Anda bisa melakukan ini dalam tujuh.
3

Python 2 , 47 byte

f=lambda s:s and-~(s[0]*2!=s[:2])*s[0]+f(s[1:])

Cobalah online!

ovs
sumber
3

C, 53 byte

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

Cobalah online!

betseg
sumber
1
Terima kasih telah memposting solusi ini karena memotivasi saya untuk datang dengan solusi yang lebih pendek yang menghilangkan putchar kedua. Terpilih.
2501
3

PHP, 40 Bytes

<?=preg_filter('#(.)\1*#',"$1$0",$argn);

Versi Online

PHP <7.1, 44 Bytes

Versi tanpa Regex

for(;a&$c=$argn[$i++];)echo$c[$c==$l].$l=$c;

Versi Online

Jörg Hülsermann
sumber
3

Japt , 8 byte

7 byte kode, +1 untuk -Pbendera.

ó¥ ®+Zg

Uji secara online!

Penjelasan

Ini menggunakan óbuilt-in (partisi on falsy) yang baru saja saya tambahkan kemarin:

ó¥  ®   +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
Produksi ETH
sumber
3

Hexagony , 33 byte

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

Diperluas:

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

Cobalah online!

Kode semu kurang lebih:

char = readchar()
while (char > 0)
    print(char)
    run_char = char
    do
        print(char)
        char = readchar()
    while (run_char == char)
FryAmTheEggman
sumber
3

JavaScript (ES6), 33 30 byte

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

Cobalah

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>

Shaggy
sumber
3

brainfuck , 23 byte

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

Cobalah online!

Penjelasan

,            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
]
Nitrodon
sumber
1
Apakah ini bekerja dengan huruf berjalan> 256?
Buah Esolanging
@ Challenger5 Ya. Panjang run bahkan tidak dilacak, jadi tidak ada cara untuk menjalankan panjang untuk meluap.
Nitrodon
2

Perl 6 , 18 byte

{S:g/)>(.)$0*/$0/}

Cobalah

Diperluas:

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

  S        # replace and return
  :global  # all occurrences
  /

    )>     # don't actually remove anything after this

    (.)    # match a character

    $0*    # followed by any number of the same character

  /$0/     # replace with the character (before the match)
}
Brad Gilbert b2gills
sumber
2

05AB1E , 8 byte

.¡DÔ‚ø˜J

Cobalah online!

Penjelasan:

.¡DÔ‚ø˜J
.¡       Split equal runs of input
  D      Duplicate
   Ô     Take connected-uniquified
    ‚    Pair connected-uniquified equal runs with original equal runs
     ø   Zip
      ˜  Deep-flatten (i.e. normal flattening)
       J Join elements together
Erik the Outgolfer
sumber
2

Haskell, 36 byte

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

Contoh penggunaan: f "aab"-> "aaabb". Cobalah online!

Ketika string memiliki setidaknya dua karakter, ikat ake karakter pertama, bke karakter kedua dan cke seluruh string. Output adiikuti oleh ajika atidak sama dengan bdiikuti oleh panggilan rekursif dengan b:c. Jika hanya ada satu char, hasilnya adalah dua kali char ini.

nimi
sumber
2

CJam, 10 byte

le`1af.+e~

Cobalah online!

Penjelasan:

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
Buah Esolanging
sumber
2

Ruby, 30 byte

->s{s.gsub(/((.)\2*)/){$1+$2}}
Cyoce
sumber
2

Jelly , 5 byte

n2\׿

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
Dimainkan dengan baik, Dennis.
Leaky Nun
1

Batch, 140 byte

@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%

Mengambil input pada STDIN.

Neil
sumber
1

sed, 18 15 byte (+1 untuk -r)

s/(.)\1*/\1&/g

Solusi asli

s/((.)\2*)/\1\2/g
Ryan McCleary
sumber
1

R, 36 byte

gsub("((.)\\1*)","\\2\\1",scan(,""))
flodel
sumber
1

PowerShell, 50 byte

{-join([char[]]$_|%{if($_-ne$p){($p=$_)}$_});rv p}

Cobalah online!

Andrei Odegov
sumber
1

Mathematica, 34 21 byte

Terima kasih kepada Martin Ender karena menemukan cara yang tepat untuk melakukan ini di Mathematica, menghemat 13 byte!

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

Fungsi murni menggunakan array karakter sebagai format input dan output. Splitmemisahkan daftar ke dalam menjalankannya karakter yang sama. ##&[#,##]&adalah fungsi yang mengembalikan urutan argumen: argumen pertama diumpankan, lalu semua argumen (jadi ulangi argumen pertama khususnya); ini diterapkan ( @@@) ke setiap sublist dari Splitdaftar.

Greg Martin
sumber
1
Mungkin ##&[#,##]&@@@Split@#&? (Belum diuji.)
Martin Ender
1
^ Sekarang diuji. Btw, Gathersebenarnya tidak berfungsi jika ada beberapa kali menjalankan karakter yang sama (tapi untungnya Splitlebih pendek satu byte)
Martin Ender
(oh yeah, maksud Splitsaya di hati saya) Konstruksi indah di komentar pertama Anda!
Greg Martin
1

Java, 151 146 60 byte

String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
  • -5 byte, terima kasih kepada @FryAmTheEggman
  • -86 byte, terima kasih kepada @KevinCruijssen

Regex

(         )     group

 (.)            a character

     \\2*       optional repetition

Terperinci

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");
    }
}
Khaled.K
sumber
Tidak memperhatikan sudah ada jawaban Java, jadi saya sudah menghapus jawaban saya. Tapi mengapa Matcherdan Pattern? Anda dapat golf hingga 60 byte seperti ini:String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen
@KevinCruijssen diperbaiki sekarang, thx.
Khaled.K
1

brainfuck , 38 byte

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

Cobalah online!

,.               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
]
Gagang pintu
sumber
1

Alice , 12 byte

Dua byte diangkut berkat Martin Ender bahkan sebelum jawaban ini diposting Dia lebih kuat dari yang bisa kamu bayangkan.

I4&.h%?-$OO!

Cobalah online!

Penjelasan

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.
Leo
sumber