Allonger les tirages de lettres

28

Étant donné une chaîne non vide de lettres ASCII minuscules a-z, sortez cette chaîne à chaque «exécution» consécutive de la même lettre allongée d'une copie de plus de cette lettre.

Par exemple, dddogg( 3 d ’s, 1 o , 2 g ’ s) se transforme en ddddooggg( 4 d ’s, 2 o ’ s, 3 g ’s).

C'est le : la réponse la plus courte en octets l'emporte.

Cas de test

aabbcccc -> aaabbbccccc
sonnette -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy
Lynn
la source
Connexes (ajoutez un autre caractère uniquement si la durée de la course est impaire)
MildlyMilquetoast

Réponses:

11

05AB1E , 5 octets

.¡€ĆJ

Explication:

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"

Essayez-le en ligne ou en tant que suite de tests .

Enclose est une toute nouvelle construction; c'est la première fois que je l'utilise. Très pratique ;)

05AB1E , 4 octets (non concurrent)

γ€ĆJ

a été remplacé par γdans la dernière mise à jour.

Okx
la source
Enclose est l'un des buildins les plus fous de tous les temps.
Erik the Outgolfer
3
@EriktheOutgolfer Crazy? Non.
Okx
Je pense que vous voulez dire ddddpour le premier élément du tableau sur la pile dans l'explication après l'exécution de "enclose".
Esolanging Fruit
Woah, attends une minute, c'est quoi ce bordel Ć?
Urne de poulpe magique
Aussi, xx -> xxxxquand ça devrait être xx -> xxx...?
Urne de poulpe magique
10

Rétine , 11 octets

(.)\1*
$1$&

Essayez-le en ligne!

Remplace chaque séquence de caractères par l'un des caractères de la séquence suivi de la séquence elle-même.

FryAmTheEggman
la source
8

Pyth , 7 octets

r9hMMr8

Suite de tests .

Comment ça marche

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
Leaky Nun
la source
7

MATL , 5 octets

Y'QY"

Essayez-le en ligne!

Explication

Tenez compte des commentaires '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
la source
6

Alice , 17 octets

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

Essayez-le en ligne!

Explication

/.../
@...\

Il s'agit d'un cadre pour les programmes qui fonctionnent entièrement en mode Ordinal et sont essentiellement linéaires (de simples boucles peuvent être écrites, et une est utilisée dans ce programme, mais il est plus difficile de travailler avec un flux de contrôle autrement ramifié ici). Le pointeur d'instructions rebondit en diagonale de haut en bas à travers le code de gauche à droite, puis est décalé d'une cellule par les deux miroirs à la fin, et le recule de droite à gauche, exécutant les cellules qu'il a sautées lors de la première itération. La forme linéarisée (ignorant les miroirs) ressemble alors essentiellement à ceci:

ifQ>w.Doo.$k@

Passons par là:

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
la source
4

Brachylog , 8 octets

ḅ{t,?}ᵐc

Essayez-le en ligne!

Explication

             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"
Fatalize
la source
@LeakyNun J'ai trouvé celui-là aussi juste après avoir posté celui-ci
Fatalize
Vous devez vraiment faire ~prendre le pas sur les métaprédicats (ou le changer en opération postfix); si vous le faisiez, vous pourriez le faire en sept.
3

C, 53 octets

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

Essayez-le en ligne!

betseg
la source
1
Merci d'avoir posté cette solution car elle m'a motivé à proposer une solution plus courte qui omet le deuxième putchar. A voté.
2501
3

PHP, 40 octets

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

Version en ligne

PHP <7,1, 44 octets

Version sans Regex

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

Version en ligne

Jörg Hülsermann
la source
3

Japt , 8 octets

7 octets de code, +1 pour le -Pdrapeau.

ó¥ ®+Zg

Testez-le en ligne!

Explication

Cela utilise la ó(partition sur falsy) intégrée que je viens d'ajouter hier:

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

Hexagonie , 33 octets

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

Étendu:

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

Essayez-le en ligne!

Le pseudo-code est plus ou moins:

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

JavaScript (ES6), 33 30 octets

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

Essayez-le

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>

Hirsute
la source
3

brainfuck , 23 octets

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

Essayez-le en ligne!

Explication

,            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
la source
1
Est-ce que cela fonctionnera avec des tirages de lettres> 256?
Esolanging Fruit
@ Challenger5 Oui. La longueur de course n'est même pas suivie, il n'y a donc aucun moyen pour que la longueur de course déborde.
Nitrodon
2

Perl 6 , 18 octets

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

Essayez-le

Étendu:

{   # 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
la source
2

05AB1E , 8 octets

.¡DÔ‚ø˜J

Essayez-le en ligne!

Explication:

.¡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 le Outgolfer
la source
2

Haskell, 36 octets

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

Exemple d'utilisation: f "aab"-> "aaabb". Essayez-le en ligne!

Lorsque la chaîne a au moins deux caractères, liez-le aau premier, bau deuxième et cau reste de la chaîne. La sortie est asuivie de asi an'est pas égal à bsuivi d'un appel récursif avec b:c. S'il n'y a qu'un seul caractère, le résultat est deux fois ce caractère.

nimi
la source
2

CJam, 10 octets

le`1af.+e~

Essayez-le en ligne!

Explication:

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
la source
2

Rubis, 30 octets

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

Gelée , 5 octets

n2\׿

Essayez-le en ligne!

Comment ça marche

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
la source
Bien joué, Dennis.
Leaky Nun
1

Lot, 140 octets

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

Prend entrée sur STDIN.

Neil
la source
1

sed, 18 15 octets (+1 pour -r)

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

Solution originale

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

R, 36 octets

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

Mathematica, 34 21 octets

Merci à Martin Ender d'avoir trouvé la bonne façon de le faire dans Mathematica, en économisant 13 octets!

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

Fonction pure utilisant un tableau de caractères comme formats d'entrée et de sortie. Splitsépare une liste en ses séries de caractères égaux. ##&[#,##]&est une fonction qui renvoie une séquence d'arguments: le premier argument est alimenté, puis tous les arguments (donc en répétant le premier en particulier); ceci est appliqué ( @@@) à chaque sous-liste de la Splitliste.

Greg Martin
la source
1
Peut ##&[#,##]&@@@Split@#&- être ? (Non testé.)
Martin Ender
1
^ Maintenant testé. Btw, Gatherne fonctionne pas vraiment s'il y a plusieurs exécutions du même personnage (mais heureusement Splitun octet plus court de toute façon)
Martin Ender
(oh ouais, je voulais dire Splitdans mon cœur) Magnifique construction dans ton premier commentaire!
Greg Martin
1

Java, 151 146 60 octets

String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
  • -5 octets, grâce à @FryAmTheEggman
  • -86 octets, merci à @KevinCruijssen

Regex

(         )     group

 (.)            a character

     \\2*       optional repetition

Détaillé

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
la source
Je n'avais pas remarqué qu'il y avait déjà une réponse Java, j'ai donc supprimé la mienne. Mais pourquoi le Matcheret Pattern? Vous pouvez le String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
jouer
@KevinCruijssen corrigé maintenant, thx.
Khaled.K
1

brainfuck , 38 octets

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

Essayez-le en ligne!

,.               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
]
Poignée de porte
la source
1

Alice , 12 octets

Deux octets ont été joués grâce à Martin Ender avant même que cette réponse ne soit publiée. Il est plus puissant que vous ne pourriez l'imaginer.

I4&.h%?-$OO!

Essayez-le en ligne!

Explication

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
la source