Aumentar as tiragens de cartas

28

Dada uma sequência não vazia de letras ASCII em minúsculas a-z, produza essa sequência com cada “execução” consecutiva da mesma letra, prolongada por mais uma cópia dessa letra.

Por exemplo, dddogg( 3 d ', 1 o , 2 g ') se transforma ddddooggg( 4 d ', 2 o ', 3 g ').

Isso é : a resposta mais curta em bytes vence.

Casos de teste

aabbcccc -> aaabbbccccc
campainha -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy
Lynn
fonte
Relacionado (apenas acrescentar um outro personagem, se o comprimento da corrida é ímpar)
MildlyMilquetoast

Respostas:

11

05AB1E , 5 bytes

.¡€ĆJ

Explicação:

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"

Experimente online ou como uma suíte de testes .

Incluir é um novo e bastante embutido; é a primeira vez que eu o uso. Muito conveniente ;)

05AB1E , 4 bytes (não concorrente)

γ€ĆJ

foi substituído por γna atualização mais recente.

Okx
fonte
O anexo é um dos mais loucos de todos os tempos.
Erik the Outgolfer
3
@EriktheOutgolfer Crazy? Nah.
Okx
Eu acho que você quer dizer ddddo primeiro elemento da matriz na pilha na explicação após a execução de "delimitar".
Esolanging Fruit
Uau, espere um minuto, o que diabos é Ć?
Magic Octopus Urn
Além disso, xx -> xxxxquando deveria ser xx -> xxx...?
Magic Octopus Urn
10

Retina , 11 bytes

(.)\1*
$1$&

Experimente online!

Substitui cada execução de caracteres por um dos caracteres da execução, seguido pela própria execução.

FryAmTheEggman
fonte
8

Pitão , 7 bytes

r9hMMr8

Conjunto de teste .

Como 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
Freira Furada
fonte
7

MATL , 5 bytes

Y'QY"

Experimente online!

Explicação

Considere 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'
Luis Mendo
fonte
6

Alice , 17 bytes

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

Experimente online!

Explicação

/.../
@...\

Essa é uma estrutura para programas que operam inteiramente no modo Ordinal e são essencialmente lineares (loops simples podem ser escritos e um é usado neste programa, mas é mais difícil trabalhar aqui com o fluxo de controle de ramificação). O ponteiro de instrução salta na diagonal para cima e para baixo através do código da esquerda para a direita, depois é deslocado por uma célula pelos dois espelhos no final e volta da direita para a esquerda, executando as células que foram puladas na primeira iteração. A forma linearizada (ignorando os espelhos) fica basicamente assim:

ifQ>w.Doo.$k@

Vamos passar por isso:

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
fonte
4

Braquilog , 8 bytes

ḅ{t,?}ᵐc

Experimente online!

Explicação

             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"
Fatalizar
fonte
@LeakyNun eu realmente achei que um também apenas depois de postar um presente
Fatalize
Você realmente precisa ~ter precedência sobre os metapredicados (ou alterá-lo para uma operação postfix); se você fez, você poderia fazer isso em sete.
4

C, 49 bytes

i;f(char*s){for(;putchar(*s);)i=s[i]^s[1]||!s++;}

Veja como funciona online .

2501
fonte
3

C, 53 bytes

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

Experimente online!

betseg
fonte
1
Obrigado por postar esta solução, pois me motivou a encontrar uma solução mais curta que omita o segundo putchar. Votado.
2501
3

PHP, 40 bytes

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

Versão Online

PHP <7,1, 44 bytes

Versão sem Regex

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

Versão Online

Jörg Hülsermann
fonte
3

Japonês , 8 bytes

7 bytes de código, +1 para o -Psinalizador.

ó¥ ®+Zg

Teste online!

Explicação

Isso usa o ó(partição no falso) interno que eu acabei de adicionar ontem:

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

Hexagonia , 33 bytes

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

Expandido:

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

Experimente online!

O pseudocódigo é mais ou menos:

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

JavaScript (ES6), 33 30 bytes

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

Tente

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
fonte
3

brainfuck , 23 bytes

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

Experimente online!

Explicação

,            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
fonte
1
Isso funcionará com letra executada> 256?
Esolanging Fruit
@ Challenger5 Sim. O comprimento da execução nem é rastreado; portanto, não há como transbordar.
Nitrodon
2

Perl 6 , 18 bytes

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

Tente

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)
}
Brad Gilbert b2gills
fonte
2

05AB1E , 8 bytes

.¡DÔ‚ø˜J

Experimente online!

Explicação:

.¡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, o Outgolfer
fonte
2

Haskell, 36 bytes

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

Exemplo de uso: f "aab"-> "aaabb". Experimente online!

Quando a sequência tiver pelo menos dois caracteres, vincule a- se ao primeiro, bao segundo e cao restante da sequência. A saída é aseguida por ase anão for igual a bseguida por uma chamada recursiva com b:c. Se houver apenas um caractere, o resultado será duas vezes esse caractere.

nimi
fonte
2

CJam, 10 bytes

le`1af.+e~

Experimente online!

Explicação:

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
Esolanging Fruit
fonte
2

Ruby, 30 bytes

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

Geléia , 5 bytes

n2\׿

Experimente online!

Como 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.
Dennis
fonte
Bem jogado, 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%

Recebe entrada em STDIN.

Neil
fonte
1

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

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

Solução original

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

R, 36 bytes

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

Mathematica, 34 21 bytes

Agradecemos a Martin Ender por encontrar o caminho certo para fazer isso no Mathematica, economizando 13 bytes!

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

Função pura usando uma matriz de caracteres nos formatos de entrada e saída. Splitsepara uma lista em suas execuções de caracteres iguais. ##&[#,##]&é uma função que retorna uma sequência de argumentos: o primeiro argumento é alimentado, depois todos os argumentos (repetindo o primeiro em particular); isso é aplicado ( @@@) a todas as sub- Splitlistas da lista.

Greg Martin
fonte
1
Talvez ##&[#,##]&@@@Split@#&? (Não testado.)
Martin Ender
1
^ Agora testado. Btw, Gatherna verdade não funciona se houver várias execuções do mesmo personagem (mas felizmente Splité um byte mais curto de qualquer maneira)
Martin Ender
(Ah, sim, eu quis dizer Splitem meu coração) Construção maravilhosa em seu primeiro comentário!
Greg Martin
1

Java, 151 146 60 bytes

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

Regex

(         )     group

 (.)            a character

     \\2*       optional repetition

Detalhado

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
fonte
Não tinha notado que já havia uma resposta Java, então eu apaguei a minha. Mas por que o Matchere Pattern? Você pode golfe para 60 bytes como este:String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen
@KevinCruijssen corrigido agora, thx.
precisa saber é o seguinte
1

brainfuck , 38 bytes

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

Experimente 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
]
Maçaneta da porta
fonte
1

Alice , 12 bytes

Dois bytes foram jogados no golfe graças a Martin Ender antes mesmo de esta resposta ser publicada. Ele é mais poderoso do que você jamais poderia imaginar.

I4&.h%?-$OO!

Experimente online!

Explicação

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
fonte