93
\$\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\$
9
  • 5
    \$\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
  • 6
    \$\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
  • 4
    \$\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
  • 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
  • \$\begingroup\$ Does this answer your question? Stretching Words Because when you make the two operands in any submission to that challenge equal, programs will obey the behavior described in this challenge. An example of this behavior is here. \$\endgroup\$
    – user85052
    Jan 2, 2020 at 12:29

245 Answers 245

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

D, 57 bytes

Nothing special, just using the std.algorithm's fold function to add a character twice every iteration. There's probably a more efficient way to do this but this one's pretty concise.

import std;auto d(dstring s){return s.fold!"a~b~b"(""d);}

Try it online!

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

Uiua, 5 chars / 9 bytes

♭⍉[.]

Try it online!

Uiua is a fusion of the stack-based and array-oriented paradigms. It is read right-to-left.

[.] duplicates the top of the stack (the input string) and puts both into an array.

transposes the array so the 2 input strings go top down (every row contains 2 of a char).

deshapes the array, turning it back into a string.

\$\endgroup\$
1
  • 3
    \$\begingroup\$ -1 using couple: ♭⍉⊟. \$\endgroup\$
    – chunes
    Sep 29, 2023 at 11:22
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, 2019 at 14:11
  • \$\begingroup\$ An alternative algorithm can be much shorter. \$\endgroup\$
    – Maya
    Jul 31, 2019 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, 2019 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\$
    – Maya
    Jul 31, 2019 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, 2019 at 22:09
3
\$\begingroup\$

Triangularity, 17 bytes

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

Try it online!

\$\endgroup\$
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, 2019 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, 2021 at 8:44
  • \$\begingroup\$ Alternative (29) \$\endgroup\$
    – pxeger
    Jan 26, 2021 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\$ Jan 26, 2021 at 17:58
  • 1
    \$\begingroup\$ @GammaFunction that can be fixed with -o bsd_echo \$\endgroup\$
    – pxeger
    Jan 26, 2021 at 18:03
3
\$\begingroup\$

Swift 5, 30 bytes

thanks to @Mr.Xcoder for -14 bytes

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

Try it online!

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

JavaScript (V8), 28 bytes

s=>[...s].map(n=>n+n).join``

Try it online!

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

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.

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

K (oK), 5 bytes

Solution:

,/2#'

Try it online!

Explanation:

,/2#' / the solution
  2#' / 2 take (#) each
,/    / flatten
\$\endgroup\$
3
  • 1
    \$\begingroup\$ {2}# also works \$\endgroup\$
    – ngn
    Aug 5, 2019 at 17:26
  • \$\begingroup\$ Will update once I'm off mobile, can you explain how/why this one works? Why doesn't the lambda just return 2? \$\endgroup\$
    – mkst
    Aug 5, 2019 at 20:01
  • \$\begingroup\$ m#l is filter (m monad, l list) - equivalent to l@&m'l \$\endgroup\$
    – ngn
    Aug 6, 2019 at 6:20
3
\$\begingroup\$

Kotlin, 44 bytes

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

Try it online!

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

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!

\$\endgroup\$
5
  • 1
    \$\begingroup\$ 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. \$\endgroup\$
    – 640KB
    Aug 3, 2019 at 19:59
  • \$\begingroup\$ @gwaugh Thanks for the great idea, edited. \$\endgroup\$
    – Night2
    Aug 5, 2019 at 4:07
  • \$\begingroup\$ 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';". \$\endgroup\$
    – 640KB
    Aug 5, 2019 at 16:54
  • \$\begingroup\$ @gwaugh I assumed that since we can remove the starting tag, same goes for the end tag. Added semicolon and 1 byte back. \$\endgroup\$
    – Night2
    Aug 6, 2019 at 6:06
  • 1
    \$\begingroup\$ 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. \$\endgroup\$
    – 640KB
    Aug 6, 2019 at 15:06
3
\$\begingroup\$

MathGolf, 1 byte

^

Try it online!

Same as the Jelly answer, zip works on a character level for strings. Implicitly pops the input twice, and zips it with itself to produce a string. The first idea I had was m_ (map each character to duplicate), which produces identical output.

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

Lua, 32 31 bytes

print(((...):gsub('.','%0%0')))

Try it online!

Full program, take input as command line argument. Explanation is fairly trivial:

print(             -- Print result
    (              -- Drop second result (count of replacements, length of string for us)
        (...)      -- Take first cmd argument
        :gsub(     -- Do replacement:
            '.',   -- Take each character
            '%0%0' -- and replace it with itself (whole match) repeated twice
        )

    )
)
```
\$\endgroup\$
3
\$\begingroup\$

Gaia, 4 3 bytes

:¦$

Basically just maps the duplicate instruction to the input string, then turns the returned list into a string

Edit: turns out there was already a 1 byte answer in Gaia for this question that I missed, so my solution isn't that great

How it works

:   Duplicate
¦   Map to each character of the input string
$   Convert the returned list to a string
Auto outputs stack

Try it Online!

\$\endgroup\$
5
  • \$\begingroup\$ You don't need @ because the interpreter will implicitly push values onto the stack if needed, which is why Z works just fine. \$\endgroup\$
    – Giuseppe
    Aug 13, 2019 at 10:57
  • \$\begingroup\$ Oh wow, I didn't realise that, my solution is really sub-optimal \$\endgroup\$
    – EdgyNerd
    Aug 13, 2019 at 12:45
  • \$\begingroup\$ Well, I've been golfing in Gaia a bit; this is still quite good! \$\endgroup\$
    – Giuseppe
    Aug 13, 2019 at 12:56
  • \$\begingroup\$ there's also 2&. \$\endgroup\$
    – Giuseppe
    Aug 13, 2019 at 17:12
  • \$\begingroup\$ reading through the docs for Gaia is annoying, especially since the interpreter is rather buggy. \$\endgroup\$
    – Giuseppe
    Aug 13, 2019 at 17:12
3
\$\begingroup\$

C (gcc), 57 56 bytes

Thanks to ceilingcat and gastropher for the suggestions.

The string is modified in-place, so the buffer holding the string needs to be big enough first.

i;f(char*s){for(i=strlen(s)+1;i--;s[i-~i]=s[i*2]=s[i]);}

Try it online!

C version with allocated string, 73 71 bytes

If the string buffer can't be assumed to be big enough (or writable), this version allocates a buffer to return.

f(s,t,u)char*s,*t;{for(u=t=malloc(strlen(s)*3);*t++=*s;*t++=*s++);s=u;}

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ Far as I could tell, there is no rule against wastefulness, so you could do malloc(strlen(s)*3) in the allocated string version to save two bytes. \$\endgroup\$
    – gastropner
    Aug 20, 2019 at 2:42
  • \$\begingroup\$ You can save 13 bytes by using recursion in your in place modified version: x;f(char*s){x++;*s&&f(s+1);s[--x]=s[x]=*s;} \$\endgroup\$
    – xibu
    Dec 1, 2019 at 19:39
3
\$\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\$
3
\$\begingroup\$

Forth (gforth), 39 bytes

: f bounds ?do i 1 type i 1 type loop ;

Try it online!

Beats NieDzejkob's submission by one byte. If we don't care empty strings, we can safely remove the ? in ?do, making it 38 bytes.

A function that takes a string in the standard representation (addr, length), and prints the result to the console.

How it works

gforth documentation about bounds

: f ( addr len -- )
  bounds ?do        \ Iterate through char addresses..
    i 1 type        \   Print one char at the address
    i 1 type        \   One more time
  loop ;            \ End loop
\$\endgroup\$
3
\$\begingroup\$

Backhand, 5 bytes

i}o: 

Try it online!

(note the trailing space) This should be the optimal answer, since all of io: are needed, 4 bytes needs at two movement modifiers to avoid getting stuck in two instruction loops, and no three byte permutation works.

Explanation:

i       Input
   :    Dupe
  o     Output
 }      Move back to output
  o     Output
   :    Unnecessary dupe
i       Beginning of loop again

Of course, for a suboptimal but ironic answer you could do:

vvii::oooo22jj

Try it online!

Which doubles up on every character.

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

SWI-Prolog, 87 bytes

I did not see any Prolog attempt, so I tried to make one.

d([A|X],[A,A|Y]):-d(X,Y). d([],[]). p(X,W):-string_codes(X,Y),d(Y,Z),string_codes(W,Z).

The predicate to be called is p:

?- p("Hello world!", X)

It produces (in SWI-Prolog online interpreter):

X = "HHeelllloo wwoorrlldd!!";

Explanation

The code uses two different predicates: the first one (d) works with a list and duplicates every element in it.

d([A|X], [A,A|Y]) :- d(X, Y).
d([],[]).

As most of Prolog's predicates, it uses recursion to implement iteration over elements: the first line is the recursive step, while the second is the base step. Duplication is obtained by forcing the head of the first argument to be equal to the "2-elements-head" of the second argument.

Unluckily, this is not enough to work with strings: in fact, predicate p serves as converter between strings and lists.

p(X,W) :- string_codes(X,Y), d(Y,Z), string_codes(W,Z).

Due to library names, this second predicate extends the solution by at least 22 unnecessary characters... So, if anyone could suggest me a way to get rid of those, or any general solution improvement, I'd be very grateful ^^

Note that you can still use d in a sort of "raw-mode", reducing the solution length to 35 bytes. However, the input is technically not a string.

?- d(['H','e','l','l','o',' ','w','o','r','l','d','!'],X)

Try it online!

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

Poetic, 46 49 bytes

+3 bytes to account for inputs that are longer than the tape will allow (unlikely, but possible).

enduring a tragedy,knowing a way i am,troubles me

Try it online!

Poetic is an esolang I created in 2018 for a class project. It's basically brainfuck with word-lengths instead of symbols.

The point of the language is to allow for programs to be written in free-verse poetry. I encourage you all to try it out sometime!

\$\endgroup\$
1 2
3
4 5
9

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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