Determine if a string has all the same characters: Difference between revisions

→‎{{header|S-BASIC}}: revamp output display
No edit summary
(→‎{{header|S-BASIC}}: revamp output display)
 
(92 intermediate revisions by 49 users not shown)
Line 33:
Show all output here on this page.
 
{{Template:Strings}}
 
;Related tasks:
:*   [https://rosettacode.org/wiki/Determine_if_a_string_has_all_unique_characters determine if a string has all unique characters]
:*   [https://rosettacode.org/wiki/Pangram_checker pangram checker]
:*   [https://rosettacode.org/wiki/Compare_a_list_of_strings compare a list of strings]
:*   [https://rosettacode.org/wiki/Determine_if_a_string_is_collapsible determine if a string is collapsible]
<br><br>
 
=={{header|11l}}==
{{trans|Kotlin}}
 
<syntaxhighlight lang="11l">F analyze(s)
print(‘Examining [’s‘] which has a length of ’s.len‘:’)
I s.len > 1
V b = s[0]
L(c) s
V i = L.index
I c != b
print(‘ Not all characters in the string are the same.’)
print(‘ '’c‘' (0x’hex(c.code)‘) is different at position ’i)
R
 
print(‘ All characters in the string are the same.’)
 
V strs = [‘’, ‘ ’, ‘2’, ‘333’, ‘.55’, ‘tttTTT’, ‘4444 444k’]
L(s) strs
analyze(s)</syntaxhighlight>
 
{{out}}
<pre>
Examining [] which has a length of 0:
All characters in the string are the same.
Examining [ ] which has a length of 3:
All characters in the string are the same.
Examining [2] which has a length of 1:
All characters in the string are the same.
Examining [333] which has a length of 3:
All characters in the string are the same.
Examining [.55] which has a length of 3:
Not all characters in the string are the same.
'5' (0x35) is different at position 1
Examining [tttTTT] which has a length of 6:
Not all characters in the string are the same.
'T' (0x54) is different at position 3
Examining [4444 444k] which has a length of 9:
Not all characters in the string are the same.
' ' (0x20) is different at position 4
</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">PROC PrintBH(BYTE a)
BYTE ARRAY hex=['0 '1 '2 '3 '4 '5 '6 '7 '8 '9 'A 'B 'C 'D 'E 'F]
 
Put(hex(a RSH 4))
Put(hex(a&$0F))
RETURN
 
PROC Test(CHAR ARRAY s)
BYTE i,pos
 
pos=0
FOR i=2 TO s(0)
DO
IF s(i)#s(1) THEN
pos=i
EXIT
FI
OD
 
PrintF("""%S"" (len=%B) -> ",s,s(0))
IF pos=0 THEN
PrintE("all characters are the same.")
ELSE
PrintF("""%C"" (hex=$",s(pos))
PrintBH(s(pos))
PrintF(") is the first difference at pos. %B.%E",pos)
FI
PutE()
RETURN
 
PROC Main()
Test("")
Test(" ")
Test("2")
Test("333")
Test(".55")
Test("tttTTT")
Test("4444 444k")
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Determine_if_a_string_has_all_the_same_characters.png Screenshot from Atari 8-bit computer]
<pre>
"" (len=0) -> all characters are the same.
 
" " (len=3) -> all characters are the same.
 
"2" (len=1) -> all characters are the same.
 
"333" (len=3) -> all characters are the same.
 
".55" (len=3) -> "5" (hex=$35) is the first difference at pos. 2.
 
"tttTTT" (len=6) -> "T" (hex=$54) is the first difference at pos. 4.
 
"4444 444k" (len=9) -> " " (hex=$20) is the first difference at pos. 5.
</pre>
 
=={{header|Ada}}==
<langsyntaxhighlight Adalang="ada">with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
procedure Test_All_Chars_Are_Same is
Line 73 ⟶ 167:
All_Chars_Are_Same ("tttTTT");
All_Chars_Are_Same ("4444 444k");
end Test_All_Chars_Are_Same;</langsyntaxhighlight>
 
{{out}}
Line 92 ⟶ 186:
 
=={{header|ALGOL 68}}==
<langsyntaxhighlight lang="algol68">BEGIN
# return the position of the first different character in s #
# or UPB s + 1 if all the characters are the same #
Line 121 ⟶ 215:
IF d < 10
THEN REPR ( d + ABS "0" )
ELSE REPR ( ( d - 10 ) + ABS "0a" )
FI +=: result
OD
Line 153 ⟶ 247:
show first diff( ".55" );
show first diff( "tttTTT" );
show first diff( "4444 444k" );
show first diff( "4444|444k" )
END</lang>
END</syntaxhighlight>
{{out}}
<pre>
Line 164 ⟶ 259:
"tttTTT" (length 6): first different character "T"(0x54) at position: 4
"4444 444k" (length 9): first different character " "(0x20) at position: 5
"4444|444k" (length 9): first different character "|"(0x7c) at position: 5
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">strings: [
"", " ", "2", "333", ".55", "tttTTT",
"4444 444k", "pépé", "🐶🐶🐺🐶", "🎄🎄🎄🎄"
]
 
allSameChars?: function [str][
if empty? str -> return ø
current: first str
loop.with:'i str 'ch [
if ch <> current -> return i
]
return ø
]
 
loop strings 's [
prints ["\"" ++ s ++ "\"" ~"(size |size s|):"]
firstNotSame: allSameChars? s
if? null? firstNotSame -> print "all the same."
else -> print ~"first different char `|get s firstNotSame|` at position |firstNotSame|."
]</syntaxhighlight>
 
{{out}}
 
<pre>"" (size 0): all the same.
" " (size 3): all the same.
"2" (size 1): all the same.
"333" (size 3): all the same.
".55" (size 3): first different char `5` at position 1.
"tttTTT" (size 6): first different char `T` at position 3.
"4444 444k" (size 11): first different char ` ` at position 4.
"pépé" (size 4): first different char `é` at position 1.
"🐶🐶🐺🐶" (size 4): first different char `🐺` at position 2.
"🎄🎄🎄🎄" (size 4): all the same.</pre>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">testCases := ["", " ", "2", "333", ".55", "tttTTT", "4444 4444k"]
for key, str in testCases {
MsgBox % "Examining `'" str "`' which has a length of " StrLen(str) ":`n"
if (StrLen(str) == 0) or (StrLen(str) == 1) {
MsgBox % " All characters in the string are the same.`n"
continue
}
firstChar := SubStr(str, 1, 1)
Loop, Parse, str
{
if (firstChar != A_LoopField) {
hex := Format("0x{:x}", Ord(A_LoopField))
MsgBox % " Not all characters in the string are the same.`n Character `'" A_LoopField "`' (" hex ") is different at position " A_Index ".`n", *
break
}
if (A_Index = StrLen(str))
MsgBox % " All characters in the string are the same.`n", *
}
}
</syntaxhighlight>
{{out}}
<pre>
Examining '' which has a length of 0:
All characters in the string are the same.
Examining ' ' which has a length of 3:
All characters in the string are the same.
Examining '2' which has a length of 1:
All characters in the string are the same.
Examining '333' which has a length of 3:
All characters in the string are the same.
Examining '.55' which has a length of 3:
Not all characters in the string are the same.
Character '5' (0x35) is different at position 2.
Examining 'tttTTT' which has a length of 6:
All characters in the string are the same.
Examining '4444 4444k' which has a length of 10:
Not all characters in the string are the same.
Character ' ' (0x20) is different at position 5.
</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f DETERMINE_IF_A_STRING_HAS_ALL_THE_SAME_CHARACTERS.AWK
BEGIN {
Line 202 ⟶ 375:
}
function max(x,y) { return((x > y) ? x : y) }
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 217 ⟶ 390:
|-------------|--------|----------|----------|-----|----------|
</pre>
 
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
<syntaxhighlight lang="gwbasic"> 10 DATA ""," ","2","333",".55","tttTTT","4444 444k"
20 LET Q$ = CHR$ (34)
30 HOME
40 FOR E = 1 TO 7
50 READ S$
60 GOSUB 100
70 PRINT O$" IN"M$Q$S$Q$" OF LENGTH "L".";
80 NEXT E
90 END
100 GOSUB 200
110 PRINT M$M$;
120 LET M$ = CHR$ (13)
130 LET O$ = "ALL OF THE CHARACTERS ARE THE SAME"
140 IF SAME THEN RETURN
150 PRINT "THE FIRST DIFFERENT CHARACTER IS"
160 PRINT TAB( I)Q$C$Q$;
170 PRINT " ASCII " ASC (C$)" AT POSITION ";
180 LET O$ = STR$ (I)
190 RETURN
200 LET C$ = LEFT$ (S$,1)
210 LET L = LEN (S$)
220 FOR I = 1 TO L
230 IF C$ = MID$ (S$,I,1) THEN NEXT I
240 LET C$ = MID$ (S$,I,1)
250 LET SAME = C$ = ""
260 RETURN</syntaxhighlight>
{{out}}
<pre>
ALL OF THE CHARACTERS ARE THE SAME IN
"" OF LENGTH 0.
 
ALL OF THE CHARACTERS ARE THE SAME IN
" " OF LENGTH 3.
 
ALL OF THE CHARACTERS ARE THE SAME IN
"2" OF LENGTH 1.
 
ALL OF THE CHARACTERS ARE THE SAME IN
"333" OF LENGTH 3.
 
THE FIRST DIFFERENT CHARACTER IS
"5" ASCII 53 AT POSITION 2 IN
".55" OF LENGTH 3.
 
THE FIRST DIFFERENT CHARACTER IS
"T" ASCII 84 AT POSITION 4 IN
"tttTTT" OF LENGTH 6.
 
THE FIRST DIFFERENT CHARACTER IS
" " ASCII 32 AT POSITION 5 IN
"4444 444k" OF LENGTH 9.
</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
The [[#GW-BASIC|GW-BASIC]] solution works without any changes.
 
==={{header|GW-BASIC}}===
{{works with|BASICA}}
{{works with|PC-BASIC|any}}
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="gwbasic">
10 'SAVE"SAMECHAR", A
20 DEFINT A-Z
30 DATA ""," ","2","333",".55","tttTTT","4444 444k", "FIN"
40 ' Main program cycle
50 CLS
60 PRINT "Program SameChar"
70 PRINT "Determines if a string has the same character or not."
80 PRINT
90 WHILE S$<>"FIN"
100 READ S$
110 IF S$="FIN" THEN 150
120 GOSUB 190 ' Revision subroutine
130 PRINT "'";S$;"' of length";LEN(S$);
140 IF I<2 THEN PRINT "contains all the same character." ELSE PRINT "is different at possition";STR$(I);": '";DC$; "' (0x"; HEX$(ASC(DC$)); ")"
150 WEND
160 PRINT
170 PRINT "End of program run."
180 END
190 ' DifChar subroutine
200 C$ = LEFT$(S$,1)
210 I = 1
220 DC$=""
230 WHILE I<LEN(S$) AND DC$=""
240 IF MID$(S$,I,1)<>C$ THEN DC$=MID$(S$,I,1) ELSE I=I+1
250 WEND
260 IF DC$="" THEN I=1
270 RETURN</syntaxhighlight>
{{out}}
<pre>
Program SameChar
Determines if a string has the same character or not.
 
'' of length 0 contains all the same character.
' ' of length 3 contains all the same character.
'2' of length 1 contains all the same character.
'333' of lenght 3 contains all the same character.
'.55' of length 3 is different at possition 2: '5' (0x35)
'tttTTT' of length 6 is different at possition 4: 'T' (0x54)
'4444 444k' of length 9 is different at possition 5: ' ' (0x20)
 
End of program run.
</pre>
 
==={{header|QuickBASIC}}===
Works with QBASIC, VB-DOS, PDS 7.x
<syntaxhighlight lang="qbasic">
DECLARE SUB DifChar (sString AS STRING, wc AS INTEGER, dc AS STRING)
 
DIM i AS INTEGER
DIM s AS STRING
DIM dc AS STRING
 
DATA "", " ", "2", "333",".55","tttTTT", "4444 444k", "FIN"
 
' Main program cycle
CLS
PRINT "Program SameChar"
PRINT "Determines if a string has the same character or not."
PRINT
DO
READ s
IF s = "FIN" THEN EXIT DO
DifChar s, i, dc
PRINT "'"; s; "' of length"; LEN(s);
IF i < 2 THEN
PRINT "contains all the same character."
ELSE
PRINT "is different at possition"; STR$(i); ": '"; dc; "' (0x"; HEX$(ASC(dc)); ")"
END IF
LOOP
PRINT
PRINT "End of program run."
END
 
SUB DifChar (sString AS STRING, wc AS INTEGER, dc AS STRING)
' Var
DIM c AS STRING
 
' Look for the distinct char
c = LEFT$(sString, 1)
wc = 1
dc = ""
DO WHILE wc < LEN(sString)
IF MID$(sString, wc, 1) <> c THEN dc = MID$(sString, wc, 1): EXIT DO
wc = wc + 1
LOOP
 
IF dc = "" THEN wc = 1
END SUB
 
</syntaxhighlight>
{{out}}
<pre>
Program SameChar
Determines if a string has the same character or not.
 
'' of length 0 contains all the same character.
' ' of length 3 contains all the same character.
'2' of length 1 contains all the same character.
'333' of lenght 3 contains all the same character.
'.55' of length 3 is different at possition 2: '5' (0x35)
'tttTTT' of length 6 is different at possition 4: 'T' (0x54)
'4444 444k' of length 9 is different at possition 5: ' ' (0x20)
 
End of program run.
</pre>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
let diffchar(s) = valof
$( for i=2 to s%0
unless s%i = s%1 resultis i
resultis 0
$)
 
let show(s) be
$( let i = diffchar(s)
writef("*"%S*" (length %N): ", s, s%0)
test i=0
do writes("all the same.*N")
or writef("'%C' at index %N.*N", s%i, i)
$)
 
let start() be
$( show("")
show(" ")
show("2")
show("333")
show(".55")
show("tttTTT")
show("4444 444k")
$)</syntaxhighlight>
{{out}}
<pre>"" (length 0): all the same.
" " (length 3): all the same.
"2" (length 1): all the same.
"333" (length 3): all the same.
".55" (length 3): '5' at index 2.
"tttTTT" (length 6): 'T' at index 4.
"4444 444k" (length 9): ' ' at index 5.</pre>
 
=={{header|BQN}}==
 
Hex function is pieced together from BQNcrate idioms.
<syntaxhighlight lang="bqn">Check←=´˘2⊸↕
Hex←⊏⟜(∾"0A"+⟜↕¨10‿26)16{⌽𝕗|⌊∘÷⟜𝕗⍟(↕1+·⌊𝕗⋆⁼1⌈⊢)}
 
{
𝕊 str:
r←Check 2⊸↑⍟(0=≠)str
•Out {
∧´r ? "All characters are the same" ;
i←⊑r⊐0
ch←(i+1)⊑str
"'"∾ch∾"' (hex: "∾(Hex ch-@)∾", index: "∾(•Fmt i)∾") mismatched in string '"∾str∾"'"
}
}¨⟨
""
" "
"2"
"333"
".55"
"tttTTT"
"4444 444k"
⟩</syntaxhighlight>
<syntaxhighlight lang="text">All characters are the same
All characters are the same
All characters are the same
All characters are the same
'5' (hex: 35, index: 0) mismatched in string '.55'
'T' (hex: 54, index: 2) mismatched in string 'tttTTT'
' ' (hex: 20, index: 3) mismatched in string '4444 444k'</syntaxhighlight>
 
=={{header|C}}==
=== Solution with an index to a table ===
In interactive mode, strings with spaces have to be enclosed in double quotes ("")
<syntaxhighlight lang="c">
<lang C>
#include<string.h>
#include<stdio.h>
Line 254 ⟶ 666:
 
}
</syntaxhighlight>
</lang>
Output :
<pre>
Line 286 ⟶ 698:
First different character : " "(0x20) at position : 5
</pre>
===Solution with pointers===
<syntaxhighlight lang="c">/**
* An example for RossetaCode - an example of string operation with wchar_t and
* with old 8-bit characters. Anyway, it seem that C is not very UTF-8 friendly,
* thus C# or C++ may be a better choice.
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
* The wide character version of the program is compiled if WIDE_CHAR is defined
*/
#define WIDE_CHAR
 
#ifdef WIDE_CHAR
#define CHAR wchar_t
#else
#define CHAR char
#endif
 
/**
* Find a character different from the preceding characters in the given string.
*
* @param s the given string, NULL terminated.
*
* @return the pointer to the occurence of the different character
* or a pointer to NULL if all characters in the string
* are exactly the same.
*
* @notice This function return a pointer to NULL also for empty strings.
* Returning NULL-or-CHAR would not enable to compute the position
* of the non-matching character.
*
* @warning This function compare characters (single-bytes, unicode etc.).
* Therefore this is not designed to compare bytes. The NULL character
* is always treated as the end-of-string marker, thus this function
* cannot be used to scan strings with NULL character inside string,
* for an example "aaa\0aaa\0\0".
*/
const CHAR* find_different_char(const CHAR* s)
{
/* The code just below is almost the same regardles
char or wchar_t is used. */
 
const CHAR c = *s;
while (*s && c == *s)
{
s++;
}
return s;
}
 
/**
* Apply find_different_char function to a given string and output the raport.
*
* @param s the given NULL terminated string.
*/
void report_different_char(const CHAR* s)
{
#ifdef WIDE_CHAR
wprintf(L"\n");
wprintf(L"string: \"%s\"\n", s);
wprintf(L"length: %d\n", wcslen(s));
const CHAR* d = find_different_char(s);
if (d)
{
/*
* We have got the famous pointers arithmetics and we can compute
* difference of pointers pointing to the same array.
*/
wprintf(L"character '%wc' (%#x) at %d\n", *d, *d, (int)(d - s));
}
else
{
wprintf(L"all characters are the same\n");
}
wprintf(L"\n");
#else
putchar('\n');
printf("string: \"%s\"\n", s);
printf("length: %d\n", strlen(s));
const CHAR* d = find_different_char(s);
if (d)
{
/*
* We have got the famous pointers arithmetics and we can compute
* difference of pointers pointing to the same array.
*/
printf("character '%c' (%#x) at %d\n", *d, *d, (int)(d - s));
}
else
{
printf("all characters are the same\n");
}
putchar('\n');
#endif
}
 
/* There is a wmain function as an entry point when argv[] points to wchar_t */
 
#ifdef WIDE_CHAR
int wmain(int argc, wchar_t* argv[])
#else
int main(int argc, char* argv[])
#endif
{
if (argc < 2)
{
report_different_char(L"");
report_different_char(L" ");
report_different_char(L"2");
report_different_char(L"333");
report_different_char(L".55");
report_different_char(L"tttTTT");
report_different_char(L"4444 444k");
}
else
{
report_different_char(argv[1]);
}
 
return EXIT_SUCCESS;
}</syntaxhighlight>
 
{{output}}
<pre>
string: ""
length: 0
all characters are the same
 
 
string: " "
length: 3
all characters are the same
 
 
string: "2"
length: 1
all characters are the same
 
 
string: "333"
length: 3
all characters are the same
 
 
string: ".55"
length: 3
character '5' (0x35) at 1
 
 
string: "tttTTT"
length: 6
character 'T' (0x54) at 3
 
 
string: "4444 444k"
length: 9
character ' ' (0x20) at 4</pre>
 
=={{header|C sharp|C#}}==
{{trans|D}}
<langsyntaxhighlight lang="csharp">using System;
 
namespace AllSame {
Line 317 ⟶ 890:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0:
Line 338 ⟶ 911:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <stringstring_view>
 
void all_characters_are_the_same(const std::string&string_view str) {
{
size_t len = str.length();
std::cout << "input: \"" << str << "\", length: " << len << '\n';
if (len > 0) {
{
char ch = str[0];
for (size_t i = 1; i < len; ++i) {
if (str[i] != ch) {
if (str[i] != ch)
{
std::cout << "Not all characters are the same.\n";
std::cout << "Character '" << str[i] << "' (hex " << std::hex
<< "' (hex " << std::hex << static_cast<unsigned int>(str[i])
<< ") at position " << std::dec << i + 1
<< " is not the same as '" << ch << "'.\n\n";
return;
}
Line 364 ⟶ 933:
}
 
int main() {
{
all_characters_are_the_same("");
all_characters_are_the_same(" ");
Line 374 ⟶ 942:
all_characters_are_the_same("4444 444k");
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 402 ⟶ 970:
Character ' ' (hex 20) at position 5 is not the same as '4'.
 
</pre>
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">
(defn check-all-chars-same [s]
(println (format "String (%s) of len: %d" s (count s)))
(let [num-same (-> (take-while #(= (first s) %) s)
count)]
(if (= num-same (count s))
(println "...all characters the same")
(println (format "...character %d differs - it is 0x%x"
num-same
(byte (nth s num-same)))))))
 
(map check-all-chars-same
[""
" "
"2"
"333"
".55"
"tttTTT"
"4444 444k"])
</syntaxhighlight>
 
{{out}}
<pre>
(String () of len: 0
...all characters the same
String ( ) of len: 3
...all characters the same
String (2) of len: 1
...all characters the same
String (333) of len: 3
...all characters the same
String (.55) of len: 3
...character 1 differs - it is 0x35
String (tttTTT) of len: 6
...character 3 differs - it is 0x54
String (4444 444k) of len: 9
...character 4 differs - it is 0x20
</pre>
 
Line 409 ⟶ 1,017:
(strequ) for auto-test
 
<langsyntaxhighlight lang="lisp">(defun strequ (&rest str)
(if (not str) (setf str (list "" " " "2" "333" ".55" "tttTTT" "4444 444k")))
(dolist (s str)
Line 417 ⟶ 1,025:
(format t "\"~a\" [~d] : All characters are identical.~%" s (length s)) t)
((char/= (char s i) (char s 0))
(format t "\"~a\" [~d] : '~c' (0x~0x) at index ~d is different.~%" s (length s) (char s i) (char-int (char s i)) i) t))))))</langsyntaxhighlight>
 
{{out}}
Line 429 ⟶ 1,037:
=={{header|D}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="d">import std.stdio;
 
void analyze(string s) {
Line 451 ⟶ 1,059:
analyze(str);
}
}</langsyntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0:
Line 470 ⟶ 1,078:
Not all characters in the string are the same.
' ' (0x20) is different at position 3</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|D}}
<syntaxhighlight lang="delphi">
program Determine_if_a_string_has_all_the_same_characters;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils;
 
procedure Analyze(s: string);
var
b, c: char;
i: Integer;
begin
writeln(format('Examining [%s] which has a length of %d:', [s, s.Length]));
if s.Length > 1 then
begin
b := s[1];
for i := 2 to s.Length - 1 do
begin
c := s[i];
if c <> b then
begin
writeln(' Not all characters in the string are the same.');
writeln(format(' "%s" 0x%x is different at position %d', [c, Ord(c), i]));
Exit;
end;
end;
end;
writeln(' All characters in the string are the same.');
end;
 
var
TestCases: array of string = ['', ' ', '2', '333', '.55', 'tttTTT', '4444 444k'];
w: string;
 
begin
for w in TestCases do
Analyze(w);
Readln;
end.</syntaxhighlight>
{{out}}
<pre>
Examining [] which has a length of 0:
All characters in the string are the same.
Examining [ ] which has a length of 3:
All characters in the string are the same.
Examining [2] which has a length of 1:
All characters in the string are the same.
Examining [333] which has a length of 3:
All characters in the string are the same.
Examining [.55] which has a length of 3:
Not all characters in the string are the same.
"5" 0x35 is different at position 2
Examining [tttTTT] which has a length of 6:
Not all characters in the string are the same.
"T" 0x54 is different at position 4
Examining [4444 444k] which has a length of 9:
Not all characters in the string are the same.
" " 0x20 is different at position 5
</pre>
=={{header|EasyLang}}==
<syntaxhighlight>
func$ hex h .
for d in [ h div 16 h mod 16 ]
if d > 9
d += 7
.
h$ &= strchar (d + 48)
.
return h$
.
proc samechar s$ . .
s$[] = strchars s$
for i = 2 to len s$[]
if s$[i] <> s$[i - 1]
h = strcode s$[i]
write " --> different: '" & s$[i] & "' (" & hex h & "h)"
print "' position: " & i
return
.
.
print " --> ok"
.
repeat
s$ = input
until s$ = "EOF"
print "'" & s$ & "'" & " length " & len s$
samechar s$
print ""
.
input_data
 
2
333
.55
tttTTT
4444 444k
EOF
</syntaxhighlight>
 
 
=={{header|Erlang|Erlang}}==
<syntaxhighlight lang="erlang">
-module(string_examples).
-export([examine_all_same/1, all_same_examples/0]).
 
all_same_characters([], _Offset) ->
all_same;
all_same_characters([_], _Offset) ->
all_same;
all_same_characters([X, X | Rest], Offset) ->
all_same_characters([X | Rest], Offset + 1);
all_same_characters([X, Y | _Rest], Offset) when X =/= Y ->
{not_all_same, Y, Offset + 1}.
 
examine_all_same(String) ->
io:format("String \"~ts\" of length ~p:~n", [String, length(String)]),
case all_same_characters(String, 0) of
all_same ->
io:format(" All characters are the same.~n~n");
{not_all_same, OffendingChar, Offset} ->
io:format(" Not all characters are the same.~n"),
io:format(" Char '~tc' (0x~.16b) at offset ~p differs.~n~n",
[OffendingChar, OffendingChar, Offset])
end.
 
all_same_examples() ->
Strings = ["",
" ",
"2",
"333",
".55",
"tttTTT",
"4444 444k",
"pépé",
"🐶🐶🐺🐶",
"🎄🎄🎄🎄"],
lists:foreach(fun examine_all_same/1, Strings).
</syntaxhighlight>
{{out}}
<pre>
$ erl
Erlang/OTP 23 [erts-11.1.8] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1]
 
Eshell V11.1.8 (abort with ^G)
1> c(string_examples).
{ok,string_examples}
2> string_examples:all_same_examples().
String "" of length 0:
All characters are the same.
 
String " " of length 3:
All characters are the same.
 
String "2" of length 1:
All characters are the same.
 
String "333" of length 3:
All characters are the same.
 
String ".55" of length 3:
Not all characters are the same.
Char '5' (0x35) at offset 1 differs.
 
String "tttTTT" of length 6:
Not all characters are the same.
Char 'T' (0x54) at offset 3 differs.
 
String "4444 444k" of length 9:
Not all characters are the same.
Char ' ' (0x20) at offset 4 differs.
 
String "pépé" of length 4:
Not all characters are the same.
Char 'é' (0xe9) at offset 1 differs.
 
String "🐶🐶🐺🐶" of length 4:
Not all characters are the same.
Char '🐺' (0x1f43a) at offset 2 differs.
 
String "🎄🎄🎄🎄" of length 4:
All characters are the same.
 
ok
</pre>
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
// Determine if a string has all the same characters. Nigel Galloway: June 9th., 2020
let fN n=if String.length n=0 then None else n.ToCharArray()|>Array.tryFindIndex(fun g->g<>n.[0])
 
let allSame n=match fN n with
Some g->printfn "First different character in <<<%s>>> (length %d) is hex %x at position %d" n n.Length (int n.[g]) g
|_->printfn "All Characters are the same in <<<%s>>> (length %d)" n n.Length
 
 
allSame ""
allSame " "
allSame "2"
allSame "333"
allSame ".55"
allSame "tttTTT"
allSame "4444 444k"
</syntaxhighlight>
{{out}}
<pre>
All Characters are the same in <<<>>> (length 0)
All Characters are the same in <<< >>> (length 3)
All Characters are the same in <<<2>>> (length 1)
All Characters are the same in <<<333>>> (length 3)
First different character in <<<.55>>> (length 3) is hex 35 at position 1
First different character in <<<tttTTT>>> (length 6) is hex 54 at position 3
First different character in <<<4444 444k>>> (length 9) is hex 20 at position 4
</pre>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: formatting io kernel math.parser sequences ;
 
: find-diff ( str -- i elt ) dup ?first [ = not ] curry find ;
Line 493 ⟶ 1,319:
"tttTTT"
"4444 444k"
} [ sameness-report. ] each</langsyntaxhighlight>
{{out}}
<pre>
Line 503 ⟶ 1,329:
"tttTTT" — length 6 — contains a different character at index 3: 'T' (0x54)
"4444 444k" — length 9 — contains a different character at index 4: ' ' (0x20)
</pre>
=={{header|Forth}}==
<syntaxhighlight lang="forth">
: samechars? ( str-addr str-len -- )
[char] " emit 2dup type [char] " emit ." length: " dup . ." -> "
dup 1 > if
over c@ swap 1 do
over i + c@ over <> if
." different character '" drop i + c@ dup emit
." ' ($" hex 1 .r ." ) at " decimal i . cr unloop exit
then
loop
then 2drop ." all characters are the same" cr ;
 
s" " samechars?
s" " samechars?
s" 2" samechars?
s" 333" samechars?
s" .55" samechars?
s" tttTTT" samechars?
s" 4444 444k" samechars?
</syntaxhighlight>
{{out}}
<pre>
"" length: 0 -> all characters are the same
" " length: 3 -> all characters are the same
"2" length: 1 -> all characters are the same
"333" length: 3 -> all characters are the same
".55" length: 3 -> different character '5' ($35) at 1
"tttTTT" length: 6 -> different character 'T' ($54) at 3
"4444 444k" length: 9 -> different character ' ' ($20) at 4
</pre>
=={{header|Fortran}}==
Basically, just a simple call to the intrinsic VERIFY() procedure.
Could also have been done with an INDEX() call in this simple case
where the set of characters to match is a single character. A
fancier format statement would eliminate the need for the HEX()
procedure.
<syntaxhighlight lang="fortran">
program demo_verify
implicit none
call homogeneous('')
call homogeneous('2')
call homogeneous('333')
call homogeneous('.55')
call homogeneous('tttTTT')
call homogeneous('4444 444k')
contains
 
subroutine homogeneous(str)
character(len=*),intent(in) :: str
character(len=:),allocatable :: ch
character(len=*),parameter :: g='(*(g0))'
integer :: where
if(len(str)>0)then;ch=str(1:1);else;ch='';endif
where=verify(str,ch)
if(where.eq.0)then
write(*,g)'STR: "',str,'" LEN: ',len(str),'. All chars are a ','"'//ch//'"'
else
write(*,g)'STR: "',str,'" LEN: ',len(str), &
& '. Multiple chars found. First difference at position ',where, &
& ' where a ','"'//str(where:where)//'"(hex:',hex(str(where:where)),') was found.'
write(*,g)repeat(' ',where+5),'^'
endif
end subroutine homogeneous
 
function hex(ch) result(hexstr)
character(len=1),intent(in) :: ch
character(len=:),allocatable :: hexstr
hexstr=repeat(' ',100)
write(hexstr,'(Z0)')ch
hexstr=trim(hexstr)
end function hex
 
end program demo_verify
</syntaxhighlight>
{{out}}
<pre>
STR: "" LEN: 0. All chars are a ""
STR: "2" LEN: 1. All chars are a "2"
STR: "333" LEN: 3. All chars are a "3"
STR: ".55" LEN: 3. Multiple chars found. First difference at position 2 where a "5"(hex:35) was found.
^
STR: "tttTTT" LEN: 6. Multiple chars found. First difference at position 4 where a "T"(hex:54) was found.
^
STR: "4444 444k" LEN: 10. Multiple chars found. First difference at position 5 where a " "(hex:20) was found.
^
</pre>
 
 
 
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">dim as string s, nxt
 
input "Enter string: ", s
 
if len(s)<2 then 'A string with one or zero characters passes by default
print "All characters are the same."
end
end if
 
dim as ubyte i
 
for i = 1 to len(s)-1
nxt = mid(s, i+1, 1)
if mid(s, i, 1)<>nxt then 'if any character differs from the previous one
print "First non-matching char is "+nxt
print "It occurs at position "+str(i+1)
print "Its hex value is "+hex(asc(nxt))
end
end if
next i
 
'otherwise, success!
print "All characters are the same."</syntaxhighlight>
 
{{out}}
<pre>Enter string:
All characters are the same.
 
Enter string:
All characters are the same.
 
Enter string: 2
All characters are the same.
 
Enter string: 333
All characters are the same.
 
Enter string: .55
First non-matching char is 5
It occurs at position 2
Its hex value is 35
 
Enter string: tttTTT
First non-matching char is T
It occurs at position 4
Its hex value is 54
 
Enter string: 4444 444k
First non-matching char is
It occurs at position 5
Its hex value is 20
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 542 ⟶ 1,512:
analyze(s)
}
}</langsyntaxhighlight>
 
{{out}}
Line 581 ⟶ 1,551:
All characters in the string are the same.
</pre>
 
=={{header|Groovy}}==
{{trans|Java}}
<syntaxhighlight lang="groovy">class Main {
static void main(String[] args) {
String[] tests = ["", " ", "2", "333", ".55", "tttTTT", "4444 444k"]
for (String s : tests) {
analyze(s)
}
}
 
static void analyze(String s) {
println("Examining [$s] which has a length of ${s.length()}")
if (s.length() > 1) {
char firstChar = s.charAt(0)
int lastIndex = s.lastIndexOf(firstChar as String)
if (lastIndex != 0) {
println("\tNot all characters in the string are the same.")
println("\t'$firstChar' (0x${Integer.toHexString(firstChar as Integer)}) is different at position $lastIndex")
return
}
}
println("\tAll characters in the string are the same.")
}
}</syntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0
All characters in the string are the same.
Examining [ ] which has a length of 3
Not all characters in the string are the same.
' ' (0x20) is different at position 2
Examining [2] which has a length of 1
All characters in the string are the same.
Examining [333] which has a length of 3
Not all characters in the string are the same.
'3' (0x33) is different at position 2
Examining [.55] which has a length of 3
All characters in the string are the same.
Examining [tttTTT] which has a length of 6
Not all characters in the string are the same.
't' (0x74) is different at position 2
Examining [4444 444k] which has a length of 9
Not all characters in the string are the same.
'4' (0x34) is different at position 7</pre>
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Numeric (showHex)
import Data.List (span)
import Data.Char (ord)
 
inconsistentChar :: StringEq a => [a] -> Maybe (Int, Chara)
inconsistentChar [] = Nothing
inconsistentChar xs@(x:_) =
Line 614 ⟶ 1,628:
c : "' (0x" ++ showHex (ord c) ")" ++ " at char " ++ show (succ n))
(inconsistentChar s)) <$>
samples</langsyntaxhighlight>
 
and inconsistentChar could alternatively be defined in terms of ''findIndex'':
 
<langsyntaxhighlight lang="haskell">import Data.List (findIndex)
 
inconsistentChar :: StringEq a => [a] -> Maybe (Int, Chara)
inconsistentChar [] = Nothing
inconsistentChar xs@(x:_) = findIndex (x /=) xs >>= Just . ((,) <*> (xs !!))</langsyntaxhighlight>
{{Out}}
<pre> ' ' -> consistent
Line 631 ⟶ 1,645:
'4444 444' -> inconsistent ' ' (0x20) at char 5</pre>
 
=={{headerHeader|JInsitux}}==
<lang>
Doc=: 2 : 'u :: (n"_)'
 
{{Trans|Clojure}}
task=: monad define
common=. (; #) y NB. the string and its length
if. same y do.
common , <'same'
else.
i =. differ y
c =. i { y
common , <((, (' (' , ') ' ,~ hex))c),'differs at index ',":i
end.
)
 
With a minor change from the Clojure entry - showing <code>^</code> underneath the first inconsistent character.
hex=: ((Num_j_,26}.Alpha_j_) {~ 16 16 #: a.&i.)&> Doc 'convert ASCII literals to hex representation'
assert '61' -: hex 'a'
 
<syntaxhighlight lang="insitux>
</lang>
(function check-all-chars-same string
(print "String (" string ") of len: " (len string))
(let num-same (count-while (= (0 string)) string))
(return-when (= num-same (len string))
(print "...all characters the same"))
(print (pad-left " " (+ 9 num-same) "^"))
(print "...character " num-same " differs - it is 0x"
(to-base 16 (char-code (num-same string)))))
 
(map check-all-chars-same ["" " " "2" "333" ".55" "tttTTT" "4444 444k"])
</syntaxhighlight>
 
{{out}}
 
<pre>
String () of len: 0
STRINGS=: <;._2'; ;2;333;.55;tttTTT;4444 444k;'
...all characters the same
String ( ) of len: 3
...all characters the same
String (2) of len: 1
...all characters the same
String (333) of len: 3
...all characters the same
String (.55) of len: 3
^
...character 1 differs - it is 0x35
String (tttTTT) of len: 6
^
...character 3 differs - it is 0x54
String (4444 444k) of len: 9
^
...character 4 differs - it is 0x20
</pre>
 
=={{header|J}}==
same=: (2 > #@:~.)Doc'is 1 if the set of characters has less than 2 elements'
assert 1 1 1 1 0 0 0 -: same&>STRINGS
 
In J, <code>#~.y</code> gives a count of the unique items (characters) in y.
 
Here's a relatively differ=:concise ([:and >: [:grammatical) {approach. [:For I.grammatical 2reasons ~:/\we ])Doc'givenreport the differentcount of characters, returnup through the zerodiffering index origincharacter position, ofrather thethan characterits that differs'index:
assert 1 -: differ'abbb'
 
<syntaxhighlight lang="j">require'convert'
task&>STRINGS
task=: {{
+---------+-+-------------------------+
if. 1>:#t=. ~.y do.
| |0|same |
echo 'all ',(":#y),' character(s) same in "',y,'"'
+---------+-+-------------------------+
else.
| |3|same |
j=. ":1+y i. ch=.1{t
+---------+-+-------------------------+
echo '"',ch,'" (hex: ',(hfd 3 u:ch),', character ',j,' of ',(":#y),') differs from previous characters in "',y,'"'
|2 |1|same |
end.
+---------+-+-------------------------+
}}</syntaxhighlight>
|333 |3|same |
 
+---------+-+-------------------------+
And here's the task examples with this approach:
|.55 |3|5 (35) differs at index 1|
 
+---------+-+-------------------------+
<syntaxhighlight lang="j"> task@>'';' ';'2';'333';'.55';'tttTTT';'4444 444k'
|tttTTT |6|T (54) differs at index 3|
all 0 character(s) same in ""
+---------+-+-------------------------+
all 3 character(s) same in " "
|4444 444k|9| (20) differs at index 4|
all 1 character(s) same in "2"
+---------+-+-------------------------+
all 3 character(s) same in "333"
</pre>
"5" (hex: 35, character 2 of 3) differs from previous characters in ".55"
"T" (hex: 54, character 4 of 6) differs from previous characters in "tttTTT"
" " (hex: 20, character 5 of 9) differs from previous characters in "4444 444k"</syntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
<lang Java>public class Main{
import java.util.regex.Matcher;
import java.util.regex.Pattern;
</syntaxhighlight>
<syntaxhighlight lang="java">
public static void main(String[] args) {
String[] strings = {
"", " ", "2", "333", ".55", "tttTTT", "5", "4444 444k"
};
for (String string : strings)
System.out.println(printCompare(string));
}
 
static String printCompare(String string) {
String stringA = "'%s' %d".formatted(string, string.length());
Pattern pattern = Pattern.compile("(.)\\1*");
Matcher matcher = pattern.matcher(string);
StringBuilder stringB = new StringBuilder();
/* 'Matcher' works dynamically, so we'll have to denote a change */
boolean difference = false;
char character;
String newline = System.lineSeparator();
while (matcher.find()) {
if (matcher.start() != 0) {
character = matcher.group(1).charAt(0);
stringB.append(newline);
stringB.append(" Char '%s' (0x%x)".formatted(character, (int) character));
stringB.append(" @ index %d".formatted(matcher.start()));
difference = true;
}
}
if (!difference)
stringB.append(newline).append(" All characters are the same");
return stringA + stringB;
}
</syntaxhighlight>
<pre>
'' 0
All characters are the same
' ' 3
All characters are the same
'2' 1
All characters are the same
'333' 3
All characters are the same
'.55' 3
Char '5' (0x35) @ index 1
'tttTTT' 6
Char 'T' (0x54) @ index 3
'5' 1
All characters are the same
'4444 444k' 9
Char ' ' (0x20) @ index 4
Char '4' (0x34) @ index 5
Char 'k' (0x6b) @ index 8
</pre>
<br />
Alternate implementations
<syntaxhighlight lang="java">public class Main{
public static void main(String[] args){
String[] tests = {"", " ", "2", "333", ".55", "tttTTT", "4444 444k"};
Line 700 ⟶ 1,792:
System.out.println("\tAll characters in the string are the same.");
}
}</langsyntaxhighlight>
{{out}}
 
Line 723 ⟶ 1,815:
'4' (0x34) is different at position 7
</pre>
 
===Using Java 8===
<syntaxhighlight lang="java">
import java.util.OptionalInt;
 
public final class AllSameCharacters {
 
public static void main(String[] aArgs) {
String[] words = { "", " ", "2", "333", ".55", "tttTTT", "4444 444k" };
for ( String word : words ) {
analyse(word);
}
}
private static void analyse(String aText) {
System.out.println("Examining \"" + aText + "\", which has length " + aText.length() + ":");
 
OptionalInt mismatch = aText.chars().filter( ch -> ch != aText.charAt(0) ).findFirst();
if ( mismatch.isPresent() ) {
char fault = (char) mismatch.getAsInt();
System.out.println(" Not all characters in the string are the same.");
System.out.println(" Character \"" + fault + "\" (" + Integer.toHexString((char) fault)
+ ") is different at index " + aText.indexOf(fault));
} else {
System.out.println(" All characters in the string are the same.");
}
}
 
}
</syntaxhighlight>
{{ out }}
<pre>
Examining "", which has length 0:
All characters in the string are the same.
Examining " ", which has length 3:
All characters in the string are the same.
Examining "2", which has length 1:
All characters in the string are the same.
Examining "333", which has length 3:
All characters in the string are the same.
Examining ".55", which has length 3:
Not all characters in the string are the same.
Character "5" (35) is different at index 1
Examining "tttTTT", which has length 6:
Not all characters in the string are the same.
Character "T" (54) is different at index 3
Examining "4444 444k", which has length 9:
Not all characters in the string are the same.
Character " " (20) is different at index 4
</pre>
 
=={{header|JavaScript}}==
<syntaxhighlight lang="javascript">const check = s => {
const arr = [...s];
const at = arr.findIndex(
(v, i) => i === 0 ? false : v !== arr[i - 1]
)
const l = arr.length;
const ok = at === -1;
const p = ok ? "" : at + 1;
const v = ok ? "" : arr[at];
const vs = v === "" ? v : `"${v}"`
const h = ok ? "" : `0x${v.codePointAt(0).toString(16)}`;
console.log(`"${s}" => Length:${l}\tSame:${ok}\tPos:${p}\tChar:${vs}\tHex:${h}`)
}
 
['', ' ', '2', '333', '.55', 'tttTTT', '4444 444k', '🐶🐶🐺🐶', '🎄🎄🎄🎄'].forEach(check)</syntaxhighlight>
{{out}}<pre>
"" => Length:0 Same:true Pos: Char: Hex:
" " => Length:3 Same:true Pos: Char: Hex:
"2" => Length:1 Same:true Pos: Char: Hex:
"333" => Length:3 Same:true Pos: Char: Hex:
".55" => Length:3 Same:false Pos:2 Char:"5" Hex:0x35
"tttTTT" => Length:6 Same:false Pos:4 Char:"T" Hex:0x54
"4444 444k" => Length:9 Same:false Pos:5 Char:" " Hex:0x20
"🐶🐶🐺🐶" => Length:4 Same:false Pos:3 Char:"🐺" Hex:0x1f43a
"🎄🎄🎄🎄" => Length:4 Same:true Pos: Char: Hex:
</pre>
 
 
Alternatively, emphasising the composition of generic and reusable (pure value returning) library functions, and remaining agnostic about console.log (which is not part of JavaScript itself – doesn't feature in the ECMAScript standard – and is not available in all JS contexts).
 
<syntaxhighlight lang="javascript">(() => {
'use strict';
// ---------- FIRST INCONSISTENT CHARACTER -----------
// inconsistentChar :: String -> Maybe (Char, Int)
const inconsistentChar = s =>
// Just the first inconsistent character in a
// string, paired with the index of its position,
// or Nothing if all of the characters in a string
// are the same.
2 > s.length ? (
Nothing()
) : (() => {
const [h, ...t] = s;
const i = t.findIndex(c => h !== c);
return -1 !== i ? (
Just([t[i], 1 + i])
) : Nothing();
})();
// ---------------------- TEST -----------------------
// main :: IO ()
const main = () =>
fTable(
'First inconsistent character:\n'
)(
s => `${quoted("'")(s)} (${[...s].length} chars)`
)(
maybe('None')(pair => {
const c = pair[0];
return `${quoted("'")(c)} at index ` + (
`${pair[1]} (${showHex(ord(c))})`
);
})
)(
inconsistentChar
)([
'', ' ', '2', '333', '.55',
'tttTTT', '4444 444k',
'🐶🐶🐺🐶', '🎄🎄🎄🎄'
]);
// ----------- REUSABLE GENERIC FUNCTIONS ------------
// Just :: a -> Maybe a
const Just = x => ({
type: 'Maybe',
Nothing: false,
Just: x
});
// Nothing :: Maybe a
const Nothing = () => ({
type: 'Maybe',
Nothing: true,
});
// fTable :: String -> (a -> String) ->
// (b -> String) -> (a -> b) -> [a] -> String
const fTable = s =>
// Heading -> x display function ->
// fx display function ->
// f -> values -> tabular string
xShow => fxShow => f => xs => {
const
ys = xs.map(xShow),
w = Math.max(...ys.map(length));
return s + '\n' + zipWith(
a => b => a.padStart(w, ' ') + ' -> ' + b
)(ys)(
xs.map(x => fxShow(f(x)))
).join('\n');
};
// maybe :: b -> (a -> b) -> Maybe a -> b
const maybe = v =>
// Default value (v) if m is Nothing, or f(m.Just)
f => m => m.Nothing ? (
v
) : f(m.Just);
// showHex :: Int -> String
const showHex = n =>
// Hexadecimal string for a given integer.
'0x' + n.toString(16);
// length :: [a] -> Int
const length = xs =>
// Returns Infinity over objects without finite
// length. This enables zip and zipWith to choose
// the shorter argument when one is non-finite,
// like cycle, repeat etc
'GeneratorFunction' !== xs.constructor
.constructor.name ? (
xs.length
) : Infinity;
// list :: StringOrArrayLike b => b -> [a]
const list = xs =>
// xs itself, if it is an Array,
// or an Array derived from xs.
Array.isArray(xs) ? (
xs
) : Array.from(xs || []);
// ord :: Char -> Int
const ord = c =>
// Unicode ordinal value of the character.
c.codePointAt(0);
// quoted :: Char -> String -> String
const quoted = c =>
// A string flanked on both sides
// by a specified quote character.
s => c + s + c;
// take :: Int -> [a] -> [a]
// take :: Int -> String -> String
const take = n =>
// The first n elements of a list,
// string of characters, or stream.
xs => 'GeneratorFunction' !== xs
.constructor.constructor.name ? (
xs.slice(0, n)
) : [].concat.apply([], Array.from({
length: n
}, () => {
const x = xs.next();
return x.done ? [] : [x.value];
}));
// zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
const zipWith = f =>
// A map of f over each stepwise pair in
// xs and ys, up to the length of the shorter
// of those lists.
xs => ys => {
const
n = Math.min(length(xs), length(ys)),
vs = take(n)(list(ys));
return take(n)(list(xs))
.map((x, i) => f(x)(vs[i]));
};
// MAIN ---
return main()
})();</syntaxhighlight>
{{Out}}
<pre>First inconsistent character:
 
'' (0 chars) -> None
' ' (3 chars) -> None
'2' (1 chars) -> None
'333' (3 chars) -> None
'.55' (3 chars) -> '5' at index 1 (0x35)
'tttTTT' (6 chars) -> 'T' at index 3 (0x54)
'4444 444k' (9 chars) -> ' ' at index 4 (0x20)
'🐶🐶🐺🐶' (4 chars) -> '🐺' at index 2 (0x1f43a)
'🎄🎄🎄🎄' (4 chars) -> None</pre>
 
=={{header|jq}}==
jq's "index origin" is 0.
The hexadecimal encodings can be computed using the jq code at
[[Non-decimal_radices/Convert#jq]].
 
 
<syntaxhighlight lang="sh">jq -rn '
 
def firstdifferent:
label $out
| foreach explode[] as $i ({index:-1};
.prev = .i | .i = $i | .index +=1;
if .prev and $i != .prev then .index, break $out else empty end)
// null ;
def lpad($n): " "*($n-length) + "\"\(.)\"" ;
[" "*10, "length", "same", "index", "char"],
(inputs
| firstdifferent as $d
| [lpad(10), length, ($d == null)] + (if $d then [$d, .[$d:$d+1]] else null end) )
| @tsv
'</syntaxhighlight>
{{out}}
Using as input the (JSON) strings shown in the first column of the output as shown below, the output is:
<syntaxhighlight lang="sh">
length same index char
"" 0 true
" " 3 true
"2" 1 true
"333" 3 true
".55" 3 false 1 5
"tttTTT" 6 false 3 T
"4444 444k" 9 false 4
"🐶🐶🐺🐶" 4 false 2 🐺
"🎄🎄🎄🎄" 4 true</syntaxhighlight>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">firstdifferent(s) = isempty(s) ? nothing : findfirst(x -> x != s[1], s)
 
function testfunction(strings)
Line 749 ⟶ 2,133:
"🎄🎄🎄🎄",
])
</langsyntaxhighlight>{{out}}
<pre>
String | Length | All Same | First Different(Hex) | Position
Line 767 ⟶ 2,151:
=={{header|Kotlin}}==
{{trans|Go}}
<langsyntaxhighlight lang="scala">fun analyze(s: String) {
println("Examining [$s] which has a length of ${s.length}:")
if (s.length > 1) {
Line 787 ⟶ 2,171:
analyze(str)
}
}</langsyntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0:
Line 808 ⟶ 2,192:
 
=={{header|Lambdatalk}}==
<langsyntaxhighlight lang="scheme">
{def firstDifferingChar
{def firstDifferingChar.r
Line 831 ⟶ 2,215:
{firstDifferingChar tttTTT}
-> at position 3 t becomes T
</syntaxhighlight>
</lang>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function analyze(s)
print(string.format("Examining [%s] which has a length of %d:", s, string.len(s)))
if string.len(s) > 1 then
Line 860 ⟶ 2,244:
end
 
main()</langsyntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0:
Line 879 ⟶ 2,263:
Not all characters in the string are the same.
' ' (0x20) is different at position 4</pre>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">CheckSame:=proc(s)
local i, index;
printf("input: \"%s\", length: %a\n", s, StringTools:-Length(s));
for i from 2 to StringTools:-Length(s) do
if (s[i - 1] <> s[i]) then
printf("The given string has different characters.\n");
printf("The first different character is %a (0x%x) which appears at index %a.\n\n",
s[i], convert(s[i], 'bytes')[1], i);
return;
end if;
end do;
# if no difference found
printf("The given string has all same characters.\n\n");
end proc:
 
# Test
CheckSame("");
CheckSame(" ");
CheckSame("2");
CheckSame("333");
CheckSame(".55");
CheckSame("tttTTT");
CheckSame("4444 444k");</syntaxhighlight>
{{out}}
<pre>
input: "", length: 0
The given string has all same characters.
 
input: " ", length: 3
The given string has all same characters.
 
input: "2", length: 1
The given string has all same characters.
 
input: "333", length: 3
The given string has all same characters.
 
input: ".55", length: 3
The given string has different characters.
The first different character is "5" (0x35) which appears at index 2.
 
input: "tttTTT", length: 6
The given string has different characters.
The first different character is "T" (0x54) which appears at index 4.
 
input: "4444 444k", length: 9
The given string has different characters.
The first different character is " " (0x20) which appears at index 5.
 
</pre>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">ClearAll[AllSameCharacters]
AllSameCharacters[s_String] := Module[{c = Characters[s], i = 0, tf},
If[Length[c] > 1,
tf = AllTrue[Rest[c], (i++; # == First[c]) &];
If[tf,
Print["input = \"", s, "\", Length = ", StringLength[s],
", All the same!"]
,
Print["input = \"", s, "\", Length = ", StringLength[s],
", Character " <> ToString[i + 1] <>
" is different from character " <> ToString[i], ", hex = ",
IntegerString[First@ToCharacterCode[c[[i + 1]]], 16]]
]
,
Print["input = \"", s, "\", Length = ", StringLength[s],
", All the same!"]
];
]
AllSameCharacters[""]
AllSameCharacters[" "]
AllSameCharacters["2"]
AllSameCharacters["333"]
AllSameCharacters[".55"]
AllSameCharacters["tttTTT"]
AllSameCharacters["4444 444k"]</syntaxhighlight>
{{out}}
<pre>input = "", Length = 0, All the same!
input = " ", Length = 3, All the same!
input = "2", Length = 1, All the same!
input = "333", Length = 3, All the same!
input = ".55", Length = 3, Character 2 is different from character 1, hex = 35
input = "tttTTT", Length = 6, Character 4 is different from character 3, hex = 54
input = "4444 444k", Length = 9, Character 5 is different from character 4, hex = 20</pre>
 
=={{header|Nanoquery}}==
{{trans|Java}}
<langsyntaxhighlight lang="nanoquery">def analyze(s)
s = str(s)
println "Examining [" + s + "] which has a length of " + str(len(s)) + ":"
Line 906 ⟶ 2,377:
for s in tests
analyze(s)
end</langsyntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0:
Line 925 ⟶ 2,396:
Not all characters in the string are the same.
' ' (0x20) is different at position 4</pre>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import strformat
 
proc analyze(str: string) =
if str.len() > 1:
var first = str[0]
for i, c in str:
if c != first:
echo "'", str, "': [len: ", str.len(), "] not all characters are the same. starts to differ at index ",
i, ": '", first, "' != '", c, "' [", fmt"{ord(c):#x}", "]"
return
echo "'", str, "': [len: ", str.len(), "] all characters are the same"
 
var strings = @["", " ", "2", "333", ".55", "tttTTT", "4444 444k"]
for str in strings:
analyze(str)</syntaxhighlight>
{{out}}
<pre>'': [len: 0] all characters are the same
' ': [len: 3] all characters are the same
'2': [len: 1] all characters are the same
'333': [len: 3] all characters are the same
'.55': [len: 3] not all characters are the same. starts to differ at index 1: '.' != '5' [0x35]
'tttTTT': [len: 6] not all characters are the same. starts to differ at index 3: 't' != 'T' [0x54]
'4444 444k': [len: 9] not all characters are the same. starts to differ at index 4: '4' != ' ' [0x20]</pre>
 
 
=={{header|OCaml}}==
Original version by [http://rosettacode.org/wiki/User:Vanyamil User:Vanyamil]
<syntaxhighlight lang="ocaml">
(* Task: Determine if a string has all the same characters *)
 
(* Create a function that determines whether all characters in a string are identical,
or returns the index of first different character.
 
Using the option type here to combine the functionality.
*)
let str_first_diff_char (s : string) : int option =
let len = String.length s in
if len = 0
then None
else
let first = s.[0] in
let rec helper idx =
if idx >= len
then None
else if s.[idx] = first
then helper (idx + 1)
else Some idx
in
helper 1
;;
 
(* Task display: using format of Ada
Example:
 
Input = "333", length = 3
All characters are the same.
Input = ".55", length = 3
First difference at position 2, character = '5', hex = 16#35#
*)
 
let format_answer s =
let first_line = "Input = \"" ^ s ^ "\", length = " ^ (s |> String.length |> string_of_int) in
let second_line = match str_first_diff_char s with
| None -> " All characters are the same."
| Some idx -> Printf.sprintf " First difference at position %d, character = %C, hex = %#x" (idx+1) s.[idx] (Char.code s.[idx])
in
print_endline first_line; print_endline second_line
;;
 
let _ =
[""; " "; "2"; "333"; ".55"; "tttTTT"; "4444 444k"]
|> List.iter format_answer
;;
</syntaxhighlight>
{{out}}
<pre>
Input = "", length = 0
All characters are the same.
Input = " ", length = 3
All characters are the same.
Input = "2", length = 1
All characters are the same.
Input = "333", length = 3
All characters are the same.
Input = ".55", length = 3
First difference at position 2, character = '5', hex = 0x35
Input = "tttTTT", length = 6
First difference at position 4, character = 'T', hex = 0x54
Input = "4444 444k", length = 9
First difference at position 5, character = ' ', hex = 0x20
</pre>
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program SameNessOfChar;
{$IFDEF FPC}
{$MODE DELPHI}{$OPTIMIZATION ON,ALL}{$CODEALIGN proc=16}{$ALIGN 16}
Line 971 ⟶ 2,535:
For i := Low(TestData) to HIgh(TestData) do
OutIsAllSame(TestData[i]);
end.</langsyntaxhighlight>{{out}}
<pre>
"" of length 0 contains all the same character
Line 983 ⟶ 2,547:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 1,019 ⟶ 2,583:
say 'the same character in all positions.'
}
}</langsyntaxhighlight>
{{out}}
<pre>"" (length: 0) has the same character in all positions.
Line 1,052 ⟶ 2,616:
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>procedure samechar(sequence s)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
string msg = "all characters are the same"
<span style="color: #008080;">procedure</span> <span style="color: #000000;">samechar</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
integer l = length(s)
<span style="color: #004080;">string</span> <span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"all characters are the same"</span>
if l>=2 then
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
integer ch = s[1]
<span style="color: #008080;">if</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
for i=2 to l do
<span style="color: #004080;">integer</span> <span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
integer si = s[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
if si!=ch then
<span style="color: #004080;">integer</span> <span style="color: #000000;">si</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
msg = sprintf(`first different character "%c"(#%02x) at position %d`,{si,si,i})
<span style="color: #008080;">if</span> <span style="color: #000000;">si</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">ch</span> <span style="color: #008080;">then</span>
exit
<span style="color: #004080;">string</span> <span style="color: #000000;">su</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">utf32_to_utf8</span><span style="color: #0000FF;">({</span><span style="color: #000000;">si</span><span style="color: #0000FF;">})</span>
end if
<span style="color: #000000;">msg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">`first different character "%s"(#%02x) at position %d`</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">su</span><span style="color: #0000FF;">,</span><span style="color: #000000;">si</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">})</span>
end for
<span style="color: #008080;">exit</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
printf(1,"\"%s\" (length %d): %s\n",{s,l,msg})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
 
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\"%s\" (length %d): %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">utf32_to_utf8</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">})</span>
constant tests = {""," ","2","333",".55","tttTTT","4444 444k",
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
utf8_to_utf32("🐶🐶🐺🐶"),utf8_to_utf32("🎄🎄🎄🎄")}
for i=1 to length(tests) do samechar(tests[i]) end for</lang>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"2"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"333"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">".55"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"tttTTT"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"4444 444k"</span><span style="color: #0000FF;">,</span>
<span style="color: #7060A8;">utf8_to_utf32</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"🐶🐶🐺🐶"</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">utf8_to_utf32</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"🎄🎄🎄🎄"</span><span style="color: #0000FF;">)}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> <span style="color: #000000;">samechar</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,083 ⟶ 2,651:
"🎄🎄🎄🎄" (length 4): all characters are the same
</pre>
As usual, the last two lines don't come out very nice on a Windows console.
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de equal? (Str)
(let (Lst (chop Str) C (car Lst) P 2 F)
(prin Str ": ")
Line 1,096 ⟶ 2,665:
(equal? "333")
(equal? ".55")
(equal? "tttTTT")</langsyntaxhighlight>
{{out}}
<pre>
Line 1,104 ⟶ 2,673:
.55: First different character 5 at position: 2
tttTTT: First different character T at position: 4
</pre>
 
=={{header|Plain English}}==
<syntaxhighlight lang="plainenglish">To run:
Start up.
Show the uniformity of "".
Show the uniformity of " ".
Show the uniformity of "2".
Show the uniformity of "333".
Show the uniformity of ".55".
Show the uniformity of "tttTTT".
Show the uniformity of "4444 444k".
Wait for the escape key.
Shut down.
 
To find the first different character in a string giving a byte and a count:
If the string is blank, put -1 into the count; exit.
Put the string's first's target into a first letter.
Slap a substring on the string.
Loop.
If a counter is past the string's length, put -1 into the count; exit.
Put the substring's first's target into a letter.
If the letter is not the first letter, put the letter into the byte; put the counter minus 1 into the count; exit.
Add 1 to the substring's first.
Repeat.
 
To show the uniformity of a string:
Write """" then the string then """ (length " then the string's length then ") " on the console without advancing.
Find the first different character in the string giving a byte and a count.
If the count is -1, write "contains all the same character." on the console; exit.
Convert the byte to a nibble string.
Write "contains a different character at index " then the count then ": '" then the byte then "' (0x" then the nibble string then ")." on the console.</syntaxhighlight>
{{out}}
<pre>
"" (length 0) contains all the same character.
" " (length 3) contains all the same character.
"2" (length 1) contains all the same character.
"333" (length 3) contains all the same character.
".55" (length 3) contains a different character at index 1: '5' (0x35).
"tttTTT" (length 6) contains a different character at index 3: 'T' (0x54).
"4444 444k" (length 9) contains a different character at index 4: ' ' (0x20).
</pre>
 
=={{header|Prolog}}==
 
{{works with|SWI-Prolog|7}}
 
<syntaxhighlight lang="prolog">
:- system:set_prolog_flag(double_quotes,chars) .
 
main
:-
same_or_different("") ,
same_or_different(" ") ,
same_or_different("2") ,
same_or_different("333") ,
same_or_different(".55") ,
same_or_different("tttTTT") ,
same_or_different("4444 444k")
.
 
%! same_or_different(INPUTz0)
 
same_or_different(INPUTz0)
:-
system:format('input string is "~s" .~n',[INPUTz0]) ,
examine(INPUTz0)
.
 
%! examine(INPUTz0)
 
examine([])
:-
! ,
system:format('all the same characters .~n',[])
.
 
examine([COMPARE0|INPUTz0])
:-
examine(INPUTz0,COMPARE0,2,_INDEX_)
.
 
%! examine(INPUTz0,COMPARE0,INDEX0,INDEX)
 
examine([],_COMPARE0_,INDEX0,INDEX0)
:-
! ,
system:format('all the same characters .~n',[])
.
 
examine([COMPARE0|INPUTz0],COMPARE0,INDEX0,INDEX)
:-
! ,
INDEX1 is INDEX0 + 1 ,
examine(INPUTz0,COMPARE0,INDEX1,INDEX)
.
 
examine([DIFFERENT0|_INPUTz0_],COMPARE0,INDEX0,INDEX0)
:-
prolog:char_code(DIFFERENT0,DIFFERENT_CODE) ,
system:format('character "~s" (hex ~16r) different than "~s" at 1-based index ~10r .~n',[[DIFFERENT0],DIFFERENT_CODE,[COMPARE0],INDEX0])
.
 
</syntaxhighlight>
 
{{out}}
<pre>
/*
?- main .
input string is "" .
all the same characters .
input string is " " .
all the same characters .
input string is "2" .
all the same characters .
input string is "333" .
all the same characters .
input string is ".55" .
character "5" (hex 35) different than "." at 1-based index 2 .
input string is "tttTTT" .
character "T" (hex 54) different than "t" at 1-based index 4 .
input string is "4444 444k" .
character " " (hex 20) different than "4" at 1-based index 5 .
true.
 
?-
*/
</pre>
 
Line 1,115 ⟶ 2,811:
 
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Determine if a string has all the same characters'''
 
from itertools import groupby
Line 1,214 ⟶ 2,910:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>First, if any, points of difference:
Line 1,229 ⟶ 2,925:
and for very long strings, ''itertools.takewhile'' (here used in the definition of a more general '''span''' function), should be slightly more efficient:
 
<langsyntaxhighlight lang="python">'''Determine if a string has all the same characters'''
 
from itertools import takewhile
Line 1,319 ⟶ 3,015:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
 
Putting itertools aside, we could equivalently define ''inconsistentChar'' as:
 
<langsyntaxhighlight lang="python"># inconsistentChar :: String -> Maybe (Int, Char)
def inconsistentChar(s):
'''Just the first inconsistent character and its index,
Line 1,331 ⟶ 3,027:
(Just(ix) for ix in enumerate(s) if s[0] != ix[1]),
Nothing()
)</langsyntaxhighlight>
{{Out}}
<pre>Consistency tests of seven strings:
Line 1,342 ⟶ 3,038:
'tttTTT' -> inconsistent 'T' (0x54) at char 4
'4444 444' -> inconsistent ' ' (0x20) at char 5</pre>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery">
[ 0 swap
dup size 0 = iff
drop done
behead swap witheach
[ over != if
[ drop i^ 1+
swap conclude ] ]
drop ] is allsame ( [ --> n )
 
( 0 indicates all items are the same,
otherwise n is first different item )
 
[ say ' String: "' dup echo$
say '" length ' dup size echo
dup allsame dup 0 = iff
[ say ', all characters are the same.'
2drop ]
else
[ say ', first difference is item '
dup echo
say ', char "'
peek dup emit
say '", hex: '
16 base put echo base release
say '.' ]
cr ] is task ( $ --> )
 
$ "" task
$ " " task
$ "2" task
$ ".55" task
$ "tttTTT" task
$ "4444 444k" task</syntaxhighlight>
 
{{out}}
 
<pre> String: "" length 0, all characters are the same.
String: " " length 3, all characters are the same.
String: "2" length 1, all characters are the same.
String: ".55" length 3, first difference is item 1, char "5", hex: 35.
String: "tttTTT" length 6, first difference is item 3, char "T", hex: 54.
String: "4444 444k" length 9, first difference is item 4, char " ", hex: 20.
</pre>
 
=={{header|R}}==
<syntaxhighlight lang="rsplus">isAllSame <- function(string)
{
strLength <- nchar(string)
if(length(strLength) > 1)
{
#R has a distinction between the length of a string and that of a character vector. It is a common source
#of problems when coming from another language. We will try to avoid the topic here.
#For our purposes, let us only say that there is a good reason why we have made
#isAllSame(c("foo", "bar") immediately throw an error.
stop("This task is intended for character vectors with lengths of at most 1.")
}
else if(length(strLength) == 0)
{
cat("Examining a character vector of length 0.\n")
TRUE
}
else if(strLength == 0)
{
cat("Examining a character vector of length 1, containing an empty string.\n")
TRUE
}
else
{
cat("Examining the string", paste0(sQuote(string), ","),
"which is of length", paste0(strLength, ":"), "\n")
#strsplit outputs a list. Its first element is the vector of characters that we desire.
characters <- strsplit(string, "")[[1]]
#Our use of match is using R's vector recycling rules. Every element is being checked
#against the first.
differentElementIndex <- match(FALSE, characters[1] == characters, nomatch = 0)
if(differentElementIndex == 0)
{
cat("It has no duplicates.\n")
TRUE
}
else
{
cat("It has duplicates. ")
firstDifferentCharacter <- characters[differentElementIndex]
cat(sQuote(firstDifferentCharacter), "is the first different character. It has hex value",
sprintf("0x%X", as.integer(charToRaw(firstDifferentCharacter))),
"and is at index", paste0(differentElementIndex, "."), "\n")
FALSE
}
}
}
 
#Tests:
cat("Test: A string of length 0 (an empty string):\n")
cat("Test 1 of 2: An empty character vector:\n")
print(isAllSame(character(0)))
cat("Test 2 of 2: A character vector containing the empty string:\n")
print(isAllSame(""))
cat("Test: A string of length 3 which contains three blanks:\n")
print(isAllSame(" "))
cat("Test: A string of length 1 which contains 2:\n")
print(isAllSame("2"))
cat("Test: A string of length 3 which contains 333:\n")
print(isAllSame("333"))
cat("Test: A string of length 3 which contains .55:\n")
print(isAllSame(".55"))
cat("Test: A string of length 6 which contains tttTTT:\n")
print(isAllSame("tttTTT"))
cat("Test: A string of length 9 which contains 4444 444k:\n")
print(isAllSame("4444 444k"))</syntaxhighlight>
{{out}}
<pre>Test: A string of length 0 (an empty string):
Test 1 of 2: An empty character vector:
Examining a character vector of length 0.
[1] TRUE
Test 2 of 2: A character vector containing the empty string:
Examining a character vector of length 1, containing an empty string.
[1] TRUE
Test: A string of length 3 which contains three blanks:
Examining the string ‘ ’, which is of length 3:
It has no duplicates.
[1] TRUE
Test: A string of length 1 which contains 2:
Examining the string ‘2’, which is of length 1:
It has no duplicates.
[1] TRUE
Test: A string of length 3 which contains 333:
Examining the string ‘333’, which is of length 3:
It has no duplicates.
[1] TRUE
Test: A string of length 3 which contains .55:
Examining the string ‘.55’, which is of length 3:
It has duplicates. ‘5’ is the first different character. It has hex value 0x35 and is at index 2.
[1] FALSE
Test: A string of length 6 which contains tttTTT:
Examining the string ‘tttTTT’, which is of length 6:
It has duplicates. ‘T’ is the first different character. It has hex value 0x54 and is at index 4.
[1] FALSE
Test: A string of length 9 which contains 4444 444k:
Examining the string ‘4444 444k’, which is of length 9:
It has duplicates. ‘ ’ is the first different character. It has hex value 0x20 and is at index 5.
[1] FALSE</pre>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">#lang racket
 
(define (first-non-matching-index l =)
Line 1,360 ⟶ 3,202:
 
(module+ test
(for-each report-string-sameness '("" " " "2" "333" ".55" "tttTTT" "4444 444k")))</langsyntaxhighlight>
 
{{out}}
Line 1,373 ⟶ 3,215:
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|20192020.0708.1}}
The last string demonstrates how Raku can recognize that glyphs made up of different combinations of combining characters can compare the same. It is built up from explicit codepoints to show that each of the glyphs is made up of different combinations.
 
<syntaxhighlight lang="raku" perl6line> -> $str {
my $i = 0;
print "\n{$str.perlraku} (length: {$str.chars}), has ";
my %m;
%m{$_}.push: ++$i for $str.comb;
Line 1,401 ⟶ 3,243:
"\c[LATIN CAPITAL LETTER A WITH DIAERESIS]\c[COMBINING MACRON]" ~
"\c[LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]",
'AАΑꓮ𐌀𐊠Ꭺ'</langsyntaxhighlight>
{{out}}
<pre>"" (length: 0), has the same character in all positions.
Line 1,438 ⟶ 3,280:
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program verifies that all characters in a string are all the same (character). */
@chr= ' [character' /* define a literal used for SAY.*/
@all= 'all the same character for string (length' /* " " " " " " */
Line 1,465 ⟶ 3,307:
if y=='' then return 0 /*if Y is null, then return 0 (zero)*/
return verify(y, left(y,1) ) /*All chars the same? Return 0 (zero)*/
/* else return location*/</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default inputs:}}
<pre>
Line 1,475 ⟶ 3,317:
not all the same character for string (length 6): tttTTT [character T ('54'x) at position 4].
not all the same character for string (length 9): 4444 444K [character ('20'x) at position 5].
</pre>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
nputStr = [""," ","2","333",".55","tttTTT","4444 444k"]
 
for word in inputStr
for x = 1 to len(word)
for y = x + 1 to len(word)
if word[x] != word[y]
char = word[y]
? "Input = " + "'" + word + "'" + ", length = " + len(word)
? " First difference at position " + y + ", character = " + "'" + char + "'"
loop 3
ok
next
next
 
? "Input = " + "'" + word + "'" + ", length = " + len(word)
? " All characters are the same."
next
</syntaxhighlight>
{{out}}
<pre>
Input = '', length = 0
All characters are the same.
Input = ' ', length = 3
All characters are the same.
Input = '2', length = 1
All characters are the same.
Input = '333', length = 3
All characters are the same.
Input = '.55', length = 3
First difference at position 2, character = '5'
Input = 'tttTTT', length = 6
First difference at position 4, character = 'T'
Input = '4444 444k', length = 9
First difference at position 5, character = ' '
</pre>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
<syntaxhighlight lang="RPL">
≪ DUP SIZE → s n
≪ "Examining [" s + "], length=" + n →STR + +
1 CF
IF n THEN
s 1 1 SUB 1
DO
s OVER DUP SUB
IF 3 PICK OVER ≠ THEN
1 SF
ROT DROP SWAP
ELSE DROP
END
1 +
UNTIL DUP n ≥ 1 FS? OR END
DROP
ELSE DUP
END
IF 1 FC? THEN
DROP
"All chars are the same."
ELSE
"'" OVER +
"' (hex=" + OVER NUM HEX R→B →STR +
") is different at pos " + s 4 ROLL POS →STR +
END
'ALLSAME?' STO
≪ { "" " " "2" "333" ".55" "tttTTT" "4444 444k" }
→ tl ≪
1 tl SIZE FOR j
tl j GET ALLSAME?
NEXT
EVAL
</syntaxhighlight>
{{out}}
<pre>
14:"Examining [], length=0"
13:"All chars are the same"
12:"Examining [ ], length=3"
11:"All chars are the same"
10:"Examining [2], length=1"
9:"All chars are the same"
8:"Examining [333], length=3"
7:"All chars are the same"
6:"Examining [.55], length=3"
5:"'5' (hex=# 35h) is different at pos 2"
4:"Examining [tttTTT], length=6"
3:"'T' (hex=# 54h) is different at pos 4"
2:"Examining [4444 4444k], length=9"
1:"' ' (hex=# 20h) is different at pos 5"
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">strings = ["", " ", "2", "333", ".55", "tttTTT", "4444 444k", "pépé", "🐶🐶🐺🐶", "🎄🎄🎄🎄"]
 
strings.each do |str|
Line 1,485 ⟶ 3,423:
puts pos ? "first different char #{str[pos].inspect} (#{'%#x' % str[pos].ord}) at position #{pos}." : "all the same."
end
</syntaxhighlight>
</lang>
{{out}}
<pre>"" (size 0): all the same.
Line 1,500 ⟶ 3,438:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">fn test_string(input: &str) {
println!("Checking string {:?} of length {}:", input, input.chars().count());
 
Line 1,526 ⟶ 3,464:
test_string(string);
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,554 ⟶ 3,492:
Checking string "🎄🎄🎄🎄" of length 4:
All characters in the string are the same
</pre>
 
=={{header|S-BASIC}}==
<syntaxhighlight lang = "BASIC">
comment
Return 0 if all the characters in s are the same
(including the special case of an empty string),
otherwise the first position where a character
differs from the preceeding one(s)
end
function samechars(s = string) = integer
var i, slen, result = integer
slen = len(s)
i = 1
while i < slen and mid(s,i,1) = mid(s,i+1,1) do
i = i+1
if i = slen or slen = 0 then
result = 0
else
result = i+1
end = result
 
procedure report(str = string)
var p = integer
print "Test string "; chr(34); str; chr(34); \
" has length ="; len(str)
p = samechars(str)
if p = 0 then
print "The characters are all the same"
else
print "Characters differ starting at position";p;" ('"; \
mid(str,p,1);"'=";right$(hex$(asc(mid(str,p,1))),2);"h)"
print
end
 
rem - apply to the test cases
 
report ""
report " "
report "2"
report "333"
report ".55"
report "tttTTT"
report "4444 444k"
 
end
</syntaxhighlight>
{{out}}
<pre>
Test string "" has length = 0
The characters are all the same
 
Test string " " has length = 0
The characters are all the same
 
Test string "2" has length = 1
The characters are all the same
 
Test string "333" has length = 3
The characters are all the same
 
Test string ".55" has length = 3
Characters differ starting at position 2 ('5'=35h)
 
Test string "tttTTT" has length = 6
Characters differ starting at position 4 ('T'=54h)
 
Test string "4444 444k" has length = 9
Characters differ starting at position 5 (' '=20h)
</pre>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">import scala.collection.immutable.ListMap
 
object StringAllSameCharacters {
Line 1,607 ⟶ 3,614:
}
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,620 ⟶ 3,627:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func analyze_string(str) {
var chars = str.chars
chars.range.to_a.each_cons(2, {|a,b|
Line 1,640 ⟶ 3,647:
say "first different char '#{str[idx]}' (#{'%#x' % str[idx].ord}) at position #{idx}."
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,653 ⟶ 3,660:
'🐶🐶🐺🐶' (size 4): first different char '🐺' (0x1f43a) at position 2.
'🎄🎄🎄🎄' (size 4): all the same.
</pre>
 
=={{header|SQL}}==
{{works with|ORACLE 19c}}
This is not a particularly efficient solution, but it gets the job done.
 
<syntaxhighlight lang="sql">
/*
This code is an implementation of "Determination if a string has all the same characters" in SQL ORACLE 19c
p_in_str -- input string
*/
with
function same_characters_in_string(p_in_str in varchar2) return varchar2 is
v_que varchar2(32767) := p_in_str;
v_res varchar2(32767);
v_first varchar2(1);
v_next varchar2(1);
begin
v_first := substr(v_que,1,1);
if v_first is null then
v_res := '"" length:0 all characters are the same';
else
for i in 2..length(v_que)
loop
v_next := substr(v_que,i,1);
if v_first != v_next then
v_res := '"'||v_que||'" length:'||length(v_que)||', first different character "'||v_next||'"(0x'||rawtohex(utl_raw.cast_to_raw(v_next))||') at position:'|| i;
exit;
end if;
end loop;
v_res := nvl(v_res,'"'||v_que||'" length:'||length(v_que)||' all characters are the same');
end if;
return v_res;
end;
 
--Test
select same_characters_in_string('') as res from dual
union all
select same_characters_in_string(' ') as res from dual
union all
select same_characters_in_string('2') as res from dual
union all
select same_characters_in_string('333') as res from dual
union all
select same_characters_in_string('.55') as res from dual
union all
select same_characters_in_string('tttTTT') as res from dual
union all
select same_characters_in_string('4444 444k') as res from dual
;
</syntaxhighlight>
 
{{out}}
<pre>
"" length:0 all characters are the same
" " length:3 all characters are the same
"2" length:1 all characters are the same
"333" length:3 all characters are the same
".55" length:3, first different character "5"(0x35) at position:2
"tttTTT" length:6, first different character "T"(0x54) at position:4
"4444 444k" length:9, first different character " "(0x20) at position:5
</pre>
 
=={{header|Standard ML}}==
<syntaxhighlight lang="standard ml">
<lang Standard ML>
datatype result=allSame | difference of string*char*int ;
val chkstring = fn input =>
Line 1,667 ⟶ 3,735:
( input, String.size input , chk ( String.explode input,2 ) )
end;
</syntaxhighlight>
</lang>
result (string, string length, same or (hex,char,position))
<syntaxhighlight lang="text">
- map chkstring [ ""," ","1","333",".55","tttTTT","4444 444k" ];
val it =
Line 1,676 ⟶ 3,744:
("tttTTT", 6, difference ("54", #"T", 4)),
("4444 444k", 9, difference ("20", #" ", 5))]:
</syntaxhighlight>
</lang>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.6 ; # For binary encode
 
array set yesno {1 Yes 0 No}
Line 1,718 ⟶ 3,786:
$c [binary encode hex $c] $i]
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,734 ⟶ 3,802:
Tested: 'jjjjjjj' (len: 7). All Same? Yes.
</pre>
 
=={{header|VBA}}==
Instr is a VBA Function which process the strings from left─to─right.
 
The Optional argument LowerUpper As Boolean can display True for "tttTTT", if you want.
 
SameCharacters("tttTTT", respons, False) or SameCharacters("tttTTT", respons) return False
 
SameCharacters("tttTTT", respons, True) return True (All characters are the same)
 
<syntaxhighlight lang="vb">
Sub Main_SameCharacters()
Dim arr, i As Integer, respons As Integer
arr = Array("", " ", "2", "333", ".55", "tttTTT", "4444 444k", "111111112", " 123")
For i = LBound(arr) To UBound(arr)
If SameCharacters(arr(i), respons) Then
Debug.Print "Analyze : [" & arr(i) & "], lenght " & Len(arr(i)) & " : " & " All characters are the same."
Else
Debug.Print "Analyze : [" & arr(i) & "], lenght " & Len(arr(i)) & " : " & " is different at position " & respons & ", character = '" & Mid(arr(i), respons, 1) & "', hexa : (0x" & Hex(Asc(Mid(arr(i), respons, 1))) & ")"
End If
Next
End Sub
Function SameCharacters(sTxt, resp As Integer, Optional LowerUpper As Boolean = False) As Boolean
Dim A As String, B As String, i As Integer, temp As Integer
If Len(sTxt) > 1 Then
If LowerUpper Then
SameCharacters = UCase(sTxt) = String$(Len(sTxt), UCase(Left$(sTxt, 1)))
Else
SameCharacters = sTxt = String$(Len(sTxt), Left$(sTxt, 1))
End If
If Not SameCharacters Then resp = InStr(sTxt, Left$(Replace(sTxt, Left$(sTxt, 1), vbNullString), 1))
Else
SameCharacters = True
End If
End Function</syntaxhighlight>
{{out}}
<pre>Analyze : [], lenght 0 : All characters are the same.
Analyze : [ ], lenght 3 : All characters are the same.
Analyze : [2], lenght 1 : All characters are the same.
Analyze : [333], lenght 3 : All characters are the same.
Analyze : [.55], lenght 3 : is different at position 2, character = '5', hexa : (0x35)
Analyze : [tttTTT], lenght 6 : is different at position 4, character = 'T', hexa : (0x54)
Analyze : [4444 444k], lenght 9 : is different at position 5, character = ' ', hexa : (0x20)
Analyze : [111111112], lenght 9 : is different at position 9, character = '2', hexa : (0x32)
Analyze : [ 123], lenght 4 : is different at position 2, character = '1', hexa : (0x31)</pre>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<langsyntaxhighlight lang="vbnet">Module Module1
 
Sub Analyze(s As String)
Line 1,762 ⟶ 3,875:
End Sub
 
End Module</langsyntaxhighlight>
{{out}}
<pre>Examining [] which has a length of 0:
Line 1,782 ⟶ 3,895:
' ' (0x20) is different at position 4</pre>
 
=={{header|WrenV (Vlang)}}==
{{trans|Go}}
<syntaxhighlight lang="v (vlang)">fn analyze(s string) {
<lang ecmascript>var toHex = Fn.new { |n|
var chars := "0123456789abcdef"s.runes()
if (nle :== 0) return 0chars.len
println("Analyzing $s which has a length of $le:")
var neg = false
if (nle <> 0)1 neg = true{
var hex = "" for i in 1..le{
if chars[i] != chars[i-1] {
while (n > 0) {
println(" Not all characters in the string are the same.")
hex = hex + "%(chars[n%16])"
println(" '${chars[i]}' (0x${chars[i]:x}) is different at position ${i+1}.\n")
n = (n/16).floor
return
}
}
}
println(" All characters in the string are the same.\n")
return (neg) ? "-" : "" + hex[-1 .. 0]
}
fn main() {
strings := [
"",
" ",
"2",
"333",
".55",
"tttTTT",
"4444 444k",
"pépé",
"🐶🐶🐺🐶",
"🎄🎄🎄🎄"
]
for s in strings {
analyze(s)
}
}</syntaxhighlight>
 
{{out}}
<pre>
Analyzing which has a length of 0:
All characters in the string are the same.
 
Analyzing which has a length of 3:
All characters in the string are the same.
 
Analyzing 2 which has a length of 1:
All characters in the string are the same.
 
Analyzing 333 which has a length of 3:
All characters in the string are the same.
 
Analyzing .55 which has a length of 3:
Not all characters in the string are the same.
'5' (0x35) is different at position 2.
 
Analyzing tttTTT which has a length of 6:
Not all characters in the string are the same.
'T' (0x54) is different at position 4.
 
Analyzing 4444 444k which has a length of 9:
Not all characters in the string are the same.
' ' (0x20) is different at position 5.
 
Analyzing pépé which has a length of 4:
Not all characters in the string are the same.
'é' (0xe9) is different at position 2.
 
Analyzing 🐶🐶🐺🐶 which has a length of 4:
Not all characters in the string are the same.
'🐺' (0x1f43a) is different at position 3.
 
Analyzing 🎄🎄🎄🎄 which has a length of 4:
All characters in the string are the same.
</pre>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./fmt" for Conv, Fmt
 
var analyze = Fn.new { |s|
var chars = s.codePoints.toList
var le = chars.count
System.print("Analyzing \"%(Fmt.q(s)\") which has a length of %(le):")
if (le > 1) {
for (i in 1...le) {
Line 1,806 ⟶ 3,983:
System.print(" Not all characters in the string are the same.")
var c = String.fromCodePoint(chars[i])
var hex = toHexConv.callhex(chars[i])
System.print(" '%(c)' (0x%(hex)) is different at position %(i+1).\n")
return
Line 1,827 ⟶ 4,004:
"🎄🎄🎄🎄"
]
for (s in strings) analyze.call(s)</langsyntaxhighlight>
 
{{out}}
Line 1,868 ⟶ 4,045:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">include xpllib; \contains StrLen function
 
proc StrSame(S); \Show if string has same characters
Line 1,900 ⟶ 4,077:
StrSame("tttTTT");
StrSame("4444 444k");
]</langsyntaxhighlight>
 
{{out}}
Line 1,922 ⟶ 4,099:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn stringSameness(str){ // Does not handle Unicode
sz,unique,uz := str.len(), str.unique(), unique.len();
println("Length %d: \"%s\"".fmt(sz,str));
Line 1,931 ⟶ 4,108:
'wrap(c){ "'%s' (0x%x)[%d]".fmt(c,c.toAsc(), str.find(c)+1) })
.concat(", "));
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">testStrings:=T("", " ", "2", "333", ".55", "tttTTT", "4444 444k");
foreach s in (testStrings){ stringSameness(s) }</langsyntaxhighlight>
{{out}}
<pre>
18

edits