Удлинить письмо бежит


28

Учитывая непустую строку строчных букв ASCII a-z, выведите эту строку при каждом последовательном «запуске» одной и той же буквы, удлиненной еще на одну копию этой буквы.

Например, dddogg( 3 d , 1 o , 2 g ) превращается в ddddooggg( 4 d , 2 o , 3 g ).

Это : выигрывает самый короткий ответ в байтах.

Контрольные примеры

aabbcccc -> aaabbbccccc
дверной звонок -> ddooorrbbeelll
уууууууууз -> уууууууууузз
q -> qq
ксиокси -> 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"

Попробуйте онлайн или в качестве набора тестов .

Вложите это довольно новый встроенный; это первый раз, когда я использовал это. Очень удобно ;)

05AB1E , 4 байта (не конкурирующие)

γ€ĆJ

был заменен γв последнем обновлении.


Вложение является одним из самых безумных построений когда-либо.
Эрик Outgolfer

3
@EriktheOutgolfer Crazy? Неа.
Okx

Я думаю, что вы имеете в виду ddddпервый элемент массива в стеке в объяснении после выполнения «enclose».
Esolanging Fruit

Вау, подожди минутку, что за черт Ć?
Волшебная Урна Осьминога

Кроме того, xx -> xxxxкогда это должно быть xx -> xxx...?
Волшебная Урна Осьминога



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

7

MATL , 5 байтов

Y'QY"

Попробуйте онлайн!

объяснение

Рассмотрим ввод '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

Алиса , 17 байт

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

Попробуйте онлайн!

объяснение

/.../
@...\

Это основа для программ, которые работают полностью в обычном режиме и являются по существу линейными (простые циклы могут быть написаны, и один используется в этой программе, но здесь сложнее работать с другим ветвлением потока управления). Указатель инструкций прыгает по диагонали вверх и вниз по коду слева направо, затем сдвигается на одну ячейку на два зеркала в конце и перемещается назад справа налево, выполняя пропущенные ячейки на первой итерации. Тогда линеаризованная форма (без учета зеркал) в основном выглядит так:

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

Брахилог , 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

Вам действительно нужно сделать ~приоритет над метапредикатами (или изменить его на постфиксную операцию); если бы вы сделали, вы могли бы сделать это за семь.



3

C, 53 байта

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

Попробуйте онлайн!


1
Спасибо за публикацию этого решения, поскольку оно побудило меня предложить более короткое решение, в котором отсутствует второй путчар. Upvoted.
2501


3

Japt , 8 байт

7 байтов кода, +1 за -Pфлаг.

ó¥ ®+Zg

Проверьте это онлайн!

объяснение

Это использует óвстроенный (раздел на фальсификации), который я только что добавил вчера:

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

брейкфук , 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?
Esolanging Fruit

@ Challenger5 Да. Длина пробега даже не отслеживается, поэтому длина пробега не может быть переполнена.
Nitrodon

2

Perl 6 , 18 байт

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

Попытайся

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

Haskell, 36 байт

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

Пример использования: f "aab"-> "aaabb". Попробуйте онлайн!

Если в строке есть как минимум два aсимвола, привязайте первый символ, bвторой и cостаток строки. За выходом aследует aif, aкоторый не равен bпоследующему рекурсивному вызову с 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.

Хорошо сыграно, Деннис.
Лаки Монахиня

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 байт

Спасибо Мартину Эндеру за то, что он нашел правильный способ сделать это в Mathematica, сэкономив 13 байт!

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

Чистая функция, использующая массив символов в качестве входных и выходных форматов. Splitразделяет список на серии одинаковых символов. ##&[#,##]&является функцией, которая возвращает последовательность аргументов: первый аргумент, который подается, затем все аргументы (поэтому повторяется, в частности, первый); это применяется ( @@@) к каждому подсписку Splitсписка.


1
Может быть ##&[#,##]&@@@Split@#&? (Не проверено.)
Мартин Эндер

1
^ Сейчас проверено. Кстати, на Gatherсамом деле не работает, если есть несколько прогонов одного и того же персонажа (но, к счастью Split, в любом случае короче байта)
Мартин Эндер

(о да, я имел Splitв виду в своем сердце) Замечательная конструкция в вашем первом комментарии!
Грег Мартин

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

Не заметил, что уже был ответ на Java, поэтому я удалил свой. Но почему Matcherи Pattern? Вы можете String f(String s){return s.replaceAll("((.)\\2*)","$1$2");}
Кевин Круйссен,

@KevinCruijssen исправлено, спасибо.
Khaled.K

1

брейкфак , 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 байт

Благодаря Мартину Эндеру было сыграно два байта еще до публикации этого ответа Он могущественнее, чем вы могли себе представить.

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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.