ยาวตัวอักษรวิ่ง


28

ให้สตริงที่ไม่ว่างเปล่าของตัวอักษร ASCII ตัวพิมพ์เล็กa-zเอาท์พุทสตริงนั้นพร้อมกับ "run" ต่อเนื่องของตัวอักษรเดียวกันที่มีความยาวโดยสำเนาอีกหนึ่งตัวของตัวอักษรนั้น

ตัวอย่างเช่นdddogg( 3 d , 1 o , 2 g ) เปลี่ยนเป็นddddooggg( 4 d ', 2 o ', 3 g 's)

นี่คือ : คำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

aabbcccc -> aaabbbccccc
ออด -> ddooorrbbeelll
uuuuuuuuuz -> uuuuuuuuuuuzz
q -> qq
xyxyxy -> xxyyxxyyxxyy
xxxyyy -> xxxxyyyy

ที่เกี่ยวข้อง (เพิ่มตัวละครอื่นถ้าความยาวของการเรียกใช้เป็นคี่)
MildlyMilquetoast

คำตอบ:


11

05AB1E , 5 ไบต์

.¡€ĆJ

คำอธิบาย:

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"

ลองมันออนไลน์หรือเป็นชุดทดสอบ

Enclose เป็น builtin ใหม่ที่สวยงาม มันเป็นครั้งแรกที่ฉันใช้มัน สะดวกมาก ;)

05AB1E , 4 ไบต์ (ไม่แข่งขัน)

γ€ĆJ

ถูกแทนที่ด้วยγในการอัปเดตล่าสุด


สิ่งที่แนบมาเป็นหนึ่งในสิ่งปลูกสร้างที่บ้าคลั่งที่สุดเท่าที่เคยมีมา
Erik the Outgolfer

3
@EriktheOutgolfer Crazy? Nah
Okx

ฉันคิดว่าคุณหมายถึงddddองค์ประกอบแรกของอาเรย์บนสแต็คในคำอธิบายหลังจากดำเนินการ "ล้อม" แล้ว
ผลไม้แยกแยะ

ว้าวเดี๋ยวก่อนนี่มันĆอะไรนะ?
Magic Octopus Urn

นอกจากนี้xx -> xxxxเมื่อมันควรจะเป็นxx -> xxx... ?
Magic Octopus Urn



8

Pyth , 7 ไบต์

r9hMMr8

ชุดทดสอบ

มันทำงานอย่างไร

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


6

อลิซ 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย

/.../
@...\

นี่เป็นเฟรมเวิร์กสำหรับโปรแกรมที่ทำงานโดยสมบูรณ์ในโหมด Ordinal และเป็นแบบเชิงเส้น (สามารถเขียนลูปง่าย ๆ และหนึ่งโปรแกรมถูกใช้ในโปรแกรมนี้ ตัวชี้คำสั่งเด้งเส้นทแยงมุมขึ้นและลงผ่านรหัสจากซ้ายไปขวาจากนั้นเลื่อนไปหนึ่งเซลล์โดยกระจกสองอันในตอนท้ายและเคลื่อนที่กลับจากขวาไปซ้ายเรียกใช้เซลล์ที่ข้ามในการทำซ้ำครั้งแรก รูปแบบ linearised (ไม่สนใจกระจก) โดยทั่วไปแล้วจะมีลักษณะดังนี้:

ifQ>w.Doo.$k@

ลองทำสิ่งนี้:

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 ไบต์

ḅ{t,?}ᵐc

ลองออนไลน์!

คำอธิบาย

             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 ฉันพบจริงแล้วเช่นกันหลังจากโพสต์ข้อความนี้
Fatalize

คุณต้อง~ใช้ความสำคัญเหนือกว่า metapredicates (หรือเปลี่ยนเป็นการดำเนินการ postfix); ถ้าคุณทำคุณสามารถทำได้ในเจ็ด



3

C, 53 ไบต์

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

ลองออนไลน์!


1
ขอบคุณสำหรับการโพสต์โซลูชั่นนี้เพราะมันกระตุ้นให้ฉันคิดหาวิธีแก้ปัญหาที่สั้นลง upvoted
2501


3

Japtet , 8 ไบต์

โค้ดขนาด 7 ไบต์ +1 สำหรับ-Pแฟล็ก

ó¥ ®+Zg

ทดสอบออนไลน์!

คำอธิบาย

นี่ใช้óbuilt-in (partition on falsy) ที่ฉันเพิ่งเพิ่มเมื่อวาน:

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

JavaScript (ES6), 33 30 ไบต์

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

ลองมัน

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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

,            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
การทำงานกับตัวอักษรจะทำงาน> 256 หรือไม่
แยกผลไม้

@ Challenger5 ใช่ ความยาวของการวิ่งนั้นไม่ได้ถูกติดตามดังนั้นจึงไม่มีหนทางใดที่ความยาวในการรันจะล้น
Nitrodon

2

Perl 6 , 18 ไบต์

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

ลองมัน

ขยาย:

{   # 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 ไบต์

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

ตัวอย่างการใช้งาน: ->f "aab" ลองออนไลน์!"aaabb"

เมื่อสตริงมีตัวอักษรอย่างน้อยสองตัวให้ผูกaกับอักขระตัวแรกกับตัวอักษรตัวbที่สองและcตัวที่เหลือ เอาท์พุทจะaตามมาด้วยaถ้าaไม่เท่ากับbตามด้วยโทร recursive b:cกับ หากมีเพียงถ่านเดียวผลที่ได้คือสองเท่าของถ่าน


2

CJam, 10 ไบต์

le`1af.+e~

ลองออนไลน์!

คำอธิบาย:

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

เยลลี่ 5 ไบต์

n2\׿

ลองออนไลน์!

มันทำงานอย่างไร

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.

เล่นได้ดีเดนนิส
Leun Nun

1

แบตช์ 140 ไบต์

@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





1

Mathematica, 34 21 ไบต์

ขอบคุณ Martin Ender สำหรับการค้นหาวิธีที่ถูกต้องใน Mathematica ประหยัด 13 ไบต์!

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

ฟังก์ชั่นที่บริสุทธิ์โดยใช้อาเรย์ของอักขระเป็นทั้งรูปแบบอินพุตและเอาต์พุต Splitแยกรายการออกเป็นจำนวนอักขระเท่ากัน ##&[#,##]&เป็นฟังก์ชั่นที่ส่งกลับลำดับของการขัดแย้ง: อาร์กิวเมนต์แรกที่ถูกป้อนจากนั้นอาร์กิวเมนต์ทั้งหมด (ดังนั้นการทำซ้ำโดยเฉพาะครั้งแรกโดยเฉพาะ); นี้จะนำไปใช้ ( @@@) กับทุกรายการย่อยของSplitรายการ


1
อาจจะ##&[#,##]&@@@Split@#&? (ไม่ผ่านการทดสอบ)
Martin Ender

1
^ ทดสอบแล้ว Btw Gatherไม่สามารถใช้งานได้จริงหากมีตัวละครเดียวกันหลายตัว (แต่โชคดีที่Splitมีความยาวของไบต์น้อยกว่า)
Martin Ender

(ใช่แล้วฉันหมายถึงSplitในหัวใจของฉัน) การก่อสร้างที่ยอดเยี่ยมในความคิดเห็นแรกของคุณ!
Greg Martin

1

Java, 151 146 60 ไบต์

String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
  • -5 ไบต์ขอบคุณ @FryAmTheEggman
  • -86 ไบต์ขอบคุณ @KevinCruijssen

regex

(         )     group

 (.)            a character

     \\2*       optional repetition

รายละเอียด

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

ไม่ได้สังเกตเห็นว่ามีคำตอบของจาวาอยู่แล้วดังนั้นฉันจึงลบของฉันออก แต่ทำไมMatcherและPattern? คุณสามารถตีกอล์ฟได้ถึง60 ไบต์เช่นนี้:String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Kevin Cruijssen

@KevinCruijssen แก้ไขแล้วขอบคุณ
Khaled.K

1

brainfuck , 38 ไบต์

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

ลองออนไลน์!

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

อลิซ 12 ไบต์

สองไบต์ถูก golfed ขอบคุณ Martin Ender แม้ก่อนคำตอบนี้ถูกโพสต์ เขามีพลังมากกว่าที่คุณจะจินตนาการได้

I4&.h%?-$OO!

ลองออนไลน์!

คำอธิบาย

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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.