55
\$\begingroup\$

Here is a relatively simple challenge for you.

Given a string of length N, output the string forwards, then backwards, then forwards, then backwards... etc. N times. For example, if your input was

Hello!

You should output:

Hello!!olleHHello!!olleHHello!!olleH

You may also optionally output one trailing newline.

Your submission may be either a full program or a function, and you may take input and output in any reasonable format. For example, you may take IO from STDIN/STDOUT, function arguments and return value, from a file, etc. You can safely assume that the input string will not be empty, and will only contain printable ASCII. You must output the new string on a single line. So, for example, if the output to the last example was

Hello!
!olleH
Hello!
!olleH
Hello!
!olleH

This would not be a valid solution!

Here are some more test cases:

Input:
a
Output:
a

Input:
abcd
Output:
abcddcbaabcddcba

Input:
OK!
Output:
OK!!KOOK!

Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

Input:
PPCG
Output:
PPCGGCPPPPCGGCPP

Input:
42
Output:
4224

Leaderboards

Since this is a challenge, standard loopholes are banned, and the shortest answer in bytes wins! However, this is also a competition to have the shortest answer in any particular langauge. While it's unlikely that a Java answer will beat an answer in perl, or some golfing language, it's still very impressive to have the shortest Java answer. So, you can use this leaderboard to see both

  1. The shortest answer out of all languages, and

  2. The shortest answer in each individual language.

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

# Language Name, N bytes

where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

# Ruby, <s>104</s> <s>101</s> 96 bytes

If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

# Perl, 43 + 2 (-p flag) = 45 bytes

You can also make the language name a link which will then show up in the leaderboard snippet:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=93261,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.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(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;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="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <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><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><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

\$\endgroup\$
9
  • \$\begingroup\$ In your example, shouldn't that be olleH, not elloH ? \$\endgroup\$
    – Arnaud
    Commented Sep 15, 2016 at 3:27
  • 2
    \$\begingroup\$ @Downgoat No, you must take input and output in the same format as the spec describes. \$\endgroup\$
    – DJMcMayhem
    Commented Sep 15, 2016 at 4:15
  • 4
    \$\begingroup\$ Shouldn't the title be StringgnirtSStringgnirtSStringgnirtS? \$\endgroup\$
    – Luis Mendo
    Commented Sep 15, 2016 at 8:39
  • 2
    \$\begingroup\$ @carusocomputing It won't: "You can safely assume that the input string will not be empty, and will only contain printable ASCII." \$\endgroup\$ Commented Sep 15, 2016 at 13:50
  • 1
    \$\begingroup\$ en.wikipedia.org/wiki/ASCII#Printable_characters Ah, didn't know that was a well defined subset of ASCII. I imagined printable to include \t, \n, etc... \$\endgroup\$ Commented Sep 15, 2016 at 14:59

106 Answers 106

1 2 3
4
0
\$\begingroup\$

PicoLisp, 70 bytes

(de f(s)(for n(size s)(prin(if(= 1(% n 2))s(pack(reverse(chop s)))))))

Try it online!

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

Gaia, 10 bytes

:l┅r¦iv?¦$

Try it online!

:		| duplicate input
 l		| take length
  ┅		| push range 1,2,3,...l
    r¦		| modulo 2 1,0,1,...l%%2
      iv?¦	| if truthy, push same, else push reverse
          $	| join with no separator and display
\$\endgroup\$
0
\$\begingroup\$

Ohm v2, 5 bytes

lMDLR

Try it online!

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

Swift 5, 70 bytes

{a in String(zip(0..., a).flatMap{$0.0%2==0 ?a:String(a.reversed())})}

Try it online!

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

Lua, 62 bytes

a=arg[1]for i=1,#a do io.write(i%2==1 and a or a:reverse())end

Try it online!

Full program, take input as argument.

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

Kotlin, 67 bytes

{s->Array(s.length){if(it%2>0)s.reversed()else s}.joinToString("")}
  • Initialize an array of s.length elements.
  • Choose direction based on index
  • Concat it all together

Try it online!

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

Julia 1.0, 35 bytes

s->for _=s print(s);s=reverse(s)end

Try it online!

Loops over the input string characters and each iteration prints and reverses the string.

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

Keg, 8 bytes

᠀:(⑴;|⑩⑶

Try it online!

I found this to be quite a fun little answer to write.

Explained

᠀:(⑴;|⑩⑶
᠀:          #Take input as a string (otherwise numbers won't work correctly) and duplicate it, because:
  (⑴        #We then push the length of that string onto the stack. The ⑴ op pops the top however, which is why duplication was needed. This will be the loop count of our for loop, started with "("
    ;       #Decrement that length to avoid off by one error
     |      #Branch to the body of the for loop
      ⑩⑶    #Print the item without popping and then reverse that item

Oh unicode... why'd y'all have to be so unevenly widthed for?

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

Burlesque, 15 bytes

saS[jJ<-_+cyj.+

Try it online!

sa  # Length of input
S[  # Squared
jJ  # Duplicate the input
<-  # Reverse it
_+  # Join them
cy  # Repeat infinitely
j.+ # Take the first length-squared characters
\$\endgroup\$
0
\$\begingroup\$

C++ (gcc), 112 bytes

#import<bits/stdc++.h>
int f(std::string&s){for(int x=s.length();x--;std::reverse(&s[0],&*end(s)))std::cout<<s;}

Requires a non-const, mutable std::string. It reverses the string after every iteration and prints it.

-3 bytes thanks to ceilingcat!

Try it online!

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

Ly, 23 bytes

&iysp>l[<&s&o&lr&s>1-]p

Try it online!

At a high level, the code stores the input string in the "backup cell" restoring it, printing, reversing and re-saving each time through the loop. The loop counter is in a separate stack.

&iysp>l[<&s&o&lr&s>1-]p #
&i                      # Read the input onto the stack (as codepoints)
  ysp                   # Get the length, stash in the backup cell, pop from stack
     >l                 # Switch stacks, load the input lenght (loop counter)
        [         >1-]  # Loop, switch to loop counter stack, and decrement
         <&s            # Switch to the output stack, restore string from backup cell
           &o           # Print the stack
             &lr&s      # Restore string again, reverse stack and re-save
                      p # Delete loop counter to prevent it from printing
\$\endgroup\$
0
\$\begingroup\$

Pyt, 6 bytes

ĐąŁ⇹ҏ*

Try it online!

Đ          implicit input; duplicate on stack
 ąŁ        get length of input string
   ⇹ҏ      palindromize the input string
     *     string multiplication; implicit print
\$\endgroup\$
0
\$\begingroup\$

Japt, 6 4 bytes

£zYÑ

Try it

£zYÑ     :Implicit input of string U
£        :Map each character at 0-based index Y
 z       :  Rotate U 90° clockwise
  YÑ     :    Y*2 times
\$\endgroup\$
0
\$\begingroup\$

Go, 162 bytes

import."strings"
func f(s string)string{o,i:=[]string{},0
for;i<len(s);i++{k:=""
if i%2>0{for i:=range s{k=s[i:i+1]+k}}else{k=s}
o=append(o,k)}
return Join(o,"")}

Attempt This Online!

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

JavaScript, 52 bytes

Without recursion:

s=>[...s].reverse().flatMap((c,i,l)=>i%2?l:s).join``

Try it:

f=s=>[...s].reverse().flatMap((c,i,l)=>i%2?l:s).join``

console.log(f('a'));
console.log(f('abcd'));
console.log(f('OK!'));
console.log(f('4815162342'));
console.log(f('PPCG'));
console.log(f('42'));

UPD 59 -> 52

Thanks to Shaggy for the new algorithm without recursion to reduce bytes count

\$\endgroup\$
2
  • 1
    \$\begingroup\$ 52 bytes \$\endgroup\$
    – Shaggy
    Commented Jan 30, 2023 at 16:24
  • \$\begingroup\$ @Shaggy That was awesome! \$\endgroup\$
    – EzioMercer
    Commented Jan 30, 2023 at 16:50
0
\$\begingroup\$

Pip, 9 bytes

R{R:\a}Ma

Attempt This Online!

Explanation

This solution is really weird...

R{R:\a}Ma
          ; a is first cmdline arg as a local variable; \a is the same, but global
       Ma ; Map this function over each character of a:
 {  \a}   ;   Take the global variable \a
  R:      ;   Reverse it in place
R         ;   Then reverse that (without modifying \a)
          ; Join the results together and autoprint (implicit)
\$\endgroup\$
1 2 3
4

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.