Harfli yayınların uzatılması


28

Boş olmayan küçük harfli ASCII harflerden a-zoluşan bir dizge verildiğinde, bu dizgiyi aynı harfin ardışık "çalıştırması" ile, o harfin bir kopyasıyla uzatır.

Örneğin, dddogg( 3 d ’, 1 o , 2 g ’), ddddooggg( 4 d ’, 2 o ’, 3 g ’) haline gelir.

Bu : bayt cinsinden en kısa cevap kazanır.

Test durumları

aabbcccc -> aaabbbccccc
kapı zili -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy

İlgili (yalnızca koşunun uzunluğu
tekse

Yanıtlar:


11

05AB1E , 5 bayt

.¡€ĆJ

Açıklama:

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"

Çevrimiçi olarak veya bir test paketi olarak deneyin .

Enclose oldukça yeni bir yerleşiktir; ilk defa kullandım. Çok uygun;)

05AB1E , 4 bayt ( yarışmaz )

γ€ĆJ

γEn son güncellemede yerini aldı .


Enclose gelmiş geçmiş en çılgın yerlilerden biri.
Outgolfer Erik,

3
@EriktheOutgolfer Crazy? Hayır.
Okx

Bence dddd"enclose" çalıştırıldıktan sonra açıklamadaki yığtaki dizinin ilk elemanı için demek istediğini düşünüyorum .
Esolanging Fruit

Woah, bir dakika bekle, bu da ne Ć?
Magic Octopus Urn,

Ayrıca, xx -> xxxxne zaman olmalı xx -> xxx...?
Magic Octopus Urn,



8

Pyth , 7 bayt

r9hMMr8

Test paketi .

Nasıl çalışır

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 bayt

Y'QY"

Çevrimiçi deneyin!

açıklama

Girişi düşünün '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 bayt

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

Çevrimiçi deneyin!

açıklama

/.../
@...\

Bu, tamamen Ordinal modda çalışan ve esasen doğrusal olan programlar için bir çerçevedir (basit döngüler yazılabilir ve bu programda bir tane kullanılır, ancak burada başka bir şekilde dallanma kontrol akışıyla çalışmak daha zordur). Komut işaretçisi, kod boyunca soldan sağa doğru yukarı ve aşağı sekerek zıplar, sonra uçtaki iki ayna tarafından bir hücre tarafından kaydırılır ve ilk yinelemede atladığı hücreleri çalıştırarak sağdan sola hareket eder. Doğrusallaştırılmış form (aynaları yok sayarak) daha sonra temelde şuna benzer:

ifQ>w.Doo.$k@

Şunun içinden geçelim:

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 bayt

ḅ{t,?}ᵐc

Çevrimiçi deneyin!

açıklama

             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 Aslında bunu da yayınladıktan hemen sonra buldum
17'de Fatalize

Gerçekten ~metapredicates öncelikli (veya bir postfix işlemine değiştirmek) öncelikli kılmak gerekir ; yapsaydın bunu yedide yapabilirsin.



3

C, 53 bayt

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

Çevrimiçi deneyin!


1
Bu çözümü gönderdiğiniz için teşekkür ederiz, çünkü ikinci putchar'yı atlayan daha kısa bir çözüm bulmam için beni motive etti. Upvoted.
2501


3

Japt , 8 bayt

7 bayt kod, -Pbayrak için +1 .

ó¥ ®+Zg

Çevrimiçi test edin!

açıklama

Bu, ódün ekledim yerleşik (falsy bölümü) kullanır :

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

Altıgen , 33 bayt

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

Expanded:

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

Çevrimiçi deneyin!

Sahte kod az ya da çok:

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

3

JavaScript (ES6), 33 30 bayt

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

Dene

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 bayt

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

Çevrimiçi deneyin!

açıklama

,            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
Bu, harf sayısı> 256 ile mi olacak?
Esolanging Fruit

@ Challenger5 Evet. İşlem uzunluğu bile takip edilmiyor, bu nedenle işlem boyunun taşması mümkün değil.
Nitrodon

2

Perl 6 , 18 bayt

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

Dene

Expanded:

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

.¡DÔ‚ø˜J

Çevrimiçi deneyin!

Açıklama:

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

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

Kullanım örneği: f "aab"-> "aaabb". Çevrimiçi deneyin!

Dize en az iki karakter içerdiğinde, ailk karaktere, bikinciye ve cdizenin geri kalanına bağlanır . Bir tekrarlamalı çağrı ile takip etmeye eşit değilse , çıkışı aizler . Yalnızca bir karakter varsa, sonuç bu karakterin iki katıdır.aabb:c


2

CJam, 10 bayt

le`1af.+e~

Çevrimiçi deneyin!

Açıklama:

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

Yakut, 30 bayt

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

2

Jöle , 5 bayt

n2\׿

Çevrimiçi deneyin!

Nasıl çalışır

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.

İyi oyundu Dennis.
Leaky Nun

1

Toplu iş, 140 bayt

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

STDIN'de girişi ele alır.


1

sed, 18 15 bayt (-r için +1)

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

Orijinal çözüm

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



1

Mathematica, 34 21 bayt

Martin Ender'e Mathematica'da bunu yapmanın doğru yolunu bulduğu için teşekkürler , 13 byte tasarruf!

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

Hem girdi hem de çıktı formatları olarak bir dizi karakter kullanarak saf işlev. Splitbir listeyi eşit karakterlerden oluşan parçalara ayırır. ##&[#,##]&bir argüman dizisi döndüren bir işlevdir: beslendiği ilk argüman, ardından tüm argümanlar (özellikle ilkini tekrar eden); bu listenin @@@her alt Splitlistesine ( ) uygulanır .


1
Belki ##&[#,##]&@@@Split@#&? (Denenmemiş.)
Martin Ender

1
^ Şimdi test edildi. Btw, Gatheraynı karakterde birden fazla çalıştırma varsa aslında işe yaramaz (ama neyse ki Splitzaten bir bayt daha kısadır)
Martin Ender

(oh evet, Splitkalbimde demek istedim) İlk yorumunuzda harika inşaat!
Greg Martin,

1

Java, 151 146 60 bayt

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

regex

(         )     group

 (.)            a character

     \\2*       optional repetition

Detaylı

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

Java cevabı olduğunu fark etmemiştim, bu yüzden benimkini sildim. Ama neden Matcherve Pattern? Bunu 60 byte'a golf edebilirsiniz :String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen

@KevinCruijssen şimdi düzeltildi, thx.
Khaled.K

1

brainfuck , 38 bayt

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

Çevrimiçi deneyin!

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

Bu cevap gönderilmeden önce Martin Bayt'a iki byte golf atıldı. Hayal edebileceğinden çok daha güçlü.

I4&.h%?-$OO!

Çevrimiçi deneyin!

açıklama

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.