Thư kéo dài


28

Đưa ra một chuỗi các chữ cái ASCII không trống a-z, xuất ra chuỗi đó với mỗi dòng chữ run liên tiếp của cùng một chữ cái được kéo dài thêm một bản sao của chữ cái đó.

Ví dụ: dddogg( 3 Khác d s, 1 o , 2 g , s) biến thành ddddooggg( 4 d , s, 2 o , s, 3 kiếm g ).

Đây là : câu trả lời ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

aabbcccc -> aaabbbccccc
chuông cửa -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy

Liên quan (chỉ thêm một ký tự khác nếu độ dài của lần chạy là lẻ)
MildlyMilquetoast

Câu trả lời:


11

05AB1E , 5 byte

.¡€ĆJ

Giải trình:

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"

Hãy thử trực tuyến hoặc như một bộ thử nghiệm .

Bao vây là một nội dung khá mới; Đây là lần đầu tiên tôi sử dụng nó. Rât thuận tiện ;)

05AB1E , 4 byte (không cạnh tranh)

γ€ĆJ

đã được thay thế bởi γtrong bản cập nhật mới nhất.


Đính kèm là một trong những nội dung điên rồ nhất từ ​​trước đến nay.
Erik the Outgolfer

3
@EriktheOutgolfer Điên? Không
Okx

Tôi nghĩ bạn có nghĩa là ddddphần tử đầu tiên của mảng trên ngăn xếp trong phần giải thích sau khi "bao vây" được thực thi.
Quả Esolanging

Ái chà, đợi một chút, cái quái gì thế này Ć?
Bạch tuộc ma thuật Urn

Ngoài ra, xx -> xxxxkhi nào nên xx -> xxx...?
Bạch tuộc ma thuật Urn



8

Bình thường , 7 byte

r9hMMr8

Bộ thử nghiệm .

Làm thế nào nó hoạt động

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"

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào '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\

Hãy thử trực tuyến!

Giải trình

/.../
@...\

Đây là khung cho các chương trình hoạt động hoàn toàn ở chế độ Thông thường và về cơ bản là tuyến tính (có thể viết các vòng đơn giản và một vòng được sử dụng trong chương trình này, nhưng sẽ khó hơn khi làm việc với luồng điều khiển phân nhánh ở đây). Con trỏ lệnh bật lên theo đường chéo lên xuống theo mã từ trái sang phải, sau đó được dịch chuyển bởi một ô bởi hai gương ở cuối và di chuyển ngược từ phải sang trái, thực hiện các ô mà nó bỏ qua trong lần lặp đầu tiên. Dạng tuyến tính hóa (bỏ qua các gương) về cơ bản trông như thế này:

ifQ>w.Doo.$k@

Chúng ta hãy đi qua điều này:

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

Hãy thử trực tuyến!

Giải trình

             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 Tôi thực sự đã tìm thấy một cái quá ngay sau khi đăng cái này
Fatalize

Bạn thực sự cần phải ~được ưu tiên hơn các phép ẩn dụ (hoặc thay đổi nó thành một hoạt động hậu tố); nếu bạn đã làm, bạn có thể làm điều này trong bảy.



3

C, 53 byte

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

Hãy thử trực tuyến!


1
Cảm ơn bạn đã đăng giải pháp này vì nó thúc đẩy tôi đưa ra một giải pháp ngắn hơn mà bỏ qua các vấn đề thứ hai. Nâng cao.
2501


3

Japt , 8 byte

7 byte mã, +1 cho -Pcờ.

ó¥ ®+Zg

Kiểm tra nó trực tuyến!

Giải trình

Cái này sử dụng ó(phân vùng trên falsy) tích hợp mà tôi vừa thêm hôm qua:

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

Lục giác , 33 byte

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

Mở rộng:

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

Hãy thử trực tuyến!

Mã giả ít nhiều:

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$&")

Thử nó

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

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

Hãy thử trực tuyến!

Giải trình

,            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
Điều này sẽ làm việc với thư chạy> 256?
Esolanging Fruit

@ Challenger5 Có. Độ dài chạy thậm chí không được theo dõi, vì vậy không có cách nào để chiều dài chạy tràn.
Nitrodon

2

Perl 6 , 18 byte

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

Thử nó

Mở rộng:

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

Haskell, 36 byte

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

Ví dụ sử dụng: f "aab"-> "aaabb". Hãy thử trực tuyến!

Khi chuỗi có ít nhất hai ký tự, liên kết avới char đầu tiên, bvới cchuỗi thứ hai và phần còn lại của chuỗi. Đầu ra được atheo sau bởi anếu akhông bằng với bmột cuộc gọi đệ quy với b:c. Nếu chỉ có một char, kết quả là hai lần char này.


2

CJam, 10 byte

le`1af.+e~

Hãy thử trực tuyến!

Giải trình:

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

Thạch , 5 byte

n2\׿

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Chơi tốt, Dennis.
Leaky Nun

1

Hàng loạt, 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%

Đưa đầu vào vào STDIN.


1

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

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

Giải pháp ban đầu

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



1

Toán học, 34 21 byte

Cảm ơn Martin Ender vì đã tìm đúng cách để làm điều này trong Mathematica, tiết kiệm được 13 byte!

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

Hàm thuần túy sử dụng một mảng các ký tự làm cả định dạng đầu vào và đầu ra. Splittách một danh sách thành các ký tự bằng nhau. ##&[#,##]&là một hàm trả về một chuỗi các đối số: đối số đầu tiên được cung cấp, sau đó tất cả các đối số (đặc biệt lặp lại đối số đầu tiên); điều này được áp dụng ( @@@) cho mọi danh sách con của Splitdanh sách.


1
Có lẽ ##&[#,##]&@@@Split@#&nào? (Chưa được kiểm tra.)
Martin Ender

1
^ Bây giờ đã thử nghiệm. Btw, Gatherkhông thực sự hoạt động nếu có nhiều lần chạy cùng một ký tự (nhưng may mắn Splitlà dù sao cũng ngắn hơn một byte)
Martin Ender

(oh yeah, ý tôi là Splittrong trái tim tôi) Công trình tuyệt vời trong bình luận đầu tiên của bạn!
Greg Martin

1

Java, 151 146 60 byte

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

Regex

(         )     group

 (.)            a character

     \\2*       optional repetition

Chi tiết

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

Không nhận thấy đã có câu trả lời Java, vì vậy tôi đã xóa câu trả lời của tôi. Nhưng tại sao MatcherPattern? Bạn có thể đánh gôn tới 60 byte như thế này:String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen

@KevinCruijssen đã sửa, thx.
Khaled.K

1

Brainfuck , 38 byte

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

Hãy thử trực tuyến!

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

Hai byte đã được chơi golf nhờ Martin Ender ngay cả trước khi câu trả lời này được đăng. Anh ấy mạnh mẽ hơn bạn có thể tưởng tượng.

I4&.h%?-$OO!

Hãy thử trực tuyến!

Giải trình

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.