77
\$\begingroup\$

Super simple challenge today, or is it?

I feel like we've heard a fair bit about double speak recently, well let's define it in a codable way...

Double speak is when each and every character in a string of text is immediately repeated. For example:

"DDoouubbllee  ssppeeaakk!!"

The Rules

  • Write code which accepts one argument, a string.
  • It will modify this string, duplicating every character.
  • Then it will return the double speak version of the string.
  • It's code golf, try to achieve this in the smallest number of bytes.
  • Please include a link to an online interpreter for your code.
  • Input strings will only contain characters in the printable ASCII range. Reference: http://www.asciitable.com/mobile/

Leaderboards

Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.

var QUESTION_ID=188988;
var OVERRIDE_USER=53748;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(d){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+d+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(d,e){return"https://api.stackexchange.com/2.2/answers/"+e.join(";")+"/comments?page="+d+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){answers.push.apply(answers,d.items),answers_hash=[],answer_ids=[],d.items.forEach(function(e){e.comments=[];var f=+e.share_link.match(/\d+/);answer_ids.push(f),answers_hash[f]=e}),d.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){d.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),d.has_more?getComments():more_answers?getAnswers():process()}})}getAnswers();var SCORE_REG=function(){var d=String.raw`h\d`,e=String.raw`\-?\d+\.?\d*`,f=String.raw`[^\n<>]*`,g=String.raw`<s>${f}</s>|<strike>${f}</strike>|<del>${f}</del>`,h=String.raw`[^\n\d<>]*`,j=String.raw`<[^\n<>]+>`;return new RegExp(String.raw`<${d}>`+String.raw`\s*([^\n,]*[^\s,]),.*?`+String.raw`(${e})`+String.raw`(?=`+String.raw`${h}`+String.raw`(?:(?:${g}|${j})${h})*`+String.raw`</${d}>`+String.raw`)`)}(),OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(d){return d.owner.display_name}function process(){var d=[];answers.forEach(function(n){var o=n.body;n.comments.forEach(function(q){OVERRIDE_REG.test(q.body)&&(o="<h1>"+q.body.replace(OVERRIDE_REG,"")+"</h1>")});var p=o.match(SCORE_REG);p&&d.push({user:getAuthorName(n),size:+p[2],language:p[1],link:n.share_link})}),d.sort(function(n,o){var p=n.size,q=o.size;return p-q});var e={},f=1,g=null,h=1;d.forEach(function(n){n.size!=g&&(h=f),g=n.size,++f;var o=jQuery("#answer-template").html();o=o.replace("{{PLACE}}",h+".").replace("{{NAME}}",n.user).replace("{{LANGUAGE}}",n.language).replace("{{SIZE}}",n.size).replace("{{LINK}}",n.link),o=jQuery(o),jQuery("#answers").append(o);var p=n.language;p=jQuery("<i>"+n.language+"</i>").text().toLowerCase(),e[p]=e[p]||{lang:n.language,user:n.user,size:n.size,link:n.link,uniq:p}});var j=[];for(var k in e)e.hasOwnProperty(k)&&j.push(e[k]);j.sort(function(n,o){return n.uniq>o.uniq?1:n.uniq<o.uniq?-1:0});for(var l=0;l<j.length;++l){var m=jQuery("#language-template").html(),k=j[l];m=m.replace("{{LANGUAGE}}",k.lang).replace("{{NAME}}",k.user).replace("{{SIZE}}",k.size).replace("{{LINK}}",k.link),m=jQuery(m),jQuery("#languages").append(m)}}
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}table td{padding:5px}
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> 

To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:

# Language Name, [Other information] N bytes

where N is the size of your submission. Other information may include flags set and if you've improved your score (usually a struck out number like <s>M</s>). N should be the right-most number in this heading, and everything before the first , is the name of the language you've used. The language name and the word bytes may be links.

For example:

# [><>](http://esolangs.org/wiki/Fish), <s>162</s> 121 [bytes](https://esolangs.org/wiki/Fish#Instructions)
\$\endgroup\$
10
  • 3
    \$\begingroup\$ It will modify this string. Are you intentionally requiring pass-by-reference and modify in-place? And then return a copy or reference to that modified string? If so, languages like asm or C would need to accept an explicit-length string (pointer + length) where the length is either the current string length (with the buffer being twice that size), or it's the total size and you need to duplicate the low half. Thus you need to start from the end and work backwards, or allocate scratch space and then copy back. But there are answers in C and 8086 asm that totally violate all that. \$\endgroup\$ – Peter Cordes Aug 3 '19 at 1:49
  • 4
    \$\begingroup\$ @PeterCordes I do not care if it modifies the same object or builds a new one. \$\endgroup\$ – AJFaraday Aug 3 '19 at 5:08
  • 2
    \$\begingroup\$ I'd suggest wording it as "modify (or produce a modified copy) of the string" to explicitly allow answers that do or don't modify in-place. Simplifying the wording to "return a string that's twice as long, with each character repeated" would be nice but then it's not clear if void foo(char *c, size_t len) is legal that takes one input/output buffer and a length, and doesn't have any return value, just a side-effect on the object it has a pointer to. \$\endgroup\$ – Peter Cordes Aug 3 '19 at 5:16
  • \$\begingroup\$ Can the string be empty? \$\endgroup\$ – cschultz2048 Aug 6 '19 at 19:58
  • 1
    \$\begingroup\$ @cschultz2048 it says the string will only contain printable ascii characters, so that implies that they’ll always be populated. I’d expect that any code for this challenge would leave an empty string empty... anyway, I don’t think it’s a test case that I’d use for this. \$\endgroup\$ – AJFaraday Aug 6 '19 at 22:36

186 Answers 186

1
2
3 4 5
7
5
\$\begingroup\$

Retina, 4 bytes


$<&

Try it online!

Matches the empty string (i.e. the position before/after each character) and inserts the string between this and the previous match (which is always exactly the previous character; except for the first match where it does nothing).

\$\endgroup\$
5
\$\begingroup\$

Labyrinth, 11 bytes

,:
"~~."
 @

Try it online!

How?

, - takes a byte from STDIN and pushes its ordinal onto the stack (0-255)
  -                                    unless EOF which pushes -1
: - duplicates the top of the stack [TOS]
~ - bitwise NOT TOS (-1 becomes 0, n becomes -n-1)
  -   4-neighbours: if TOS=0 go forward to @
  -                 if TOS<0 go left to ~
  -                 if TOS>0 go right to " (never the case)
@ - exits the program, otherwise...
~ - bitwise NOT TOS (undoes the effect of the previous ~)
. - print and discard TOS (mod 256) as an ASCII character
" - no-op
  -   We've hit a wall, turn around!
. - print and discard TOS (mod 256) as an ASCII character
~ - bitwise NOT TOS (stack starts with an infinite supply of 0s, so now TOS=-1) 
~ - bitwise NOT TOS (and now TOS=0 again)
  -   4-neighbours, but TOS=0 takes us forward to "
" - no-op
  -   ...and we're back at the starting ,
  -      facing right, with infinite 0s on the stack - just like the start
\$\endgroup\$
5
\$\begingroup\$

Turing Machine But Way Worse, 475 bytes

0 0 0 1 1 0 0 
1 0 1 1 1 0 0
0 1 0 1 2 0 0
1 1 1 1 a 0 0
0 2 0 1 3 0 0
1 2 1 1 b 0 0
0 3 0 1 4 0 0
1 3 1 1 c 0 0
0 4 0 1 5 0 0
1 4 1 1 d 0 0
0 5 0 1 6 0 0
1 5 1 1 e 0 0
0 6 0 1 7 0 0
1 6 1 1 f 0 0
0 7 0 1 g 0 0
1 7 1 1 g 0 0
0 a 0 1 b 0 0
1 a 1 1 b 0 0
0 b 0 1 c 0 0
1 b 1 1 c 0 0
0 c 0 1 d 0 0
1 c 1 1 d 0 0
0 d 0 1 e 0 0
1 d 1 1 e 0 0
0 e 0 1 f 0 0
1 e 1 1 f 0 0
0 f 0 0 h 1 0
1 f 1 0 h 1 0
0 h 0 1 i 1 0
1 h 1 1 i 1 0
0 i 0 1 0 0 0
1 i 1 1 0 0 0
0 g 0 1 g 0 1
1 g 1 1 g 0 1

Trivial modification of this answer

Try it online!

\$\endgroup\$
4
\$\begingroup\$

Perl 5 (-0777p -Mre=/s), 10 bytes

s/./$&$&/g

TIO

\$\endgroup\$
4
\$\begingroup\$

Whitespace, 33 bytes

[N
S S N
_Create_Label_LOOP][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   S _Read_STDIN_as_integer][T T   T   _Retrieve][S N
S _Duplicate_input][T   N
S S _Output_as_character][T N
S S _Output_as_character][N
S N
N
_Jump_to_Label_LOOP]

Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.

Try it online (with raw spaces, tabs and new-lines only).

Explanation in pseudo-code:

Start LOOP:
  Character c = STDIN as character
  Print c
  Print c
  Go to next iteration of LOOP
\$\endgroup\$
2
  • \$\begingroup\$ This language is Bizzare! \$\endgroup\$ – AJFaraday Aug 2 '19 at 10:27
  • 1
    \$\begingroup\$ @AJFaraday :D It's perfect for some source-code and polyglot tagged challenges, though. ;) And this answer is quite straight-forward tbh. You can take a look at some of my other answers in Whitespace for harder examples. \$\endgroup\$ – Kevin Cruijssen Aug 2 '19 at 10:42
4
\$\begingroup\$

Brain-Flak, 48 bytes

([]){{}({}<>)<>([])}{}<>([]){{}(({}<>))<>([])}<>

Try it online!

This code has two main sections. The first just reverses the string:

([]){{}({}<>)<>([])}{}<>

The second is nearly identical, it reverses the string and doubles the characters in place

([]){{}(({}<>))<>([])}{}<>

The reason we need to reverse things is that we need to touch every element of the strings in order to make the output. Since Brain-Flak uses a stack model touching each character means popping all of the elements and pushing them. Because of the FIFO manner of a stack this means each time this is done you reverse the string. The reversing issue is not present in Brain-Flueue below.

Brain-Flueue, 28 bytes

([]<>){({}[()])<>(({}))<>}<>

Try it online!

Since queues are first in last out all we need to do in Brain-Flueue is iterate through the entire string doubling every character in place. However this does make it harder to iterate through the entire stack. In Brain-Flak we could just go until the stack height is zero however with a queue, pushing something puts it on the bottom of the queue essentially losing it. Instead we use the second queue to keep track of the number of operations we need. This makes are main loop look like:

([]<>){({}[()])<>...<>}<>

With the contents being the meager

(({}))

Just for fun, both of these answers could get a lot shorter if there were no null bytes in the input (ascii value zero)

Brain-Flak, 26 bytes

{({}<>)<>}<>{(({}<>))<>}<>

Try it online!

Brain-Flueue, 14 bytes

{(({}<>))<>}<>

Try it online!

\$\endgroup\$
1
4
\$\begingroup\$

Befunge-93, 8 bytes

~:1+%:,,

Try it online!

For each character in input, outputs c%(c+1) as a character twice. This makes the program calculate -1%0 on EOF (-1), which terminates it.

\$\endgroup\$
4
\$\begingroup\$

Husk, 3 bytes

ṁR2

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ The solution I came up with was ṁ´e \$\endgroup\$ – Jo King Oct 2 '20 at 18:23
  • \$\begingroup\$ Ṙ2 is -1 byte. \$\endgroup\$ – Razetime May 16 at 8:37
4
\$\begingroup\$

Flobnar, 11 bytes

\\@
|~
,e
:

Try it online!

This feels golfable.

\$\endgroup\$
1
  • \$\begingroup\$ upvoted for name alone \$\endgroup\$ – Jonah Aug 1 '19 at 2:10
4
\$\begingroup\$

C# (Visual C# Interactive Compiler), 26 bytes

s=>s.SelectMany(c=>c+""+c)

Try it online!

\$\endgroup\$
8
  • 1
    \$\begingroup\$ You could just use s=>s.Select(c=>c+""+c) instead to save 4 bytes \$\endgroup\$ – Zac Faragher Aug 1 '19 at 2:52
  • 1
    \$\begingroup\$ I considered that, but the signature would be kind of strange, since it is converting from IEnumerable<char> to IEnumerable<string> and other answers had avoided this. \$\endgroup\$ – dana Aug 1 '19 at 3:10
  • \$\begingroup\$ Wait, this answer is actually wrong right now.. The output is a list of 2-char strings, which is neither a string nor list of chars/single-char strings. I.e. "abc" results in ["aa","bb","cc"]. The additional join in the print makes it aabbcc, but that should then be counted towards the byte-count. If ["aa","bb","cc"] would have been an acceptable output, I would have a few 1-byter solutions for my 05AB1E answer.. \$\endgroup\$ – Kevin Cruijssen Aug 1 '19 at 10:05
  • 2
    \$\begingroup\$ @KevinCruijssen - the output is a list of characters. If you use Select you get a list of 2-character strings. SelectMany flattens each element and connects them. The output is a long list of characters. \$\endgroup\$ – dana Aug 1 '19 at 12:10
  • 1
    \$\begingroup\$ @dana Ah ok, thanks for explaining. Then your code is indeed correct, but ZacFaragher's suggestion would give the incorrect result. Based on your response to him I thought the problem was outputting a list of single-char strings instead of actual chars, in which case you could also use single-char strings as IEnumerable<string> as both in- AND output. Didn't knew SelectMany would flatten in the process. In that case my initial upvote remains (couldn't retract it earlier anyway ;p). \$\endgroup\$ – Kevin Cruijssen Aug 1 '19 at 12:15
4
\$\begingroup\$

Pepe, 19 bytes

REEerEErReEeReEeree

Try it online!

Explanation:

REEe # Input as str -> (R)
rEE # Create loop labelled 0 -> (r)
  rReEe # Output as char -> (R)
        # r flag: don't pop
  ReEe # Output as char and pop -> (R)
ree # Loop while (R) != 0
\$\endgroup\$
4
\$\begingroup\$

Wolfram Language (Mathematica), 13 11 bytes

-2 thanks to LegionMammal978

#~Riffle~#&

Try it online!

Takes and returns an array of characters.

\$\endgroup\$
1
  • \$\begingroup\$ I believe the more straightforward #~Riffle~#& would be a valid 11-byte solution (taking and returning a character list). \$\endgroup\$ – LegionMammal978 Nov 3 '19 at 14:51
4
\$\begingroup\$

JavaScript (V8), 28 bytes

a=>[...a].map(p=>p+p).join``

Try it online!

\$\endgroup\$
4
\$\begingroup\$

Arn, 5 bytes

|{|}\

Since this is <6 bytes I can't compress it

Explained

      \ Fold with...
| Concatenation after...
  { Mapping...
    | And concatenating _ and _
  } End map

Fold's required input is automatically assumed to be _ (initialized as STDIN). Type casting automatic, output automatic.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ The answer that I can't understand how it works, even after explanation! (Just like Arnauld's explanations) +1 \$\endgroup\$ – user96495 Aug 15 '20 at 6:29
4
\$\begingroup\$

Kotlin, 48 35 bytes

35 bytes from 48 bytes thanks to @user

{it.map{"$it$it"}.joinToString("")}

Not much to it, just that it.map() returns a CharArray so you have to joinToString() it.

Kotlin Playground Link(Would've been TIO but TIO has issues with kotlin.)

\$\endgroup\$
4
  • \$\begingroup\$ Welcome to Code Golf! You can also use something like {it.map{"$it$it"}.joinToString("")} (lambdas are allowed according to a meta consensus). \$\endgroup\$ – user Feb 14 at 22:24
  • 1
    \$\begingroup\$ FYI there's already a few Kotlin solutions. (although we don't prohibit posting your own attempts) codegolf.stackexchange.com/search?q=inquestion%3A188988+Kotlin (I think there's also the graduation userscript that shows a leader board under every questions, but I don't use it myself) cc @user \$\endgroup\$ – user202729 Feb 15 at 10:14
  • \$\begingroup\$ @user202729 Even if we did prohibit duplicate answers, this one's different from the other two, and it could be made shorter than both of them with a lambda. I do agree with you that one should check pre-existing answers first, though. \$\endgroup\$ – user Feb 15 at 16:23
  • 1
    \$\begingroup\$ @user Thanks for the help, I've edited that in. \$\endgroup\$ – grian Feb 15 at 18:48
4
\$\begingroup\$

dotcomma, 15 14 bytes

[[],][.[[,],]]  code
[[],]           push 0 to the queue
     [.      ]  while next block is non-zero
       [[,],]   pop from the queue and push it twice
\$\endgroup\$
2
  • \$\begingroup\$ Nice golf, I was sure something could be shortened there but I couldn't find it :p \$\endgroup\$ – Redwolf Programs Jun 13 at 20:01
  • \$\begingroup\$ Thanks! I don't think there's anything left to change, but I might be wrong. \$\endgroup\$ – Jay Ryan Jun 13 at 21:25
3
\$\begingroup\$

QuadR, 4 bytes

.
&&

Try it online!

. replace each character

&& with itself followed by itself

\$\endgroup\$
3
\$\begingroup\$

Gema, 5 characters

?=?$0

Sample run:

bash-5.0$ gema '?=?$0' <<< 'Double speak!'
DDoouubbllee  ssppeeaakk!!

Try it online!

\$\endgroup\$
3
\$\begingroup\$

T-SQL 2008, 78 bytes

DECLARE @ varchar(max)='Double speak!'

,@z int=1WHILE @z<=len(@)SELECT
@=stuff(@,@z,0,substring(@,@z,1)),@z+=2PRINT @

Try it online

\$\endgroup\$
3
\$\begingroup\$

Standard ML (MLton), 35 bytes

String.translate(fn c=>str c^str c)

Try it online!

The function translate from the String library has the following type:

translate : (char -> string) -> string -> string

Thus, given a function that takes a char c, converts it to a singleton string twice with str c and concatenates both with ^, we get the required functionality.

\$\endgroup\$
3
\$\begingroup\$

Oracle SQL, 43 bytes

select regexp_replace(x,'(.)','\1\1')from t

It works with an assumption that input data is stored in a table t(x), e.g.

with t(x) as (select 'Double speak' from dual)
\$\endgroup\$
3
\$\begingroup\$

Gaia, 1 byte

Z

Try it online!

Z interleaves two strings (or lists); implicitly takes the input as both arguments.

\$\endgroup\$
3
\$\begingroup\$

Factor, 32 bytes

: f ( s -- s ) dup zip "" join ;

Try it online!

\$\endgroup\$
3
\$\begingroup\$

jq (-Rrj), 12 characters

(./"")[]|.+.

Sample run:

bash-5.0$ jq -Rrj '(./"")[]|.+.' <<< 'D0uB!e'
DD00uuBB!!ee

Try it online!

\$\endgroup\$
3
\$\begingroup\$

Red, 43 bytes

func[s][t:""foreach c s[t: rejoin[t c c]]t]

Try it online!

\$\endgroup\$
3
\$\begingroup\$

Z80Golf, 10 bytes

00000000: cd03 8030 0176 ffff 18f6                 ...0.v....

Try it online!

Corresponding assembly:

start:
    call $8003 ; input
    jr nc, no_halt
    halt
no_halt:
    rst $38 ; nop-slide to $8000 - output
    rst $38
    jr start
\$\endgroup\$
3
\$\begingroup\$

Shakespeare Programming Language, 238 164 bytes

,.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]Ajax:Open mind.Let usScene V.Scene V:.Ajax:Be you better than I?If sospeak thy.Speak thy.Open mind.Let usScene V.

Try it online!

Boy, golfing in SPL does seem ugly...

  • Lots of bytes saved after Veskah pointed me to the SPL golfing tips. :-)
\$\endgroup\$
6
  • 2
    \$\begingroup\$ Gotta use Ajax and Puck. You can also omit a ton of non-essential words for big savings, though it does lose some of the SPL charm when you do. \$\endgroup\$ – Veskah Jul 31 '19 at 14:11
  • \$\begingroup\$ An alternative algorithm can be much shorter. \$\endgroup\$ – NieDzejkob Jul 31 '19 at 14:20
  • \$\begingroup\$ @NieDzejkob Nice one, I tried something similar but the interpreter said that my characters were already on scene when I tried to loop, so I had to introduce two scenes. \$\endgroup\$ – Charlie Jul 31 '19 at 14:50
  • \$\begingroup\$ @Charlie I'm also using two scenes. I'm about to integrate a -3 byte improvement from Jo King that removes the scene, though. \$\endgroup\$ – NieDzejkob Jul 31 '19 at 15:12
  • \$\begingroup\$ You don't need the first explicit scene transition, and I'm not sure what the conditional is about, since you terminate with an error anyway? You only do if so for the first output, but not the second, nor the scene transition \$\endgroup\$ – Jo King Jul 31 '19 at 22:09
3
\$\begingroup\$

Triangularity, 17 bytes

..)..
.IMD.
+}""J

Try it online!

\$\endgroup\$
3
\$\begingroup\$

!@#$%^&*()_+, 12 bytes

*^(_^_!@@*^)

Try it online! If programs could terminate with an error, *(!@@*) works for 7 bytes.

Explanation

*^(_^_!@@*^)
*^                 take input, add 1
  (        )       loop until top of stack is 0
   _^_             subtract 1
      !            duplicate
       @@          output twice
         *^        take input, add 1
\$\endgroup\$
2
  • \$\begingroup\$ How do you pronounce !@#$%^&*()_+ ?? 😛 \$\endgroup\$ – roblogic Aug 1 '19 at 20:45
  • 2
    \$\begingroup\$ @roblogic There are two canonical pronunciations. (1) "ek-nid-puc-ay-al-rulp" (2) "dang" \$\endgroup\$ – Conor O'Brien Aug 1 '19 at 20:49
3
\$\begingroup\$

Zsh, 29 bytes

s=(${(s::)1})
<<<${(j::)s:^s}

Try it online!

I love parameter expansion flags:

s=(${(s::)1})
   ${     1}    # first argument
     (s::)      # split into characters: (s:foo:) splits on the string "foo"
s=(         )   # capture as array $s

<<<${(j::)s:^s}
   ${     s:^s} # zip array s with array s
     (j::)      # join on empty string (opposite of s::)
<<<             # print to stdout

Honorable mention, which would be 27 bytes... if not for the required 20 extra bytes to setopt extendedglob:

setopt extendedglob
<<<${1//(#m)?/$MATCH$MATCH}

This is basically the same as sed 's/./&&/g'<<<$1, but with builtins only.

Try it online!

\$\endgroup\$
5
  • 1
    \$\begingroup\$ I was all set up to try zsh but then you made this! 🤯 \$\endgroup\$ – roblogic Aug 2 '19 at 0:18
  • \$\begingroup\$ You don't need to include the setopt extendedglob - you can add it as a command line flag to zsh: --extendedglob for no extra bytes \$\endgroup\$ – pxeger Jan 26 at 8:44
  • \$\begingroup\$ Alternative (29) \$\endgroup\$ – pxeger Jan 26 at 10:08
  • \$\begingroup\$ @pxeger Yeah, I didn't start answering with zsh -oextendedglob with that rule until a little after this answer. Also, your alternative doesn't double backslashes. \$\endgroup\$ – GammaFunction Jan 26 at 17:58
  • 1
    \$\begingroup\$ @GammaFunction that can be fixed with -o bsd_echo \$\endgroup\$ – pxeger Jan 26 at 18:03
1
2
3 4 5
7

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.