| Bytes | Lang | Time | Link |
|---|---|---|---|
| 068 | JavaScript Node.js | 250109T062308Z | l4m2 |
| 104 | Haskell | 250109T052834Z | Dannyu N |
| 013 | Uiua | 250108T132348Z | nyxbird |
| 018 | Uiua | 250108T101512Z | lolad |
| 008 | Husk | 250107T141939Z | int 21h |
| 006 | 05AB1E | 180831T092422Z | Kevin Cr |
| 009 | Vyxal | 230814T104726Z | The Thon |
| 008 | Japt g | 230814T110618Z | Shaggy |
| 006 | Thunno 2 h | 230814T104110Z | The Thon |
| 011 | K oK / K4 | 180901T201253Z | mkst |
| 032 | Perl 6 | 180831T072255Z | Jo King |
| 079 | R | 180830T221951Z | Sumner18 |
| 017 | Pyth | 180328T193903Z | hakr14 |
| nan | Java OpenJDK 8 | 170607T164400Z | marcelov |
| 157 | Java 8 | 160707T085226Z | Kevin Cr |
| 076 | PHP | 170607T144543Z | Jör |
| 055 | PowerShell | 170607T141645Z | colsw |
| 057 | JavaScript | 161228T222214Z | Grax32 |
| 109 | Clojure | 161228T175929Z | NikoNyrh |
| 053 | Ruby | 160706T224426Z | Value In |
| 107 | Javascript using external Library | 160706T214723Z | applejac |
| 128 | TSQL | 160706T092015Z | t-clause |
| 032 | APL | 160703T181830Z | Woofmao |
| 043 | x86 machine code | 160703T143626Z | meden |
| 141 | C# | 160701T194936Z | r3pear |
| 143 | C# | 160703T130305Z | ScifiDea |
| 128 | C# | 160702T161630Z | downrep_ |
| 019 | Actually | 160701T233716Z | user4594 |
| 075 | Perl | 160703T035600Z | Byeonggo |
| 171 | Batch | 160701T161706Z | Neil |
| 063 | C# lambda with Linq | 160702T164955Z | Bryce Wa |
| 174 | C | 160702T151948Z | meden |
| 012 | 05AB1E | 160701T162625Z | Emigna |
| 058 | Bash | 160702T011415Z | Dennis |
| 025 | J | 160701T232909Z | miles |
| 060 | JavaScript Firefox 48 or earlier | 160701T205645Z | Neil |
| 011 | MATL | 160701T160755Z | Luis Men |
| 025 | Retina | 160701T155741Z | Martin E |
| 011 | Jelly | 160701T162341Z | Dennis |
| 058 | Python 2 | 160701T162713Z | mbomb007 |
| 049 | Mathematica | 160701T163336Z | LegionMa |
| 015 | Pyth | 160701T160133Z | Leaky Nu |
| 015 | Jelly | 160701T161025Z | Leaky Nu |
| 036 | Retina | 160701T155442Z | Leaky Nu |
JavaScript (Node.js), 68 bytes
f=x=>x==(x=x.replace(/(.)\1*((.+)(\1)|\1)/i,'$4$4$3'))?x[1]||'':f(x)
Haskell, 104 bytes
import Data.Char
f[]=[]
f(h:t)=if elem h t then f(filter(h/=)t)else h:f t
g=take 1.drop 1.f.fmap toLower
Uiua, 13 bytes
⍣⊏₁""⍜⊛⍜°⊚=₁⌵
⍣⊏₁""⍜⊛⍜°⊚=₁⌵
⌵ # capitalize
⍜⊛ # under classifying:
⍜°⊚ # under counting each:
=₁ # find those equal to 1
⊏₁ # select the second
⍣ "" # catching errors with an empty string
Uiua, 18 bytes
⬚""⊡⬚∞⊡₁⊚=₁⊕⊃⧻□⊸⊛⌵
Annoyingly, handling the case of an empty string output takes 5 bytes, but I can't see a way to golf it.
Explanation
⬚""⊡⬚∞⊡₁⊚=₁⊕⊃⧻□⊸⊛⌵ # Example input: defd ? defd
⌵ # Convert to uppercase ? DEFD
⊸⊛ # Classify characters ? [0 1 2 0] DEFD
⊕⊃ # Group by index, taking...
□ # Character groups ? {DD E F}
⧻ # and lengths ? [2 1 1] {DD E F}
=₁ # Mask where length=1 ? [0 1 1] {DD E F}
⊚ # Mask to indices ? [1 2] {DD E F}
⊡₁ # Take the second one ? 2 {DD E F}
⬚∞ # (defaulting with ∞)
⊡ # then get char ? {E}
⬚"" # (replace ∞ with "")
05AB1E, 9 6 bytes
lТϦн
Input as a list of characters.
Try it online or verify all test cases.
Explanation:
l # Convert the characters in the (implicit) input-list to lowercase
Ð # Triplicate this lowercase list
¢ # Pop two, and get the count of each character in the list
Ï # Pop the counts and remaining list, and only keep the characters at the truthy
# (count==1) positions
¦ # Remove the first character
н # Pop and leave the new first character
# (after which it is output implicitly as result)
Unfortunately the .m (least frequent character(s) builtin) doesn't retain its order in the legacy version of 05AB1E and will only keep the first character instead of a list in the new 05AB1E version, otherwise this could have been 5 bytes with l.m¦¬.
Vyxal, 9 bytes
⇩)ġ~₃f∑Ḣh
-3 thanks to @lyxal
Explanation
⇩)ġ~₃f∑Ḣh # Implicit input
⇩)ġ # Group by lowercasing
~₃ # Filter by length == 1
f∑ # Flatten and join
Ḣ # Remove the first character
h # Then take the next one
# (or an empty string
# if it doesn't exist)
# Implicit output
Thunno 2 h, 6 bytes
LDcḅịḣ
Explanation
LDcḅịḣ # Implicit input
ị # Filter the input by:
L c # The count of the character lowercased
D # In the input lowercased
ḅ # Equals one?
ḣ # Remove the first character
# Implicit output of next character
# (or the empty string if it doesn't exist)
K (oK) / K4, 11 bytes
Solution:
*1_&1=#:'=_
Explanation:
*1_&1=#:'=_ / the solution
_ / convert input to lowercase
= / group alike characters
#:' / count (#:) each group
1= / 1 equal to length of the group?
& / where true
1_ / drop the first
* / take the first
Perl 6, 38 32 bytes
-6 bytes thanks to nwellnhof by changing .comb to a case-insensitive regex
{~grep({2>m:g:i/$^a/},.comb)[1]}
R, 79 bytes
function(z){y=tolower(el(strsplit(z,"")));x=table(y);y[y%in%names(x[x==1])][2]}
I definitely feel like something can be golfed out here. But I really enjoyed this challenge.
This answer splits the string into a vector of characters, changes them all to lower case, and tables them (counts them). Characters that occur once are selected and compared to characters within the aforementioned vector, then the second value that is true is returned as output. An empty string, or a string with no repeating characters outputs NA.
Pyth, 17 bytes
Jrz1.x.(fq/JT1J1k
Python 3 translation:
J=input().upper()
try:
print([T for T in J if J.count(T)==1][1])
except:
print()
Java (OpenJDK 8), 133 131 bytes
s->{String t=s.toUpperCase();int[]i=t.chars().filter(c->t.indexOf(c)==t.lastIndexOf(c)).toArray();return(char)(i.length>1?i[1]:0);}
Java 8, 172 157 bytes
(String s)->{s=s.toLowerCase();for(char i=0,c;s.length()>0;s=s.replace(c+"","")){c=s.charAt(0);if(!s.matches(".*"+c+".*"+c+".*")&&++i>1)return c;}return' ';}
-15 bytes.. Dang I was bad at golfing back then. ;)
Explanation:
(String s)->{ // Method with String parameter and character return-type
s=s.toLowerCase(); // Make the input-String lowercase
for(char i=0,c;s.length()>0; // Loop over the characters of `s`
s=s.replace(c+"","")){ // And after every iteration, remove all occurrences of the previous iteration
c=s.charAt(0); // Get the current first character
if(!s.matches(".*"+c+".*"+c+".*") // If it doesn't occur more than once
&&++i>1) // And this was the second one we've found
return c; // Return this second characters
} // End of loop
return' '; // Else: return an empty character/nothing
} // End of method
PHP, 76 bytes
for($a=$argn;~$c=$a[$i++];)stripos($a,$c)<strripos($a,$c)?:$r.=$c;echo$r[1];
PowerShell, 55 Bytes
old but good challenge, deserves a PS answer.
([char[]]"$args".ToLower()|group|? Count -eq 1)[1].Name
Throws errors when there are no non-repeating chars, exits with no error or return if there is only one repeating char.
the .ToLower() cost a bit due to the case insensitivity, and using |% ToL*r actually costs bytes since you need to wrap it all in brackets before converting to a char[]
JavaScript, 57 bytes
v=>(v+'\0'+v).replace(/(.)(?=.*\1.*\1)|\0.*/gi,"")[1]||""
JavaScript doesn't have Regex lookbehind, so I appended a null character and another copy of the string so that I can use lookahead. I then remove the null character and all characters after it as part of the regex replace.
Clojure, 109 bytes
#(let[s(clojure.string/lower-case %)](or(second(remove(set(map(fn[[k v]](if(> v 1)k))(frequencies s)))s))""))
Ough, I hope there is a more succinct way.
Ruby, 53 bytes
Input is STDIN, output is STDOUT. In Ruby, out-of-index positions in an array or string return nil, which is not printed.
String#count is a strange function in Ruby because instead of counting the number of occurrences for the string that was passed in, it counts the number of occurrences for each letter in that string. It's usually annoying but we can use it to our advantage this time. String#swapcase swaps upper and lower case letters.
$><<gets.chars.reject{|c|$_.count(c+c.swapcase)>1}[1]
Old version that wasn't safe against special characters like . - 46 bytes
$><<gets.chars.reject{|c|$_=~/#{c}.*#{c}/i}[1]
Javascript (using external Library) (107 bytes)
Crushed this using a library I wrote. Not sure if I have to count the declaration of variable "s", which is the string in question.
(s)=>_.From(s).ToLookup(y=>y.toLowerCase(),z=>z).Where(g=>g.Value.Count()==1).Select(x=>x.Key).ElementAt(1)
This will handle an empty string input, an input with only one non-repeating character, and an input with 2+ non-repeating characters
TSQL, 128 bytes
Golfed:
DECLARE @ varchar(99)=',,zzzbb@kkkkkkJgg'
,@i INT=99WHILE @i>1SELECT
@i-=1,@=IIF(LEN(@)>LEN(x)+1,x,@)FROM(SELECT
REPLACE(@,SUBSTRING(@,@i,1),'')x)x PRINT SUBSTRING(@,2,1)
Ungolfed:
DECLARE @ varchar(99)=',,zzzbb@kkkkkkJgg'
,@i INT=99
WHILE @i>1
SELECT
@i-=1,@=IIF(LEN(@)>LEN(x)+1,x,@)
FROM
(SELECT
REPLACE(@,SUBSTRING(@,@i,1),'')x
)x
PRINT SUBSTRING(@,2,1)
APL, 32 bytes
{⊃1↓⍵/⍨1=+/∘.=⍨(⎕UCS ⍵)+32×⍵∊⎕A}
Explanation:
(⎕UCS ⍵)+32×⍵∊⎕A Add 32 to uppercase letters
∘.=⍨ Make an equality matrix
+/ Check how many matches
⍵/⍨1= Keep elements with 1 match
1↓ Drop the first one
⊃ Return the second one
I was about to post it with 16 bytes, but the I realized it had to be case-insensitive...
x86 machine code, 43 bytes
In hex:
FC31C031C95641AC84C0740E3C6172F63C7A77F28066FFDFEBEC5EAC49740B89F751F2AE5974F44A77F1C3
Function takes a pointer to the input string in (E)SI and an integer in (E)DX and returns the (E)DX-th non-repeating character or zero if there's no such character. As a side-effect it converts the string to upper case.
Disassembly:
fc cld
31 c0 xor eax,eax
31 c9 xor ecx,ecx
56 push esi
_loop0: ;Search for the NULL char,
41 inc ecx ;counting the length in the process
ac lodsb
84 c0 test al,al
74 0e je _break0 ;NULL found, break
3c 61 cmp al,0x61 ;If char is
72 f6 jb _loop0 ;between 'a' and 'z'
3c 7a cmp al,0x7a ;convert this char
77 f2 ja _loop0 ;to uppercase in-place
80 66 ff df and byte ptr [esi-0x1],0xdf
eb ec jmp _loop0
_break0:
5e pop esi ;Reset pointer to the string
_loop: ;ECX=string length with NULL
ac lodsb ;Load next char to AL
49 dec ecx
74 0b je _ret ;End of string found, break (AL==0)
89 f7 mov edi,esi ;EDI points to the next char
51 push ecx
f2 ae repnz scasb ;Search for AL in the rest of the string
59 pop ecx
74 f4 je _loop ;ZF==1 <=> another instance found, continue
4a dec edx
77 f1 ja _loop ;If not yet the EDX-th non-rep char, continue
_ret:
c3 ret
C#, 141 bytes
void p(){var x=Console.ReadLine().ToLower();var c=0;foreach(char i in x){if(x.Split(i).Length-1<2){if(++c==2){Console.WriteLine(i);break;}}}}
Without break(smallest), 135 bytes
void p(){var x=Console.ReadLine().ToLower();var c=0;foreach(char i in x){if(x.Split(i).Length-1<2){if(++c==2){Console.WriteLine(i);}}}}
With for(;;), 150 bytes
void p(){for(;;){var x=Console.ReadLine().ToLower();var c=0;foreach(char i in x){if(x.Split(i).Length-1<2){if(++c==2){Console.WriteLine(i);break;}}}}}
Ungolfed with comments
void p()
{
var x=Console.ReadLine().ToLower();//Get lowercase version of input from STDIN
var c=0; //Create "count" integer
foreach(char i in x){//For each char in input from STDIN
if(x.Split(i).Length-1<2)//If current char occurs once in input from STDIN
{
if(++c==2){ //Add 1 to count and if count is 2
Console.WriteLine(i); //Print result to STDOUT
break; //Exit foreach
} //End of IF
} //End of IF
} //End of FOREACH
} //End of VOID
12 bytes saved by TuukkaX(change count to c).
3 bytes saved by TuukkaX(change string to var).
4 bytes saved by TuukkaX in "With for(;;)"(changed while(true) to for(;;)).
2 bytes saved by TuukkaX(changed c++;if(c==2) to if(++c==2)).
14 bytes saved by Bryce Wagner(changed x.ToCharArray() to x).
C#, 143 bytes
char c(string s){var l=s.Select(o=>Char.ToLower(o)).GroupBy(x=>x).Where(n=>n.Count()<2).Select(m=>m.Key).ToList();return l.Count()>1?l[1]:' ';}
C#, 129 128 bytes
char c(string i){var s=i.Where((n,m)=>i.ToLower().Where(o=>o==Char.ToLower(n)).Count()<2).ToArray();return s.Length>1?s[1]:' ';}
works fine. I wish i didnt need to lowercase everything
Actually, 19 bytes
;╗`ù╜ùc1=`░ε;(qq1@E
Explanation:
;╗`ù╜ùc1=`░ε;(qq1@E
;╗ push a copy of input to reg0
`ù╜ùc1=`░ [v for v in s if
ù╜ùc1= s.lower().count(v.lower()) == 1]
ε;(qq append two empty strings to the list
1@E element at index 1 (second element)
Perl, 75 bytes
my$s=<>;chomp$s;my$c;for my$i(split//,$s){my$m=@{[$s=~/$i/gi]};$m<2and++$c>=2and say$i and last}
Batch, 171 bytes
@echo off
set a=.
set s=%~1
:l
if "%s%"=="" exit/b
set c=%s:~0,1%
call set t=%%s:%c%=%%
if "%s:~1%"=="%t%" set a=%a%%c%
set s=%t%
if "%a:~2%"=="" goto l
echo %c%
Alternative formulation, also 171 bytes:
@echo off
set a=.
set s=%~1
:l
if "%s%"=="" exit/b
set c=%s:~0,1%
set t=%s:~1%
call set s=%%s:%c%=%%
if "%s%"=="%t%" set a=%a%%c%
if "%a:~2%"=="" goto l
echo %c%
C# lambda with Linq, 63 bytes
s=>(s=s.ToUpper()).Where(c=>s.Count(C=>c==C)<2).Skip(1).First()
C, 174 bytes
int c(char*s){int y=128,z=256,c[384],t;memset(c,0,z*6);for(;t=toupper(*s);s++){c[t]++?c[t]-2?0:c[z+(c[y+c[z+t]]=c[y+t])]=c[z+t]:c[z]=c[y+(c[z+t]=c[z])]=t;}return c[y+c[y]];}
This is not the most short, but quite efficient implementation. In essence it uses double-linked list to maintain ordered set of candidate characters and scans input string just once. Returns character code or zero if none found.
A little bit ungolfed version:
int c(char*s)
{
int y=128,z=256,c[384],t;
//It's basically c[3][128], but with linear array the code is shorter
memset(c,0,z*6);
for(;t=toupper(*s);s++)
{
c[t]++ ? // c[0][x] - number of char x's occurrence
c[t] - 2 ? // > 0
0 // > 1 - nothing to do
: c[z + (c[y + c[z + t]] = c[y + t])] = c[z + t] // == 1 - remove char from the list
: c[z] = c[y + (c[z + t] = c[z])] = t; // == 0 - add char to the end of the list
}
return c[y + c[y]];
}
05AB1E, 15 12 bytes
l©v®y¢iy}}1@
Explained
l© # store lower case string in register
v } # for each char in lower case string
®y¢iy # if it occurs once in string, push it to stack
} # end if
1@ # push the 2nd element from stack and implicitly display
Saved 3 bytes thanks to @Adnan
Bash, 58 bytes
tr A-Z a-z>t
tr -dc "`fold -1<t|sort|uniq -u`"<t|cut -c2
Caution: This creates a temporary file named t. If it already exists, it will be overwritten.
J, 25 bytes
(1{2{.]-.]#~1-~:)@tolower
Usage
f =: (1{2{.]-.]#~1-~:)@tolower
f 'DEFD'
f
f 'FEED'
d
f 'This is an example input sentence.'
x
f '...,,,..,,!@'
@
f 'ABCDefgHijklMNOPqrsTuVWxyz'
b
f 'AAAAAABBBBB'
f 'Thisxthis'
f 'This this.'
.
Explanation
(1{2{.]-.]#~1-~:)@tolower Input: s
tolower Converts the string s to lowercase
~: Mark the indices where the first time a char appears
1- Complement it
] Identity function to get s
#~ Copy only the chars appearing more than once
] Identity function to get s
-. Remove all the chars from s appearing more than once
2{. Take the first 2 chars from the result (pad with empty string)
1{ Take the second char at index 1 and return it
JavaScript (Firefox 48 or earlier), 60 bytes
f=s=>(m=s.match(/(.).*\1/i))?f(s.replace(m[1],"","gi")):s[1]
Returns undefined if there are only zero or one non-repeating characters. Works by case-insensitively deleting all occurrences of characters that appear more than once in the string. Relies on a non-standard Firefox extension that was removed in Firefox 49. 119 91 byte ES6 version:
f=s=>(m=s.match(/(.).*?(\1)(.*\1)?/i))?f((m[3]?s:s.replace(m[2],"")).replace(m[1],"")):s[1]
Recursively searches for all characters that appear at least twice in the string. If the character appears exactly twice then both occurrences are deleted otherwise only the first occurrence is deleted (the other occurrences will be deleted later). This allows the occurrences to have a difference case.
MATL, 11 bytes
tk&=s1=)FT)
This exits with an error (allowed by default) if there is no second non-repeated character.
Explanation
t % Implicitly take input string. Duplicate
k % Convert to lowercase
&= % 2D array of equality comparisons
s % Sum of each column
1= % True for entries that equal 1
) % Apply logical index to the input string to keep non-repeated characters
TF) % Apply logical index to take 2nd element if it exists. Implicitly display
Retina, 25 bytes
i!2=`(.)(?<!\1.+)(?!.*\1)
Try it online! (The first line enables running the code on a test suite of several inputs.)
Explanation
This is just a single regex match, the regex being:
(.)(?<!\1.+)(?!.*\1)
That is, match a character and ensure it doesn't appear anywhere else in the input. The rest is configuration:
iactivates case insensitivity.!tells Retina to print the matches as opposed to counting them.2=tells Retina to print only the second match as opposed to all of them.
Jelly, 11 bytes
Œlµḟœ-Q$Ḋḣ1
Try it online! or verify all test cases.
How it works
Œlµḟœ-Q$Ḋḣ1 Main link. Argument: s (string)
Œl Convert s to lowercase.
µ Begin a new, monadic chain. Argument: s (lowercase string)
$ Combine the two links to the left into a monadic chain.
Q Unique; yield the first occurrence of each character.
œ- Perform multiset subtraction, removing the last occurrence of each
character.
ḟ Filterfalse; keep characters that do not appear in the difference.
Ḋ Dequeue; remove the first character.
ḣ1 Head 1; remove everything but the first character.
Python 2, 59 58 bytes
Returns a list of a single character, or an empty list if no output. (Stupid case-insensitivity...)
s=input().lower();print[c for c in s if s.count(c)<2][1:2]
Mathematica, 49 bytes
Cases[Tally@ToUpperCase@#,{_,1}][[2,1]]~Check~""&
Anonymous function. Takes a list of characters as input. Ignore any errors that are generated.
Jelly, 15 bytes
Œlµċ@Ị¥Ðf¹ḊḢȯ“”
Verify all testcases. (Slightly modified to cater for all testcases)
