“DDoouubbllee ssppeeaakk!!”

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.
• Input strings will only contain characters in the printable ASCII range. Reference: http://www.asciitable.com/mobile/

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.rawh\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> 

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

• 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. – Peter Cordes Aug 3 '19 at 1:49
• @PeterCordes I do not care if it modifies the same object or builds a new one. – AJFaraday Aug 3 '19 at 5:08
• 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. – Peter Cordes Aug 3 '19 at 5:16
• Can the string be empty? – cschultz2048 Aug 6 '19 at 19:58
• @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. – AJFaraday Aug 6 '19 at 22:36

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


Try it online!

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.

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

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

s/./$&$&/g


TIO

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

• This language is Bizzare! – AJFaraday Aug 2 '19 at 10:27
• @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. – Kevin Cruijssen Aug 2 '19 at 10:42

Scala, 37 bytes

def^(s:String)=s.flatMap(x=>Seq(x,x))


Try it online!

• Wow, a nice one with clever use of Seq ; I was about to make one with replace but this one is like 10b shorter – V. Courtois Aug 6 '19 at 6:43
• According to other code golf solutions in Java, Kotlin and C#, it seems to be accepted to provide just a Lambda without binding it to a name. Thus, like Kotlin's it one can make use of Scala's _, for example, _.flatMap(x=>Seq(x,x)), using only 22 chars. TIO. Of course, this is just a counting trick, which does still follow your nice approach. – cubic lettuce Aug 7 '19 at 21:09
• @cubic lettuce, I think those answers do not fully comply with the rules. Some time ago I got this useful recommendation codegolf.stackexchange.com/questions/174521/…. I would not bother with such "counting tricks"... unless it makes a scala solution shorter than any other. :) – Dr Y Wit Aug 12 '19 at 13:37
• ... the comment you linked links further to codegolf.stackexchange.com/questions/3885/… , where the accepted answer suggests to use Scala's _ where possible, however, without answering the question whether this is acceptable for the outermost function definition :) – cubic lettuce Aug 13 '19 at 14:39

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!

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.

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


Husk, 3 bytes

ṁR2


Try it online!

• The solution I came up with was ṁ´e – Jo King Oct 2 '20 at 18:23

Flobnar, 11 bytes

\\@
|~
,e
:


Try it online!

This feels golfable.

• upvoted for name alone – Jonah Aug 1 '19 at 2:10

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

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


Try it online!

• You could just use s=>s.Select(c=>c+""+c) instead to save 4 bytes – Zac Faragher Aug 1 '19 at 2:52
• 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. – dana Aug 1 '19 at 3:10
• 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.. – Kevin Cruijssen Aug 1 '19 at 10:05
• @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. – dana Aug 1 '19 at 12:10
• @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). – Kevin Cruijssen Aug 1 '19 at 12:15

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


.
&&


Try it online!

. replace each character

&& with itself followed by itself

?=?$0  Sample run: bash-5.0$ gema '?=?$0' <<< 'Double speak!' DDoouubbllee ssppeeaakk!!  Try it online! 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 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)  Gaia, 1 byte Z  Try it online! Z interleaves two strings (or lists); implicitly takes the input as both arguments. Factor, 32 bytes : f ( s -- s ) dup zip "" join ;  Try it online! 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  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. :-) • 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. – Veskah Jul 31 '19 at 14:11 • An alternative algorithm can be much shorter. – NieDzejkob Jul 31 '19 at 14:20 • @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. – Charlie Jul 31 '19 at 14:50 • @Charlie I'm also using two scenes. I'm about to integrate a -3 byte improvement from Jo King that removes the scene, though. – NieDzejkob Jul 31 '19 at 15:12 • 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 – Jo King Jul 31 '19 at 22:09 Triangularity, 17 bytes ..).. .IMD. +}""J  Try it online! !@#$%^&*()_+, 12 bytes

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


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

Explanation

*^(_^_!@@*^)
(        )       loop until top of stack is 0
_^_             subtract 1
!            duplicate
@@          output twice

• How do you pronounce !@#$%^&*()_+ ?? 😛 – roblogic Aug 1 '19 at 20:45 • @roblogic There are two canonical pronunciations. (1) "ek-nid-puc-ay-al-rulp" (2) "dang" – Conor O'Brien Aug 1 '19 at 20:49 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!

• I was all set up to try zsh but then you made this! 🤯 – roblogic Aug 2 '19 at 0:18

C (gcc), 62 41 bytes

f(char*a){for(;putchar(putchar(*a++)););}


Try it online!

This takes in input as the first arg, and outputs a NULL-terminated string to stdout. Not sure if the NULLs are a big deal. If you read the string properly, you'll stop after the first one ;)

Original without using a footer

Swift 5, 30 bytes

thanks to @Mr.Xcoder for -14 bytes

{a in a.flatMap{"\($0)\($0)"}}

Try it online!

• Welcome to PPCG, nice answer! You can drop let x= and put it in the header for -6 bytes. – Mr. Xcoder Aug 1 '19 at 8:43
• @Mr.Xcoder like this? Try it online! – Tiziano Coroneo Aug 1 '19 at 9:31
• Yes, precisely. – Mr. Xcoder Aug 1 '19 at 9:31

Ook!, 48 bytes

Ook.Ook!Ook!Ook?Ook!Ook.Ook!Ook.Ook.Ook!Ook?Ook!


This is just a port of my brainfuck answer. Unfortunately there is no support for Ook! on TIO, but you can use this online interpreter.

K (oK), 5 bytes

Solution:

,/2#'


Try it online!

Explanation:

,/2#' / the solution
2#' / 2 take (#) each
,/    / flatten

• {2}# also works – ngn Aug 5 '19 at 17:26
• Will update once I'm off mobile, can you explain how/why this one works? Why doesn't the lambda just return 2? – streetster Aug 5 '19 at 20:01
• m#l is filter (m monad, l list) - equivalent to l@&m'l – ngn Aug 6 '19 at 6:20

GolfScript, 7 6 bytes

1/{.}/


Try it online!

my first golfscript program! Other people's explanations on here were super helpful for me to refer to so I'll type mine out even though its pretty short

1/           split top of stack into groups of size 1
{ }/      execute code inside braces for each element
.        copy the top item of the stack

• doesn't this beat other golfscript answers? nicely done – V. Courtois Aug 6 '19 at 6:46

Kotlin, 44 bytes

{s:String->s.map{"$it$it"}.joinToString("")}


Try it online!

PHP, 37 32 bytes

-2 bytes by removing PHP start tag <? and adding it in header per gwaugh's suggestion

-3 bytes thanks to great idea of gwaugh and eliminating the need for !='' check

for(;$l.=$l=$argn[$i++];)echo\$l;


Try it online!

• You don't need to include the opening <? in your byte count (-2 bytes). You can also -3 more bytes this way for 32 bytes. – 640KB Aug 3 '19 at 19:59
• @gwaugh Thanks for the great idea, edited. – Night2 Aug 5 '19 at 4:07
• I don't believe you can omit the ending semicolon. As a standalone, it must still be legal PHP and run as php -r "echo 'foo';". – 640KB Aug 5 '19 at 16:54
• @gwaugh I assumed that since we can remove the starting tag, same goes for the end tag. Added semicolon and 1 byte back. – Night2 Aug 6 '19 at 6:06
• The semicolon is part of the preceeding statement, so is required syntax. There is nothing to prohibit from using a close tag ?> as long as it's included in your score. If you do, then yes it's valid to omit the last semicolon, however the general consensus is you can't use a close tag unless you have a corresponding open tag. Occasionally this is helpful: example because in that case it's shorter than an echo. – 640KB Aug 6 '19 at 15:06