Jaka jest druga nie powtarzająca się postać?

18

Na podstawie tego pytania z Code Review

Biorąc pod uwagę niepusty łańcuch drukowalnych znaków ASCII, wypisz drugi niepowtarzalny znak. Na przykład dla danych wejściowych DEFDi wyjściowych F.

Wejście

Wynik

  • Drugi znak, który nie powtarza, podczas czytania od lewej do prawej, raz w odpowiednim formacie.
  • Znak wyjściowy nie rozróżnia wielkości liter.
  • Jeśli taki znak nie istnieje (np. Wszystkie znaki się powtarzają), wypisz pusty ciąg.

Zasady

  • Algorytm powinien ignorować wielkość liter. Oznacza to Di dliczy się jako ta sama postać.
  • Dopuszczalny jest pełny program lub funkcja.
  • Ciąg wejściowy będzie gwarantowany jako niepusty (tj. Co najmniej jeden znak długości).
  • Łańcuch wejściowy to ASCII. Każdy prawidłowy znak może się powtarzać, nie tylko alfanumeryczny (obejmuje spacje).
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Przykłady

Dane wejściowe znajdują się w pierwszym wierszu, dane wyjściowe w drugim wierszu.

DEFD
F

FEED
D

This is an example input sentence.
x

...,,,..,,!@
@

ABCDefgHijklMNOPqrsTuVWxyz
B

AAAAAABBBBB


Thisxthis


This this.
.
AdmBorkBork
źródło
8
Gdyby to nie rozróżniało wielkości liter, rozważę zrobienie tego w Forth. Operacje na łańcuchach są jednak ssące w tym języku.
mbomb007
Co się stanie, jeśli mój język nie obsługuje małych liter?
Adám,
@ Adám Czy wykorzystuje inną stronę kodową? Jak normalnie wprowadziłby ciąg ASCII, jeśli nie obsługuje małych liter?
AdmBorkBork
1
System, o którym myślałem, miał 7-bitową stronę kodową; zmodyfikowana standardowa strona kodowa, w której wielkie litery zajmują małe litery, a duże litery były używane do glifów. Dokonano tego na starych systemach APL, aby można było użyć Shift, aby uzyskać dostęp do glifów APL, podczas gdy nieruchome litery były klasycznymi literami w stylu kodowania.
Adám

Odpowiedzi:

10

MATL , 11 bajtów

tk&=s1=)FT)

Wychodzi to z błędem (domyślnie dozwolone), jeśli nie ma drugiego nie powtarzającego się znaku.

Wypróbuj online!

Wyjaśnienie

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 
Luis Mendo
źródło
Edycja ninja uderza ponownie. : P
Dennis
@Dennis Hahaha. Cóż, myślę, że wkrótce usuniesz kilka bajtów
Luis Mendo
10

Siatkówka , 25 bajtów

i!2=`(.)(?<!\1.+)(?!.*\1)

Wypróbuj online! (Pierwszy wiersz umożliwia uruchomienie kodu na zestawie testowym złożonym z kilku danych wejściowych.)

Wyjaśnienie

To jest tylko jedno dopasowanie wyrażenia regularnego, przy czym wyrażenie:

(.)(?<!\1.+)(?!.*\1)

Oznacza to, że dopasuj znak i upewnij się, że nie pojawi się on nigdzie indziej na wejściu. Reszta to konfiguracja:

  • i aktywuje niewrażliwość na wielkość liter.
  • ! mówi Retinie, aby wydrukowała mecze, a nie je liczyła.
  • 2= mówi Retinie, aby wydrukowała tylko drugi mecz, a nie wszystkie.
Martin Ender
źródło
1
Ach, dzięki za nauczenie mnie o 2=.
Leaky Nun
6

05AB1E, 15 12 bajtów

l©v®y¢iy}}1@

Wyjaśniono

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

Wypróbuj online

Zaoszczędź 3 bajty dzięki @Adnan

Emigna
źródło
Lub na 12 bajtów l©v®y¢iy}}1@:).
Adnan
@Adnan: Fajnie! Nie myślałem o użyciu @.
Emigna
5

Python 2, 59 58 bajtów

Zwraca listę pojedynczego znaku lub pustą listę, jeśli nie ma danych wyjściowych. (Głupia nieuwzględnianie wielkości liter ...)

s=input().lower();print[c for c in s if s.count(c)<2][1:2]

Wypróbuj online

mbomb007
źródło
To niepoprawne dane wejściowe. Użytkownik nigdy nie powinien uciekać od swoich danych wejściowych.
mbomb007
4
Jasne, że tak. Zapewniamy listy na STDIN w formacie listy języka. Dlaczego struny miałyby być inne?
Dennis
5

Galaretka , 11 bajtów

Œlµḟœ-Q$Ḋḣ1

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

Œ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.
Dennis
źródło
4

Partia, 171 bajtów

@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%

Alternatywne sformułowanie, również 171 bajtów:

@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%
Neil
źródło
Nie można go uruchomić na W2008R2. Linia „zestaw połączeń ...” rozwija się do „zestawu połączeń t =% s: D =%” i przerywa komunikatem „Błędna składnia polecenia”.
meden
@meden Przepraszamy, niektóre literówki wkradły się do mojego postu. Martwa gratka polegała na tym, że post był krótszy niż powiedziałem! Są teraz naprawione.
Neil
3

Pyth, 16 15 bajtów

1 bajt dzięki @ mbomb007

= rz1.xhtfq1 / zTzk
= rz1: fq1 / zTz1 2

Zestaw testowy.

Leaky Nun
źródło
2
Nawet nie znam Pytha, ale jeśli tak mówisz. : D
mbomb007
@ mbomb007 Wiesz, [1:2]sztuczka.
Leaky Nun
Możesz zapisać bajt za pomocą t<…2zamiast :…1 2. Można zapisać kolejny bajt przez przesunięcie =rz1do pierwszego użycia, czy też zmienić 1się Z(dla małych liter zamiast wielkiej mocy) t<fq1/zT=rzZ2.
Anders Kaseorg,
3

Właściwie 19 bajtów

;╗`ù╜ùc1=`░ε;(qq1@E

Wypróbuj online!

Wyjaśnienie:

;╗`ù╜ù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)
Mego
źródło
3

C #, 129 128 bajtów

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]:' ';}

działa w porządku. Chciałbym nie musiałem wszystkiego pisać małymi literami

downrep_nation
źródło
Zgłasza wyjątek IndexOutOfRangeException, gdy przekazuję argument „Thisxthis” jako argument. Poza tym myślę, że == 1 można zmienić na <2.
Yytsi
2

C # lambda z Linq, 63 bajty

s=>(s=s.ToUpper()).Where(c=>s.Count(C=>c==C)<2).Skip(1).First()
Bryce Wagner
źródło
Powinieneś być w stanie wymienić .Skip(1).First()z.ElementAt(1)
aloisdg mówi dozbrojenie Monica
Jeszcze lepiej możesz przekonwertować na listę i użyć indeksu.ToList()[1]
aloisdg mówi Reinstate Monica
Zgłasza to wyjątek dla danych wejściowych takich jak „”, „AABB” i „AABBC”, w których nie ma pasującego znaku na 2. pozycji. Myślę, że potrzebujesz FirstOrDefault.
Grax32
2

C #, 141 bajtów

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;}}}}

Bez przerwy (najmniejszy), 135 bajtów

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);}}}}

Z dla (;;), 150 bajtów

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;}}}}}

Nie golfił z komentarzami

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 bajtów zapisanych przez TuukkaX (zmień liczbę na c).

3 bajty zapisane przez TuukkaX (zmień ciąg na var).

4 bajty zapisane przez TuukkaX w „With for (;;)” (zmienione podczas gdy (true) na for (;;)).

2 bajty zapisane przez TuukkaX (zmieniono c ++; if (c == 2) na if (++ c == 2)).

14 bajtów zapisanych przez Bryce Wagner (zmieniono x.ToCharArray () na x).

r3pear
źródło
@TuukkaX och, naprawdę. Dziękuję Ci!
r3pear
Witamy w PPCG! To niezły pierwszy post! Ponieważ reguły wspominają, że odpowiedzi na ten problem powinny być albo funkcjami, albo pełnymi programami, twoje kody wymagają drobnych poprawek. Możesz także zapisać bajty, używając varzamiast stringi mając coś takiego czamiast count.
Yytsi
@TuukkaX Jeszcze raz dziękuję! Wkrótce zmodyfikuję kod i zmienię ciąg na var.
r3pear
@TuukkaX Czy powinienem dodać coś takiego jak void program () {} ???
r3pear
Tak, ale podaj nazwę funkcji jednobajtowej, aby zapisać bajty! :)
Yytsi
2

kod maszynowy x86, 43 bajty

W hex:

FC31C031C95641AC84C0740E3C6172F63C7A77F28066FFDFEBEC5EAC49740B89F751F2AE5974F44A77F1C3

Funkcja pobiera wskaźnik do ciągu wejściowego w (E) SI i liczbę całkowitą w (E) DX i zwraca (E) DX-ty nie powtarzający się znak lub zero, jeśli nie ma takiego znaku. Jako efekt uboczny konwertuje ciąg na wielkie litery.

Demontaż:

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
meden
źródło
2

APL, 32 bajty

{⊃1↓⍵/⍨1=+/∘.=⍨(⎕UCS ⍵)+32×⍵∊⎕A}

Wypróbuj || Wszystkie przypadki testowe

Wyjaśnienie:

                (⎕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

Właśnie miałem opublikować go z 16 bajtami, ale zdałem sobie sprawę, że musi być to bez uwzględniania wielkości liter ...

Woofmao
źródło
1
(⎕UCS ⍵)+32×⍵∊⎕A819⌶⍵
Adám
Nigdy wcześniej nie widziałem tego operatora. W jakiej wersji to działa?
Woofmao
Nazywa się to „ i-beam” . Jest operatorem we wszystkich wersjach Dyalog APL. Pierwotnie była to funkcja w starszych wersjach APL IBM dla specjalnych wywołań do systemu IBM. Zdobyć? IBM - i-beam ?
Adám
Dokumentacja ogólnie i dla usługi 819 („819” ≈ „BIg”). Wypróbuj online!
Adám
Nauczyłem się czegoś nowego. tryapl.org nie rozpoznaje tego, więc czy masz coś przeciwko, jeśli użyję tylko Twojego łącza TIO?
Woofmao
1

Retina, 43 36 bajtów

iM!`(.)(?<!\1.+)(?!.*\1)
!`(?<=^.¶).

Wypróbuj online!

Leaky Nun
źródło
1

Mathematica, 49 bajtów

Cases[Tally@ToUpperCase@#,{_,1}][[2,1]]~Check~""&

Funkcja anonimowa. Pobiera na wejściu listę znaków. Zignoruj ​​wszelkie wygenerowane błędy.

LegionMammal978
źródło
1

JavaScript (Firefox 48 lub wcześniejszy), 60 bajtów

f=s=>(m=s.match(/(.).*\1/i))?f(s.replace(m[1],"","gi")):s[1]

Zwraca, undefinedjeśli jest tylko zero lub jeden niepowtarzalny znak. Działa poprzez bez rozróżniania wielkości liter wszystkie wystąpienia znaków, które pojawiają się więcej niż jeden raz w ciągu. Opiera się na niestandardowym rozszerzeniu Firefoksa, które zostało usunięte w Firefoksie 49. 119 91-bajtowa wersja ES6:

f=s=>(m=s.match(/(.).*?(\1)(.*\1)?/i))?f((m[3]?s:s.replace(m[2],"")).replace(m[1],"")):s[1]

Rekurencyjnie wyszukuje wszystkie znaki, które pojawiają się co najmniej dwa razy w ciągu. Jeśli znak pojawia się dokładnie dwa razy, oba wystąpienia są usuwane, w przeciwnym razie usuwane jest tylko pierwsze wystąpienie (pozostałe wystąpienia zostaną usunięte później). Pozwala to na wystąpienie różnicy.

Neil
źródło
Wierzę, że naprawdę możesz dostosować swoją odpowiedź do Firefoksa 48, aby była zgodna m[1]z ES6, zastępując jąnew RegExp(`${m[1]}`,"gi")
Value Ink
@ KevinLau-notKenny To nie działałoby dla znaków specjalnych i kosztowało mnie 33 bajty w przypadku specjalnych przypadków, niestety zabierając mnie do 93.
Neil
nieeee nie znaki specjalne! Musiałem teraz edytować moją odpowiedź Ruby, aby była dla nich dostosowana.
Wartość tuszu
1

J, 25 bajtów

(1{2{.]-.]#~1-~:)@tolower

Stosowanie

   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.'
.

Wyjaśnienie

(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
mile
źródło
1

Bash, 58 bajtów

tr A-Z a-z>t
tr -dc "`fold -1<t|sort|uniq -u`"<t|cut -c2

Uwaga: Tworzy to plik tymczasowy o nazwie t . Jeśli już istnieje, zostanie zastąpiony.

Dennis
źródło
1

C 174 bajtów

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]];}

To nie jest najkrótsza, ale dość wydajna implementacja. W gruncie rzeczy wykorzystuje podwójnie połączoną listę do utrzymania uporządkowanego zestawu znaków kandydujących i skanuje ciąg wejściowy tylko raz. Zwraca kod znaku lub zero, jeśli nie znaleziono.

Trochę nie golfowa wersja:

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]];
}
meden
źródło
1

C #, 143 bajty

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]:' ';}
ScifiDeath
źródło
1

TSQL, 128 bajtów

Gra w golfa:

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)

Nie golfowany:

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)

Skrzypce

t-clausen.dk
źródło
1

Rubin, 53 bajty

Wejście to STDIN, wyjście to STDOUT. W Ruby pozycje poza indeksem w tablicy lub ciągu zwracają nil, który nie jest drukowany.

String#countjest dziwną funkcją w Rubim, ponieważ zamiast zliczać liczbę wystąpień dla ciągu, który został przekazany, zlicza liczbę wystąpień dla każdej litery w tym ciągu. Zazwyczaj jest to denerwujące, ale tym razem możemy go wykorzystać na naszą korzyść. String#swapcasezamienia wielkie i małe litery.

$><<gets.chars.reject{|c|$_.count(c+c.swapcase)>1}[1]

Stara wersja, która nie była bezpieczna dla znaków specjalnych, takich jak .- 46 bajtów

$><<gets.chars.reject{|c|$_=~/#{c}.*#{c}/i}[1]
Wartość tuszu
źródło
1

Java 8, 172 157 bajtów

(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 bajtów .. Dang Byłem wtedy zły w golfa. ;)

Wyjaśnienie:

Wypróbuj tutaj.

(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
Kevin Cruijssen
źródło
1

R , 79 bajtów

function(z){y=tolower(el(strsplit(z,"")));x=table(y);y[y%in%names(x[x==1])][2]}

Wypróbuj online!

Zdecydowanie czuję, że można tu grać w golfa. Ale naprawdę podobało mi się to wyzwanie.

Ta odpowiedź dzieli ciąg na wektor znaków, zamienia je wszystkie na małe litery i tabeluje je (zlicza). Znaki, które występują raz, są wybierane i porównywane ze znakami we wspomnianym wektorze, a następnie druga prawdziwa wartość jest zwracana jako wynik. Pusty ciąg lub ciąg bez powtarzających się znaków wyprowadza NA.

Sumner18
źródło
1

Perl 6 , 38 32 bajtów

-6 bajtów dzięki nwellnhof poprzez zmianę .combwyrażenia regularnego bez rozróżniania wielkości liter

{~grep({2>m:g:i/$^a/},.comb)[1]}

Wypróbuj online!

Jo King
źródło
1
m:g:i/$^a/dla 32 bajtów .
nwellnhof
1

K (oK) / K4 , 11 bajtów

Rozwiązanie:

*1_&1=#:'=_

Wypróbuj online!

Wyjaśnienie:

*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
streetster
źródło
0

Perl, 75 bajtów

 my$s=<>;chomp$s;my$c;for my$i(split//,$s){my$m=@{[$s=~/$i/gi]};$m<2and++$c>=2and say$i and last}
Byeonggon Lee
źródło
0

JavaScript (przy użyciu zewnętrznej biblioteki) (107 bajtów)

Zmiażdżyłem to za pomocą biblioteki, którą napisałem. Nie jestem pewien, czy muszę liczyć deklarację zmiennej „s”, która jest danym ciągiem.

(s)=>_.From(s).ToLookup(y=>y.toLowerCase(),z=>z).Where(g=>g.Value.Count()==1).Select(x=>x.Key).ElementAt(1)

Będzie to obsługiwać pusty ciąg znaków, dane wejściowe zawierające tylko jeden niepowtarzalny znak i dane wejściowe z ponad 2 niepowtarzającymi się znakami

Zdjęcie 1

applejacks01
źródło
Czy masz link do danej biblioteki? Ponadto, ponieważ jest to golf golfowy, musisz wziąć spację tam, gdzie możesz
Value Ink
Hej, tak, to github.com/mvegh1/Enumerable . Nie ma jeszcze dokumentów. Przepraszam, posprzątam tę odpowiedź, aby zmniejszyć jak najwięcej białych znaków
applejacks01
Prawdopodobnie powinieneś wspomnieć i połączyć go w treści odpowiedzi. Ponadto, jeśli chodzi o liczbę bajtów, konsensus polega na umieszczeniu jej w anonimowej lambda (so s=> ...)
Value Ink
Ok, nie ma problemu. Nie chciałem nikogo urazić poprzez link do mojego kodu, ale wspomniałem, że korzystałem z mojej biblioteki. Zaktualizuję swoją odpowiedź za pomocą lambda, dzięki za poinformowanie mnie
applejacks01
0

Clojure, 109 bajtów

#(let[s(clojure.string/lower-case %)](or(second(remove(set(map(fn[[k v]](if(> v 1)k))(frequencies s)))s))""))

Mam nadzieję, że jest bardziej zwięzły sposób.

NikoNyrh
źródło