Repeat a string: Difference between revisions
Add Bash example |
|||
Line 64: | Line 64: | ||
Return Output |
Return Output |
||
}</lang> |
}</lang> |
||
=={{header|Bash}}== |
|||
<lang bash>printf "ha%.0s" {1..5}</lang> |
|||
A slightly more generic version |
|||
<lang bash>s="ha" |
|||
r=5 |
|||
eval "printf '${s}%.0s' {1..${r}}"</lang> |
|||
=={{header|Batch File}}== |
=={{header|Batch File}}== |
Revision as of 21:56, 10 September 2010
You are encouraged to solve this task according to the task description, using any language you may know.
Take a string and repeat it some number of times. Example: repeat("ha", 5) => "hahahahaha"
If there is a simpler/more efficient way to repeat a single “character” (i.e. creating a string filled with a certain character), you might want to show that as well (i.e. repeat-char("*", 5) => "*****").
4DOS Batch
<lang 4dos>gosub repeat ha 5 echo %@repeat[*,5] quit
- Repeat [String Times]
do %Times% echos %String% enddo echo.
return</lang> Output shows:
hahahahaha *****
ActionScript
ActionScript does not have a built-in way to repeat a string multiple times, but the addition operator can be used to concatenate strings.
Iterative version
<lang ActionScript>function repeatString(string:String, numTimes:uint):String { var output:String = ""; for(var i:uint = 0; i < numTimes; i++) output += string; return output; }</lang>
Recursive version
The following double-and-add method is much faster when repeating a string many times. <lang ActionScript>function repeatRecursive(string:String, numTimes:uint):String { if(numTimes == 0) return ""; if(numTimes & 1) return string + repeatRecursive(string, numTimes - 1); var tmp:String = repeatRecursive(string, numTimes/2); return tmp + tmp; }</lang>
Ada
In Ada multiplication of an universal integer to string gives the desired result. Here is an example of use: <lang Ada>with Ada.Strings.Fixed; use Ada.Strings.Fixed; with Ada.Text_IO; use Ada.Text_IO;
procedure String_Multiplication is begin
Put_Line (5 * "ha");
end String_Multiplication;</lang> Sample output:
hahahahaha
ALGOL 68
<lang algol68>print (5 * "ha") </lang>
AutoHotkey
<lang AutoHotkey>MsgBox % Repeat("ha",5)
Repeat(String,Times) {
Loop, %Times% Output .= String Return Output
}</lang>
Bash
<lang bash>printf "ha%.0s" {1..5}</lang> A slightly more generic version <lang bash>s="ha" r=5 eval "printf '${s}%.0s' {1..${r}}"</lang>
Batch File
Commandline implementation
<lang dos>@echo off if "%2" equ "" goto fail setlocal enabledelayedexpansion set char=%1 set num=%2 for /l %%i in (1,1,%num%) do set res=!res!%char% echo %res%
- fail</lang>
'Function' version
<lang dos>@echo off setlocal enabledelayedexpansion if "%2" equ "" goto fail call :repeat %1 %2 res echo %res% goto :eof
- repeat
set char=%1 set num=%2 for /l %%i in (1,1,%num%) do set %3=!%3!%char% goto :eof
- fail</lang>
Brainf***
<lang bf>+++++ +++++ init first as 10 counter [-> +++++ +++++<] we add 10 to second each loopround
Now we want to loop 5 times to follow std +++++ [-> ++++ . ----- -- . +++<] print h and a each loop
and a newline because I'm kind and it looks good +++++ +++++ +++ . --- .</lang>
C
<lang c>#include <stdio.h>
- include <stdlib.h>
- include <string.h>
char * string_repeat( int n, const char * s ) {
size_t slen = strlen(s); char * dest = calloc(n*slen+1, sizeof(char));
int i; char * p; for ( i=0, p = dest; i < n; ++i, p += slen ) { memcpy(p, s, slen); } return dest;
}
int main() {
printf("%s\n", string_repeat(5, "ha")); return 0;
}</lang> A variation. <lang c>... char *string_repeat(char *str, int n) {
char *pa, *pb; size_t slen = strlen(str); char *dest = malloc(n*slen+1);
pa = dest + (n-1)*slen; strcpy(pa, str); pb = --pa + slen; while (pa>=dest) *pa-- = *pb--; return dest;
}</lang>
To repeat a single character <lang c>#include <stdio.h>
- include <stdlib.h>
- include <string.h>
char * char_repeat( int n, char c ) {
char * dest = calloc(n+1, sizeof(char)); memset(dest, c, n); return dest;
}
int main() {
printf("%s\n", char_repeat(5, '*')); return 0;
}</lang>
C++
<lang cpp>#include <string>
- include <iostream>
std::string repeat( const std::string &word, int times ) {
std::string result ; result.reserve(times*word.length()); // avoid repeated reallocation for ( int a = 0 ; a < times ; a++ ) result += word ; return result ;
}
int main( ) {
std::cout << repeat( "Ha" , 5 ) << std::endl ; return 0 ;
}</lang>
To repeat a single character: <lang cpp>#include <string>
- include <iostream>
int main( ) {
std::cout << std::string( 5, '*' ) << std::endl ; return 0 ;
}</lang>
C#
<lang csharp>String s = "".PadLeft(5, 'X').Replace("X", "ha")</lang>
To repeat a single character: <lang csharp>String s = "".PadLeft(5, '*')</lang>
Or for a single character use the String(char, int) constructor: <lang csharp>String s = new String('*', 5);</lang>
Clojure
<lang lisp>(apply str (repeat 5 "ha"))</lang>
Common Lisp
<lang lisp>(defun repeat-string (n string)
(with-output-to-string (stream) (loop repeat n do (write-string string stream))))
(princ (repeat-string 5 "hi"))</lang>
A single character may be repeated using just the builtin make-string
:
<lang lisp>(make-string 5 :initial-element #\X)</lang>
produces “XXXXX”.
D
Repeating a string: <lang d>import std.stdio; import std.string;
void main() {
writefln(repeat("ha", 5));
}</lang> Repeating a character with vector operations: <lang d>import std.stdio;
void main() {
char[]str; // create the dynamic array str.length = 5; // set the length str[]='*'; // set all characters in the string to '*' writefln(str);
}</lang>
E
<lang e>"ha" * 5</lang>
Factor
<lang factor>: repeat-string ( str n -- str' ) swap <repetition> concat ;
"ha" 5 repeat-string print</lang>
Forth
<lang forth>: place-n { src len dest n -- }
0 dest c! n 0 ?do src len dest +place loop ;
create test 256 allot s" ha" test 5 place-n test count type \ hahahahaha</lang> The same code without the use of locals: <lang forth> ( src len dest n -- )
- place-n 0 over c! 0 ?do >r 2dup r@ +place r> loop drop 2drop ;
create test 256 allot s" ha" test 5 place-n test count type cr \ hahahahaha</lang> Filling a string with a single character is supported by ANS-Forth: <lang forth>create test 256 allot
test 10 char * fill \ repeat a single character test 10 type</lang>
Fortran
<lang fortran>program test_repeat
write (*, '(a)') repeat ('ha', 5)
end program test_repeat</lang> Output:
hahahahaha
F#
<lang fsharp>> String.Concat( Array.create 5 "ha" );; val it : string = "hahahahaha"</lang>
Go
<lang go>fmt.Println(strings.Repeat("ha", 5)) # ==> "hahahahaha"</lang> "Characters" are just strings of length one.
Haskell
For a string of finite length:
<lang haskell>concat $ replicate 5 "ha"</lang>
For an infinitely long string:
<lang haskell>cycle "ha"</lang>
To repeat a single character:
<lang haskell>replicate 5 '*'</lang>
HicEst
<lang HicEst>CHARACTER out*20
EDIT(Text=out, Insert="ha", DO=5)</lang>
Icon and Unicon
Icon
The procedure repl is a supplied function in Icon and Unicon. <lang Icon>procedure main(args)
write(repl(integer(!args) | 5))
end</lang> If it weren't, one way to write it is: <lang Icon>procedure repl(s, n)
every (ns := "") ||:= |s\(0 <= n) return ns
end</lang>
Unicon
This Icon solution works in Unicon.
J
<lang j> 5 # '*' NB. repeat each item 5 times
5 # 'ha' NB. repeat each item 5 times
hhhhhaaaaa
(5 * # 'ha') $ 'ha' NB. repeat array 5 times (explicit)
hahahahaha
5 ((* #) $ ]) 'ha' NB. repeat array 5 times (tacit)
hahahahaha</lang>
Java
There's no function or operator to do this in Java, so you have to do it yourself. <lang java5>public static String repeat(String str, int times){
StringBuilder ret = new StringBuilder(); for(int i = 0;i < times;i++) ret.append(str); return ret.toString();
}
public static void main(String[] args){
System.out.println(repeat("ha", 5));
}</lang>
Or even shorter: <lang java5>public static String repeat(String str, int times){
return new String(new char[times]).replace("\0", str);
}</lang>
JavaScript
This solution creates an array of n+1 null elements, then joins them using the target string as the delimiter <lang javascript>String.prototype.repeat = function(n) {
return new Array(1 + parseInt(n, 10)).join(this);
}
alert("ha".repeat(5)); // hahahahaha</lang>
Liberty BASIC
<lang lb>a$ ="ha " print StringRepeat$( a$, 5)
end
function StringRepeat$( in$, n)
o$ ="" for i =1 to n o$ =o$ +in$ next i StringRepeat$ =o$
end function</lang>
Logo
<lang logo>to copies :n :thing [:acc "||]
if :n = 0 [output :acc] output (copies :n-1 :thing combine :acc :thing)
end</lang> or using cascade: <lang logo>show cascade 5 [combine "ha ?] "|| ; hahahahaha</lang>
Lua
<lang lua>function repeats(s, n) return n > 0 and s .. repeat(s, n-1) or "" end
Or use native string library function string.rep(s,n)
</lang>
MUMPS
<lang MUMPS> RPTSTR(S,N)
;Repeat a string S for N times NEW I FOR I=1:1:N WRITE S KILL I QUIT
RPTSTR1(S,N) ;Functionally equivalent, but denser to read
F I=1:1:N W S Q
</lang>
Objeck
<lang objeck> bundle Default {
class Repeat { function : Main(args : String[]) ~ Nil { Repeat("ha", 5)->PrintLine(); } function : Repeat(string : String, max : Int) ~ String { repeat : String := String->New(); for(i := 0; i < max; i += 1;) { repeat->Append(string); }; return repeat; } }
} </lang>
OCaml
<lang ocaml>let string_repeat s n =
let len = String.length s in let res = String.create(n * len) in for i = 0 to pred n do String.blit s 0 res (i * len) len; done; (res)
- </lang>
testing in the toplevel: <lang ocaml># string_repeat "Hiuoa" 3 ;; - : string = "HiuoaHiuoaHiuoa"</lang>
Alternately: <lang ocaml>let string_repeat s n =
String.concat "" (Array.to_list (Array.make n s))
- </lang>
Or: <lang ocaml>let string_repeat s n =
Array.fold_left (^) "" (Array.make n s)
- </lang>
To repeat a single character: <lang ocaml>String.make 5 '*'</lang>
Oz
We have to write a function for this: <lang oz>declare
fun {Repeat Xs N} if N > 0 then {Append Xs {Repeat Xs N-1}} else nil end end
in
{System.showInfo {Repeat "Ha" 5}}</lang>
Perl
<lang perl>"ha" x 5</lang>
Perl 6
<lang perl6>"ha" x 5</lang>
(Note that the x
operator isn't quite the same as in Perl 5: it now only creates strings. To create lists, use xx
.)
PHP
<lang php>str_repeat("ha", 5)</lang>
PicoLisp
<lang PicoLisp>(pack (need 5 NIL "ha")) -> "hahahahaha"</lang> or: <lang PicoLisp>(pack (make (do 5 (link "ha")))) -> "hahahahaha"</lang>
PL/I
<lang PL/I> s = copy('ha', 5);
/* To repeat a single character a fixed number of times: */
s = (5)(1)'h'; </lang>
PostScript
<lang PostScript>% the comments show the stack content after the line was executed % where rcount is the repeat count, "o" is for orignal, % "f" is for final, and iter is the for loop variable % % usage: rcount ostring times -> fstring
/times {
dup length dup % rcount ostring olength olength 4 3 roll % ostring olength olength rcount mul dup string % ostring olength flength fstring 4 1 roll % fstring ostring olength flength 1 sub 0 3 1 roll % fstring ostring 0 olength flength_minus_one { % fstring ostring iter 1 index 3 index % fstring ostring iter ostring fstring 3 1 roll % fstring ostring fstring iter ostring putinterval % fstring ostring } for pop % fstring
} def</lang>
PowerBASIC
<lang powerbasic>MSGBOX REPEAT$(5, "ha")</lang>
Prolog
<lang prolog> %repeat(Str,Num,Res). repeat(Str,1,Str). repeat(Str,Num,Res):-
Num1 is Num-1, repeat(Str,Num1,Res1), string_concat(Str, Res1, Res).
</lang>
Pure
str_repeat is defined by pattern-matching: repeating any string 0 times results in the empty string; while repeating it more than 0 times results in the concatenation of the string and (n-1) further repeats.
<lang pure>> str_repeat 0 s = ""; > str_repeat n s = s + (str_repeat (n-1) s) if n>0; > str_repeat 5 "ha"; "hahahahaha" ></lang>
PureBasic
<lang PureBasic>Procedure.s RepeatString(count, text$=" ")
Protected i, ret$=""
For i = 1 To count ret$ + text$ Next ProcedureReturn ret$
EndProcedure
Debug RepeatString(5, "ha")</lang>
Python
<lang python>"ha" * 5 # ==> "hahahahaha"</lang> "Characters" are just strings of length one.
PowerShell
<lang powershell>"ha" * 5 # ==> "hahahahaha"</lang>
R
<lang ruby>paste(rep("ha",5), collapse=)</lang>
Ruby
<lang ruby>"ha" * 5 # ==> "hahahahaha"</lang>
Scala
<lang scala>"ha" * 5 // ==> "hahahahaha"</lang>
Scheme
<lang scheme>(define (string-repeat n str) (fold string-append "" (make-list n str))) (string-repeat 5 "ha") ==> "hahahahaha"</lang>
To repeat a single character: <lang scheme>(make-string 5 #\*)</lang>
SNOBOL4
<lang snobol4> output = dupl("ha",5) end </lang>
Suneido
<lang Suneido>'ha'.Repeat(5) --> "hahahahaha" '*'.Repeat(5) --> "*****"</lang>
Tcl
<lang tcl>string repeat "ha" 5 ;# => hahahahaha</lang>
Ursala
<lang Ursala>#import nat
repeat = ^|DlSL/~& iota
- cast %s
example = repeat('ha',5)</lang> output:
'hahahahaha'
Visual Basic .NET
There is a simple instruction do repeat a char or a string the specified number of times (must be greater than 0). <lang vbnet>String(5, "ha") String(5, "*")</lang> Those produces:
hahahahaha *****
- Programming Tasks
- String manipulation
- 4DOS Batch
- ActionScript
- Ada
- ALGOL 68
- AutoHotkey
- Bash
- Batch File
- Brainf***
- C
- C++
- C sharp
- Clojure
- Common Lisp
- D
- E
- Factor
- Forth
- Fortran
- F Sharp
- Go
- Haskell
- HicEst
- Icon
- Unicon
- J
- Java
- JavaScript
- Liberty BASIC
- Logo
- Lua
- MUMPS
- Objeck
- OCaml
- Oz
- Perl
- Perl 6
- PHP
- PicoLisp
- PL/I
- PostScript
- PowerBASIC
- Prolog
- Pure
- PureBasic
- Python
- PowerShell
- R
- Ruby
- Scala
- Scheme
- SNOBOL4
- Suneido
- Tcl
- Ursala
- Visual Basic .NET