82
\$\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\$ Aug 3, 2019 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, 2019 at 5:08
  • 3
    \$\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\$ Aug 3, 2019 at 5:16
  • \$\begingroup\$ Can the string be empty? \$\endgroup\$ Aug 6, 2019 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, 2019 at 22:36

208 Answers 208

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

C# (Visual C# Interactive Compiler) with Regex-flag, 24 bytes

: /u:System.Text.RegularExpressions.Regex (flag is not in the header, so it won't mess up the leader-board)

Port of my Java 8 answer, so look there for an explanation.

s=>Replace(s,".","$0$0")

Try it online.

\$\endgroup\$
2
  • \$\begingroup\$ Anything we can do to make the flag text in the header shorter? It makes the language name column in the leader-board pretty wide. (maybe "C# (Visual C# Interactive Compiler) with /u:...* flag, 28 bytes" and a * /u:System.Text.RegularExpressions.Regex in the body?) \$\endgroup\$ Aug 1, 2019 at 12:29
  • 1
    \$\begingroup\$ @JonathanAllan I've changed it. Will have to wait a few minutes before the API-date is updated to see if it works. EDIT: works. It's better readable now. ;) \$\endgroup\$ Aug 1, 2019 at 12:39
2
\$\begingroup\$

Retina 0.8.2, 6 bytes

.
$&$&

Try it online! Not guaranteed to work with unprintable characters. Previous 8-byte version worked with newlines:

s`.
$&$&

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ You can remove the s` now that the rules got changed. \$\endgroup\$ Aug 2, 2019 at 9:30
  • \$\begingroup\$ @KevinCruijssen Thanks! \$\endgroup\$
    – Neil
    Aug 2, 2019 at 9:46
2
\$\begingroup\$

Twig, 66 bytes

This is just a simple "split, loop, output twice".
Splitting by 0 on a string is similar to splitting by '' (empty string).

{%macro a(s)%}{%for c in s|split(0)%}{{c~c}}{%endfor%}{%endmacro%}

You can try it on https://twigfiddle.com/ldxe0c.

\$\endgroup\$
2
\$\begingroup\$

Agda, 110 Bytes

Sorry, no online interpreter available because this is more of a proof checker.

So this was quite annoying since I tried not to use the standard library and thus had to explicitly define lists. Chars also don't exist by now, but the function is polymorphic, so it would work in this case.

data L(A : Set): Set where
 N : L A
 C : A → L A → L A
d :{A : _}→ L A → L A
d N = N
d(C x y) = C x(C x(d y))
\$\endgroup\$
2
\$\begingroup\$

PHP, 59 bytes

-1 bytes by @manatwork

function($g){foreach(str_split($g)as$v)$e.=$v.$v;return$e;}

Try it online!

Full program , 44 bytes

foreach(str_split(readline())as$v)echo$v.$v;

Try it online!

\$\endgroup\$
7
  • \$\begingroup\$ No need for the braces around foreach's block. \$\endgroup\$
    – manatwork
    Aug 2, 2019 at 10:28
  • \$\begingroup\$ If you are submitting as a function you do have to include the function declaration (anonymous is fine) in your byte count: 65 bytes. \$\endgroup\$
    – 640KB
    Aug 4, 2019 at 17:27
  • \$\begingroup\$ Though errors and notices are fine so you don't really need to initialize $e: 59 bytes. \$\endgroup\$
    – 640KB
    Aug 4, 2019 at 17:30
  • \$\begingroup\$ Oh, welcome to PPCG by the way! \$\endgroup\$
    – 640KB
    Aug 4, 2019 at 17:31
  • \$\begingroup\$ Thanks, I'm fixing my answer \$\endgroup\$
    – ShiSHcat
    Aug 4, 2019 at 17:33
2
\$\begingroup\$

Matlab >= r2015a, 16 bytes

@(x)repelem(x,2)

Credits to Giuseppe

Note: I haven't found an online interpreter for MATLAB; this answer correctly works with MATLAB r2015a.

Matlab <= r2014b, 23 bytes

@(x)char(kron(x,[1,1]))

Note: I haven't found an online interpreter for MATLAB; this answer correctly works with MATLAB r2014b.

\$\endgroup\$
0
2
\$\begingroup\$

Cubix, 9 bytes

oU;?Av/@o

Try it online!

Mapped onto a cube

    o U
    ; ?
A v / @ o . . .
. . . . . . . .
    . .
    . .

Watch it run

  • A Put all the input onto the stack
  • v Redirect around the cube and start of the print loop
  • o? Output the character for the stack value and test value
  • @ If test is negative (EOI), halt
  • Uo;/ If test is positive, u-turn to the left, output character again, pop from stack and reflect onto the start of the print loop.
\$\endgroup\$
2
\$\begingroup\$

Octave, 32 25 bytes

@(x)char(kron(x+0,[1,1]))

Try it online!

-7 bytes thanks to Giuseppe

\$\endgroup\$
0
2
\$\begingroup\$

Fortran (GFortran), 100 bytes

Another demonstration of fortran's concise and elegant string handling capabilities... not!!

Summary: declare S as a 99 character string. read S in string format '(A)'. iterate over the trimmed string length. print the i'th character a couple of times without a newline (TIL).

Try it Online!

character(99)S;read(*,'(A)')S;do i=1,len_trim(S)
write(*,'(A)',advance="no")S(i:i)//S(i:i);enddo;end
\$\endgroup\$
2
\$\begingroup\$

K (ngn/k), 5 bytes

,/2#'

Try it online!


the above is an expression that will take (#) 2 copies of each (') letter and return a list where each element is a 2-char list, e.g.

("DD";"oo";"uu";"bb";"ll";"ee";"  ";"ss";"pp";"ee";"aa";"kk";"!!")

,/ is "join over", and flattens the list. we read the expression as "join over 2 take each string". with the string passed right-side we get:

  ,/2#'"Double speak!"
"DDoouubbllee  ssppeeaakk!!"
\$\endgroup\$
1
  • \$\begingroup\$ {2}# works too. see other answers \$\endgroup\$
    – ngn
    Aug 20, 2019 at 15:18
2
\$\begingroup\$

Piet, 20 codels

If you are using npiet, you might want to use the -q option to stop the interpreter from printing a prompt for each character.

Double Speak

Rundown

If STDIN contains no character, Piet's input functions will not lock or throw an error, but simply fail quietly. To know if we reached the end of the string, we therefore push a sentinel 0 to the stack to detect if nothing was read.

In pseudo code:

1. Push 1 to stack
2. Perform NOT on top of stack
3. Attempt to read character
4. Duplicate top of stack, twice.
5. Perform NOT on top of stack, twice,
   leaving a 1 if character was read, 0 otherwise.
6. Turn Direction Pointer as many steps as value on top of stack.
7. If we turn, print character, twice, and go to start
8. If we do not turn, get caught in exit block. (Bottom left corner.)
\$\endgroup\$
2
\$\begingroup\$

AsciiDots, 27 21 bytes

.>#a?**>$_a#
 \---/\/

Note that this halts in an error, which is allowed.

-6 bytes by getting rid of whitespace and not using warps.

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Kipple (cipple), 28 bytes

(i>ac<0>b(a-1b+1c+1a?)b>o<c)

It's actually suprisingly difficult to duplicate stack items in Kipple

Expanation

(i>ac<0>b(a-1b+1c+1a?)b>o<c) Full program

(i                         ) Loops until the input stack is empty
 i>a                         Push the top item of the input stack to stack A
    c<a>b                    Push 0's to stack B and C
         (a-1b+1c+1a?)       A loop that basically pushes the top of stack A to stack B and C
                      b>o<c  Push the top of stack B and stack C to the output stack

Try it online!

\$\endgroup\$
2
\$\begingroup\$

MathGolf, 2 bytes

I hope this isn't a duplicate. (Great, it isn't.)

_^

Explanation

_  Duplicate the implicit input
 ^ Zip

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Hexadecimal Stacking Pseudo-Assembly Language, 60 bytes

000000100000420000400000420000400000030000040000140000010000

Try it online!

000000 Label start:
100000 read character
420000 load it into register
400000 push it on the stack another time
420000 load it into register
400000 push it on the stack another time
030000 ignore next command if top of stack is non-zero
040000 end program
140000 print string
010000 go to start
\$\endgroup\$
2
\$\begingroup\$

Python 3, 31 bytes

for t in input():print(t,end=t)

a simple program of python

for t in input():

asking for the input, and doing a for loop for every char in the string.

print(t,end=t)

print the character, and then close the line with the same character.

\$\endgroup\$
1
2
\$\begingroup\$

R, 61 bytes

function(x){paste0(rep(strsplit(x,"")[[1]],e=2),collapse="")}

Try it online!

\$\endgroup\$
2
\$\begingroup\$

MIT-Scheme 10.*, 52 bytes

(lambda(x)(string-map(lambda(y)(make-string 2 y))x))

MIT-Scheme 10.* apparently has the new string-map which simplifies my earlier approach listed below. The only difference is that make-string is used to convert the character argument into a string and duplicate it.

74 bytes

This is the older solution for MIT-Scheme 9.* before string-map was introduced.

(lambda(x)(list->string(append-map(lambda(k)(list k k))(string->list x))))

This is an anonymous lambda that takes the input as a string, converts it to a list so that it can be mapped (I don't know of another way to do the same), replicating each character and joining it together in one list, after which it is converted back into a string.

\$\endgroup\$
2
\$\begingroup\$

GolfScript, 4 bytes

{.}%

Try it online!

Takes an input, which it treats as a list of characters, and maps . (push top item of stack to stack) over them.

\$\endgroup\$
2
\$\begingroup\$

Pip, 4 bytes

aWVa

Try it online!

The operator WV ("weave") takes two iterables and interleaves their elements. In this case, weaving the input string with itself produces the desired output.

\$\endgroup\$
2
\$\begingroup\$

W j, 5 2 bytes

+M

If you want to specify your input, you need to split your input into a list of individual characters before you do your job. (If that disobeys the rules, I will implement a flag that does this job for the writer. (Flags don't count in bytecount.))

Say your input is abcdef. Find imps.py and change those variables:

read = [["a","b","c","d","e","f"]]

prog = '+M'

Explanation

Lots of implicit stuff here. Expanded program:

aaa+M

The + requires 2 inputs and M only provides a single input. Therefore two 'a''s are prepended.

The M only has 1 input required left, so a single 'a' is prepended.
a     % The Implicit input
    M % Map every item of this input with...
 aa   % This every item with this every item...
   +  % Concatenated together

% Implicit Output
j % Join the output without a separator

Wren, 24 bytes

Fn.new{|s|s.map{|n|n+n}}

Try it online!

For every item in the list, return every item concatenated with itself.

\$\endgroup\$
2
\$\begingroup\$

Forth, (GForth) 55 bytes

: d pad 80 accept 0 do pad i + c@ dup emit emit loop ;

Usage: d [enter]

This text will be doubled. [enter]

Online Forth interpreter

'accept' takes a line of up to 80 chars into pad, then the do loop fetches chars from the pad, duplicates them and emits them to the terminal.

\$\endgroup\$
2
\$\begingroup\$

Rexx (Regina), 41 bytes

I just realized the rules specifically state "It will modify this string, duplicating every character." Since the newline is part of the string, I will now leave it in the string and duplicate it, thus reducing my code size to 42 bytes (according to ls -l, TIO says 41).

b=''
DO 80
a=CHARIN()
b=b||a||a
END
SAY b

Try it online!

Old 60 byte version which strips newlines (or CRs depending on your OS.)

b=''
DO 80
a=CHARIN()
b=b||a||a
END
SAY LEFT(b,LENGTH(b)-2)

Alternate last line (same number of bytes):

SAY STRIP(b,,X2C('0a'))

Do 80 iterations, read a char into var a, concatenate two a's onto the end of b during each loop, output the string minus the two newlines or CRs (need to modify for AmigaOS/AROS because it uses CR-LF for line terminators.)

62 byte original version:

DO 80
a=CHARIN()
x=CHAROUT(,a)CHAROUT(,a)
END

Read up to 80 chars from stdin into string var a, write 'a' to stdout twice for each char read in.

\$\endgroup\$
2
2
\$\begingroup\$

Elixir, 26 bytes

"#{for<<c<-s>>,do: [c,c]}"

Try it online!

\$\endgroup\$
2
\$\begingroup\$

PHP, 37 bytes

while($c=$s[$i++])$a.=$c.$c;return$a;

Try it online!

\$\endgroup\$
2
\$\begingroup\$

FEU, 12 bytes

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

Try it online!

Just a single regex substitution.

\$\endgroup\$
2
\$\begingroup\$

Kite, 111 94 79 bytes

Really surprised that nobody has used Kite before on CGCC... it's a really easy to learn language.

method d(a)[(a|split("")<-method(a)[a+a;])<|method(a,b)[a|str*a|bool|int+b;];];

Test suite:

method d(a)[(a|split("")<-method(a)[a+a;])<|method(a,b)[a|str*a|bool|int+b;];];

(d("abc"))|print;

(d("Double speak"))|print;
\$\endgroup\$
2
\$\begingroup\$

Marbelous, 26 bytes

..@0
..00
..]]\/
../\
@0../\..

Marbelous is a language based on marble machines

  • @n (n from 0 to Z) is a portal which teleport the marble to another portal with the same value
  • 00-FF initiate a marble with this value
  • ]] read one byte of input into a parsing marble
  • \/ is a trash can
  • /\ create a duplicate passing marble to it's left and right
  • .. is a noop
  • marbles going out of the machine from the bottom are implicitly outputed

interpretor

\$\endgroup\$
2
\$\begingroup\$

Rockstar, 82 73 bytes

listen to S
cut S
X's0
while S-X
let S at X be*2
let X be+1

join S
say S

Try it here (Code will need to be pasted in)

\$\endgroup\$
2
\$\begingroup\$

Python 3, 67 64 bytes

t=input()
for i in map(lambda x:x[0]+x[1],zip(t,t)):print(end=i)

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ print("".join(map("".join,zip(*[input()]*2)))) \$\endgroup\$
    – Danis
    Jan 25, 2021 at 19:00
  • \$\begingroup\$ j="".join;print(j(map(j,zip(*[input()]*2)))) \$\endgroup\$
    – Danis
    Jan 25, 2021 at 19:02
1
3 4
5
6 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.