Allunga le lettere


28

Data una stringa non vuota di lettere ASCII minuscole a-z, genera quella stringa con ogni "sequenza" consecutiva della stessa lettera allungata di un'altra copia di quella lettera.

Ad esempio, dddogg( 3 d ", 1 o , 2 g ") si trasforma in ddddooggg( 4 d ", 2 o ", 3 g ").

Questo è : vince la risposta più breve in byte.

Casi test

aabbcccc -> aaabbbccccc
campanello -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuzz
q -> qq
xxyxy -> xxyxyxyxyxyy
xxxyyy -> xxxxyyyy

Correlato (aggiungi un altro personaggio solo se la lunghezza della corsa è dispari)
MildlyMilquetoast

Risposte:


11

05AB1E , 5 byte

.¡€ĆJ

Spiegazione:

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"

Provalo online o come suite di test .

Racchiudere è un built-in piuttosto nuovo; è la prima volta che lo uso. Molto conveniente ;)

05AB1E , 4 byte (non concorrenti)

γ€ĆJ

è stato sostituito da γnell'ultimo aggiornamento.


Racchiudere è uno dei builtins più folli di sempre.
Erik the Outgolfer,

3
@EriktheOutgolfer Crazy? Nah.
Okx,

Penso che intendi ddddper il primo elemento dell'array nello stack nella spiegazione dopo l'esecuzione di "racchiudi".
Esolanging Fruit

Woah, aspetta un minuto, che diavolo è Ć?
Magic Octopus Urn

Inoltre, xx -> xxxxquando dovrebbe essere xx -> xxx...?
Magic Octopus Urn



8

Pyth , 7 byte

r9hMMr8

Suite di test .

Come funziona

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

7

MATL , 5 byte

Y'QY"

Provalo online!

Spiegazione

Considera l'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'

6

Alice , 17 byte

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

Provalo online!

Spiegazione

/.../
@...\

Questo è un framework per programmi che funzionano interamente in modalità Ordinale e sono essenzialmente lineari (è possibile scrivere semplici loop e uno viene utilizzato in questo programma, ma è più complicato lavorare con un flusso di controllo altrimenti ramificato qui). Il puntatore dell'istruzione rimbalza in diagonale su e giù attraverso il codice da sinistra a destra, quindi viene spostato di una cella dai due mirror alla fine e si sposta indietro da destra a sinistra, eseguendo le celle saltate alla prima iterazione. La forma linearizzata (ignorando gli specchi) sembra quindi sostanzialmente questa:

ifQ>w.Doo.$k@

Andiamo attraverso questo:

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 byte

ḅ{t,?}ᵐc

Provalo online!

Spiegazione

             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 In realtà l'ho trovato anche uno dopo aver pubblicato questo
Fatalizza

Devi davvero avere la ~precedenza sui metapredicati (o cambiarlo in un'operazione postfix); se lo facessi, potresti farlo in sette.



3

C, 53 byte

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

Provalo online!


1
Grazie per aver pubblicato questa soluzione perché mi ha motivato a trovare una soluzione più breve che omette il secondo putchar. Upvoted.
2501


3

Japt , 8 byte

7 byte di codice, +1 per la -Pbandiera.

ó¥ ®+Zg

Provalo online!

Spiegazione

Questo utilizza il óbuilt-in (partizione su falsy) che ho appena aggiunto ieri:

ó¥  ®   +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

Esagonia , 33 byte

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

Allargato:

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

Provalo online!

Lo pseudo-codice è più o meno:

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

3

JavaScript (ES6), 33 30 byte

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

Provalo

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 byte

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

Provalo online!

Spiegazione

,            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
Funzionerà con esecuzioni di lettere> 256?
Esolanging Fruit

@ Challenger5 Sì. La lunghezza della corsa non viene nemmeno tracciata, quindi non c'è modo di traboccare la lunghezza della corsa.
Nitrodon,

2

Perl 6 , 18 byte

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

Provalo

Allargato:

{   # 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)
}

2

05AB1E , 8 byte

.¡DÔ‚ø˜J

Provalo online!

Spiegazione:

.¡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

2

Haskell, 36 byte

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

Esempio di utilizzo: f "aab"-> "aaabb". Provalo online!

Quando la stringa ha almeno due caratteri, associa aal primo carattere, bal secondo e cal resto della stringa. L'output è aseguito da aif anon è uguale a bseguito da una chiamata ricorsiva con b:c. Se esiste un solo carattere, il risultato è due volte questo carattere.


2

CJam, 10 byte

le`1af.+e~

Provalo online!

Spiegazione:

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

Rubino, 30 byte

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

2

Gelatina , 5 byte

n2\׿

Provalo online!

Come funziona

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.

Ben giocato, Dennis.
Leaky Nun,

1

Lotto, 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%

Accetta input su STDIN.


1

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

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

Soluzione originale

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

1

R, 36 byte

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


1

Mathematica, 34 21 byte

Grazie a Martin Ender per aver trovato il modo giusto di farlo in Mathematica, risparmiando 13 byte!

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

Funzione pura che utilizza una matrice di caratteri come formati di input e output. Splitsepara un elenco nelle sue serie di caratteri uguali. ##&[#,##]&è una funzione che restituisce una sequenza di argomenti: viene alimentato il primo argomento, quindi tutti gli argomenti (quindi ripetendo il primo in particolare); questo viene applicato ( @@@) a ogni elenco secondario Splitdell'elenco.


1
Forse ##&[#,##]&@@@Split@#&? (Non testato.)
Martin Ender,

1
^ Ora testato. A proposito, in Gatherrealtà non funziona se ci sono più esecuzioni dello stesso personaggio (ma per fortuna Splitè comunque un byte più breve)
Martin Ender

(oh sì, intendevo Splitnel mio cuore) Costruzione meravigliosa nel tuo primo commento!
Greg Martin,

1

Java, 151 146 60 byte

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

regex

(         )     group

 (.)            a character

     \\2*       optional repetition

dettagliata

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

Non avevo notato che c'era già una risposta Java, quindi ho eliminato la mia. Ma perché il Matchere Pattern? Puoi giocare a golf a 60 byte in questo modo:String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen

@KevinCruijssen risolto ora, grazie.
Khaled.K,

1

Brainfuck , 38 byte

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

Provalo 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
]

1

Alice , 12 byte

Due byte sono stati giocati a golf grazie a Martin Ender anche prima che questa risposta fosse pubblicata. È più potente di quanto tu possa mai immaginare.

I4&.h%?-$OO!

Provalo online!

Spiegazione

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.