Alargar tiradas


28

Dada una cadena no vacía de letras minúsculas ASCII a-z, envíe esa cadena con cada "ejecución" consecutiva de la misma letra alargada por una copia más de esa letra.

Por ejemplo, dddogg( 3 d ', 1 o , 2 g ') se convierte en ddddooggg( 4 d ', 2 o ', 3 g ').

Este es el : gana la respuesta más corta en bytes.

Casos de prueba

aabbcccc -> aaabbbccccc
timbre -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy

Relacionados (sólo añadir otro personaje si la longitud de la carrera es impar)
MildlyMilquetoast

Respuestas:


11

05AB1E , 5 bytes

.¡€ĆJ

Explicación:

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"

Pruébelo en línea o como un conjunto de pruebas .

Enclose es una nueva y bonita construcción; Es la primera vez que lo uso. Muy conveniente ;)

05AB1E , 4 bytes (no competitivos)

γ€ĆJ

ha sido reemplazado por γen la última actualización.


Enclose es una de las construcciones más locas de la historia.
Erik the Outgolfer

3
@EriktheOutgolfer Crazy? Nah
Okx

Creo que te refieres ddddal primer elemento de la matriz en la pila en la explicación después de que se ejecuta "encierre".
Esolanging Fruit

Woah, espera un minuto, ¿qué demonios es Ć?
Magic Octopus Urn

Además, ¿ xx -> xxxxcuándo debería ser xx -> xxx...?
Magic Octopus Urn



8

Pyth , 7 bytes

r9hMMr8

Banco de pruebas .

Cómo funciona

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 bytes

Y'QY"

Pruébalo en línea!

Explicación

Considere la entrada '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 bytes

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

Pruébalo en línea!

Explicación

/.../
@...\

Este es un marco para programas que operan completamente en modo Ordinal y son esencialmente lineales (se pueden escribir bucles simples, y se usa uno en este programa, pero es más complicado trabajar con flujo de control de otra manera aquí). El puntero de instrucciones rebota diagonalmente hacia arriba y hacia abajo a través del código de izquierda a derecha, luego es desplazado por una celda por los dos espejos al final, y se mueve hacia atrás de derecha a izquierda, ejecutando las celdas que omitió en la primera iteración. La forma linealizada (ignorando los espejos) básicamente se ve así:

ifQ>w.Doo.$k@

Veamos esto:

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 bytes

ḅ{t,?}ᵐc

Pruébalo en línea!

Explicación

             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 En realidad encontré esa también justo después de publicar esta
Fatalize

Realmente necesita hacer que ~tenga prioridad sobre metapredicados (o cambiarlo a una operación de postfix); si lo hicieras, podrías hacerlo en siete.



3

C, 53 bytes

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

Pruébalo en línea!


1
Gracias por publicar esta solución, ya que me motivó a encontrar una solución más corta que omita el segundo putchar. Votado
2501


3

Japt , 8 bytes

7 bytes de código, +1 para la -Pbandera.

ó¥ ®+Zg

¡Pruébalo en línea!

Explicación

Esto utiliza el ó(partición en falso) incorporado que acabo de agregar ayer:

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

Hexagonía , 33 bytes.

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

Expandido:

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

Pruébalo en línea!

El pseudocódigo es más o menos:

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

3

JavaScript (ES6), 33 30 bytes

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

Intentalo

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 bytes

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

Pruébalo en línea!

Explicación

,            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
¿Funcionará esto con corridas de letras> 256?
Esolanging Fruit

@ Challenger5 Sí. La longitud de la ejecución ni siquiera se realiza un seguimiento, por lo que no hay forma de que la longitud de la ejecución se desborde.
Nitrodon

2

Perl 6 , 18 bytes

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

Intentalo

Expandido:

{   # 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 bytes

.¡DÔ‚ø˜J

Pruébalo en línea!

Explicación:

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

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

Ejemplo de uso: f "aab"-> "aaabb". Pruébalo en línea!

Cuando la cadena tiene al menos dos caracteres, únete aal primer carácter, bal segundo y cal resto de la cadena. La salida es aseguida por asi ano es igual a bseguido por una llamada recursiva con b:c. Si solo hay un personaje, el resultado es dos veces este personaje.


2

CJam, 10 bytes

le`1af.+e~

Pruébalo en línea!

Explicación:

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

Rubí, 30 bytes.

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

2

Jalea , 5 bytes

n2\׿

Pruébalo en línea!

Cómo funciona

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.

Bien jugado, Dennis.
Leaky Nun

1

Lote, 140 bytes

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

Toma entrada en STDIN.


1

sed, 18 15 bytes (+1 para -r)

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

Solución original

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

1

R, 36 bytes

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


1

Mathematica, 34 21 bytes

¡Gracias a Martin Ender por encontrar la manera correcta de hacer esto en Mathematica, ahorrando 13 bytes!

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

Función pura que utiliza una matriz de caracteres como formatos de entrada y salida. Splitsepara una lista en sus series de caracteres iguales. ##&[#,##]&es una función que devuelve una secuencia de argumentos: se alimenta el primer argumento, luego todos los argumentos (repitiendo el primero en particular); Esto se aplica ( @@@) a cada sublista de la Splitlista.


1
Tal vez ##&[#,##]&@@@Split@#&? (Sin probar)
Martin Ender

1
^ Ahora probado. Por cierto, en Gatherrealidad no funciona si hay varias ejecuciones del mismo personaje (pero afortunadamente Splites un byte más corto de todos modos)
Martin Ender

(oh sí, quise decir Spliten mi corazón) ¡Construcción maravillosa en tu primer comentario!
Greg Martin

1

Java, 151 146 60 bytes

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

Regex

(         )     group

 (.)            a character

     \\2*       optional repetition

Detallado

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

No había notado que ya había una respuesta de Java, así que eliminé la mía. ¿Pero por qué el Matchery Pattern? Puede jugar golf a 60 bytes de esta manera:String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen

@KevinCruijssen arreglado ahora, gracias.
Khaled.K

1

brainfuck , 38 bytes

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

Pruébalo en línea!

,.               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 bytes

Dos bytes se jugaron gracias a Martin Ender incluso antes de que se publicara esta respuesta. Es más poderoso de lo que puedas imaginar.

I4&.h%?-$OO!

Pruébalo en línea!

Explicación

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.