Oddziel ciąg

39

Wiele języków ma wbudowane sposoby na pozbycie się duplikatów, „deduplikowania” lub „unikatowania” listy lub łańcucha. Mniej powszechnym zadaniem jest „detriplikowanie” łańcucha. Oznacza to, że dla każdej pojawiającej się postaci są zachowywane dwa pierwsze wystąpienia.

Oto przykład, w którym znaki, które należy usunąć, są oznaczone ^:

aaabcbccdbabdcd
  ^    ^ ^^^ ^^
aabcbcdd

Twoim zadaniem jest wdrożenie dokładnie tej operacji.

Zasady

Dane wejściowe to pojedynczy, być może pusty ciąg. Możesz założyć, że zawiera tylko małe litery w zakresie ASCII.

Wyjście powinno być pojedynczym ciągiem ze wszystkimi usuniętymi znakami, które już pojawiły się co najmniej dwa razy w ciągu (więc zachowane są dwa najbardziej lewe wystąpienia).

Zamiast ciągów możesz pracować z listami znaków (lub ciągami singletonowymi), ale format musi być spójny między wejściem a wyjściem.

Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.

Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.

To jest , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .

Przypadki testowe

Każda para linii to jeden przypadek testowy, dane wejściowe i dane wyjściowe.



xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd

Tabela liderów

Fragment kodu na dole tego postu generuje tabelę wyników z odpowiedzi a) jako listę najkrótszych rozwiązań dla każdego języka oraz b) jako ogólną tabelę wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

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

Martin Ender
źródło
5
Struny singletonowe ... struny?
dkudriavtsev

Odpowiedzi:

15

JavaScript (ES6), 42 48

Edytuj Ogromne 6 bajtów zaoszczędzonych dzięki @Neil

s=>s.replace(k=/./g,c=>(k[c]+=c)[11]?'':c)

Objaśnienie: Używam właściwości „a” ... z z obiektu kdo przechowywania informacji dla każdego znaku (w tym przypadku obiekt k jest wyrażeniem regularnym tylko w celu zapisania bajtów). Te właściwości są początkowo undefined. W javascript dodanie liczby do undefineddaje NaN(całkiem rozsądne), ale dodanie ciągu „X” daje "undefinedX"- ciąg długości 10 (głupie). Dodając więcej znaków, otrzymujesz dłuższe ciągi. Jeśli uzyskany ciąg dla danego znaku jest dłuższy niż 11, znak ten nie jest kopiowany do wyniku.

Test

F=
s=>s.replace(k=/./g,c=>(k[c]+=c)[11]?'':c)

test=`

xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd`.split`\n`
for(i=0;i<test.length;)
  a=test[i++],b=test[i++],r=F(a),
  console.log(r==b?'OK':'KO',a,'->',r,b)

edc65
źródło
Ściśle mówiąc, pusta linia jest jednym z przypadków testowych.
Neil
@Neil ok dodał test pustych ciągów
edc65
Jeśli przełączysz się na dane wejściowe i wyjściowe z tablicy, możesz użyć .filter, aby zapisać 12 dodatkowych znaków. v=>v.filter(x=>!(v[x]+=x)[11]). Wyrazy uznania za „nieokreślony” hack.
Grax32,
@Grax thanx, ale zbyt różne. Powinieneś opublikować to sam
edc65
14

Python 2, 48 bajtów

lambda s:reduce(lambda r,c:r+c*(r.count(c)<2),s)

c[r.count(c)/2:]jest alternatywą dla tej samej długości c*(r.count(c)<2).


49 bajtów:

r=''
for c in input():r+=c*(r.count(c)<2)
print r
xnor
źródło
12

Siatkówka , 17 bajtów

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

Wypróbuj online!

Prosta zamiana wyrażeń regularnych - dopasuj znak, jeśli pojawił się już dwukrotnie, i usuń go.

Kobi
źródło
Próbowałem także pętli i powtarzającej się grupy{2} , obie z 18 bajtami.
Kobi,
1
Mam 14 za pomocą ostatnio dodanej funkcji. ;)
Martin Ender
Wiedziałem, że coś jest. Patrzyłem na granice, prawdopodobnie nie takie. Sprawdzę jeszcze raz.
Kobi,
3
Ach, chyba znalazłem odpowiedź Martina. Miałem pewne kłopoty, kiedy próbowałem wcześniej, chyba dlatego, że nie zastanawiałem się, jak deduplikacja będzie działać na danych wejściowych zawierających wiele wierszy. Spoiler (z dodanymi 5 bajtami, aby włączyć tryb na linię): retina.tryitonline.net/…
FryAmTheEggman
@FryAmTheEggman - Fajnie, nie znalazłem tego. Dodaj odpowiedź - myślę, że to zbyt różni się od mojej odpowiedzi i nie czułem się komfortowo w jej edytowaniu :P. Dzięki!
Kobi
6

Brachylog , 25 bajtów

.v|s.g:.z:1a
:2fl<3
he~t?

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Wyjaśnienie

Działa to, ponieważ s - Subsetnajpierw ujednolici się z większymi podzbiorami, dlatego np "aaa". Spróbuje "aa"wcześniej "a".

  • Główny predykat:

      .v         input = Output = ""
    |          Or
      s.         Output is an ordered subset of the input
      g:.z       Zip each character of the output with the output itself
      :1a        Apply predicate 1 on each element of the zip
    
  • Predykat 1: Sprawdź, czy wszystkie postacie pojawiają się maksymalnie dwa razy. Dane wejściowe =[String:Char]

    :2f        Find all valid outputs of predicate 2 (i.e. one output per occurence
                   of the char)
    l<3        There are less than 3 occurences
    
  • Predicate 2: Uzyskaj wystąpienie postaci. Dane wejściowe =[String:Char]

    he         Take a character of the string in the input
      ~t?      That character is the char of the input
    
Fatalizować
źródło
6

> <> , 22 bajty

i:0(?;::9g:}2(?o{1+$9p

Wypróbuj online! Używa codbox do śledzenia do tej pory liczby.

i                       Read a char c of input
 :0(?;                  Halt if EOF
      :                 Make a copy - stack has [c c] at the top
       :9g              Get count stored at (c, 9)
          :}            Copy the count and move to bottom of stack
            2(?o        If the count is less than 2, output c
                {1+     Move the count back to the top of the stack and increment
                   $9p  Update cell at (c, 9)
                        [Instruction pointer moves to start as ><> is toroidal]
Sp3000
źródło
6

J, 20 15 bajtów

#~(3>[+/@:={:)\

Definiuje funkcję monadyczną, która przyjmuje i zwraca ciąg znaków. Wypróbuj tutaj . Stosowanie:

   f =: #~(3>[+/@:={:)\
   f 'abaacbb'
abacb

Wyjaśnienie

Przełączyłem się na ten sam algorytm, którego używają niektóre inne rozwiązania, ponieważ okazał się on krótszy ...

#~(3>[+/@:={:)\  Input is y.
  (          )\  For each prefix of y:
          =        compute the equality vector
     [     {:      of the prefix and its last element, and
      +/@:         take its sum. Now we have a vector r such that y[i] has its
                   r[i]'th occurrence at position i.
   3>              Mark those coordinates where r[i] < 3.
#~               Remove the non-marked characters from y.
Zgarb
źródło
6

Haskell, 40 39 bajtów

foldl(\s c->s++[c|filter(==c)s<=[c]])""

Przykład użycia: foldl(\s c->s++[c|filter(==c)s<=[c]])"" "aaabcbccdbabdcd"-> "aabcbcdd".

Zachowaj następny znak, cjeśli ciąg wszystkich cjak dotąd jest leksykograficzny mniejszy lub równy ciągowi singletonu [c].

Edycja: @xnor zapisał bajt, przełączając się ze zrozumienia listy na filter. Dzięki!

nimi
źródło
Alternatywą może filter(==c)s<=[c]być uratowanie bajtu.
xnor
5

Perl, 22 bajty

Kod 21 bajtów + 1 dla -p.

s/./$&x(2>${$&}++)/ge

Stosowanie

perl -pe 's/./$&x(2>${$&}++)/ge' <<< 'aaabcbccdbabdcd'
aabcbcdd
Dom Hastings
źródło
5

C, 57 bajtów

Zadzwoń f()ze sznurkiem, aby się dowiedzieć. Funkcja modyfikuje swój parametr. Wymaga C99 z powodu fordeklaracji pętli.

f(char*p){for(char*s=p,m[256]={0};*s=*p;s+=++m[*p++]<3);}
owacoder
źródło
Czy nie umieścisz deklaracji sw pierwszej deklaracji for?
Martin Ender
W C99 możesz. Po prostu tego nie zrobiłem, ponieważ lubię utrzymywać kompatybilność golfów C89.
owacoder
5

JavaScript (ES6), 35 bajtów

s=>s.filter(c=>(s[c]=(s[c]|0)+1)<3)

Pobiera tablicę znaków jako dane wejściowe i zwraca tablicę szczegółową.

cPu1
źródło
Miły. Możesz zrobić, c=>(s[c]=-~s[c])<3aby zaoszczędzić kilka bajtów.
ETHproductions
Tęskniłem za tym, że możesz użyć tablic jako danych wejściowych i napisałem funkcję używającą map. Grał w golfa w zasadzie wyglądał jak twój. główną różnicą było przypisanie, które, jeśli je przełączysz, zaoszczędzi kilka bajtów. Spróbuj s.filter(c=>(s[c]=s[c]+1|0)<3)33 bajtów. EDYCJA: Ups, przegapiłem komentarz nade mną, to jeszcze lepiej :)
stycznia
4

PowerShell v2 +, 31 bajtów

$args-replace'(.)(?<=\1.*\1.+)'

Używa tego samego wyrażenia regularnego, co w odpowiedzi Retina Kobi , po prostu enkapsulowanej w -replaceoperatorze PowerShell . Działa, ponieważ oba używają w tle wyrażenia regularnego .NET-flavour.

Alternatywnie, bez wyrażenia regularnego, 56 bajtów

$b=,0*200;-join([char[]]$args[0]|%{"$_"*($b[$_]++-lt2)})

Tworzy tablicę pomocniczą $bwstępnie wypełnioną 0s. Rzuca ciąg wejściowy $args[0]jako chartablicę, przepuszcza go przez pętlę |%{...}. Każda iteracja generuje bieżący znak $_jako ciąg "$_"pomnożony przez wartość logiczną, która jest $TRUE(domyślnie rzutowana 1tutaj) tylko wtedy, gdy odpowiedni punkt w tablicy pomocniczej jest mniejszy niż 2(tj. Nie widzieliśmy tego znaku dwa razy). Powstały zbiór ciągów jest enkapsulowany w pareny i edytowany -joinrazem, tworząc pojedynczy ciąg wyjściowy. Pozostaje to w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
Wyrażenie regularne jest nie do pobicia. :) Ja beleave hashtable jest lepszy niż tablica dla wariantu bez regex: $b=@{};-join($args|% t*y|?{++$b.$_-lt3}).
mazzy
1
@mazzy W przypadku wariantu bez wyrażenia regularnego i kodu wymagana byłaby nowsza wersja niż PowerShell 2. W rezultacie myślę, że zachowam tę odpowiedź bez zmian. Możesz jednak opublikować swój kod jako osobną odpowiedź!
AdmBorkBork,
czy hashtable pojawił się w wersji 3.0? Dobrze. Dzięki.
mazzy
4

Mathematica, 39 bajtów

Fold[If[Count@##<2,Append@##,#]&,{},#]&

Funkcja anonimowa. Pobiera listę znaków jako dane wejściowe i zwraca listę danych szczegółowych jako dane wyjściowe. Używa metody zwijania listy i odrzucania potrójnych elementów, nie jest to zbyt skomplikowane.

LegionMammal978
źródło
4

05AB1E, 12 bajtów

vyˆ¯y¢O3‹iy?

Wyjaśnienie

v            # for each char in input
 yˆ          # push to global array
   ¯y¢O3‹i   # if nr of occurrences are less than 3
          y? # print it

Wypróbuj online

Emigna
źródło
4

MATL , 8 bajtów

t&=Rs3<)

Wypróbuj online!

Wyjaśnienie

t      % Input string implicitly. Push another copy
&=     % Matrix of all pairwise equality comparisons of string elements
R      % Keep only upper triangular part, making the rest of the entries zero
s      % Sum of each column. This gives a vector with number of occurrences
       % of the current character up to the current position
3<     % True for entries that are less than 3
)      % Use as logical index into initial copy of the input. Display implicitly

Przykład

Zakładając dane wejściowe 'aaababbc', stos zawiera następujące elementy po wskazanych instrukcjach:

  • t

    'aaababbc'
    'aaababbc'
    
  • t&=

    'aaababbc'
    [ 1 1 1 0 1 0 0 0;
      1 1 1 0 1 0 0 0;
      1 1 1 0 1 0 0 0;
      0 0 0 1 0 1 1 0;
      1 1 1 0 1 0 0 0;
      0 0 0 1 0 1 1 0;
      0 0 0 1 0 1 1 0;
      0 0 0 0 0 0 0 1 ]
    
  • t&=R

    'aaababbc'
    [ 1 1 1 0 1 0 0 0;
      0 1 1 0 1 0 0 0;
      0 0 1 0 1 0 0 0;
      0 0 0 1 0 1 1 0;
      0 0 0 0 1 0 0 0;
      0 0 0 0 0 1 1 0;
      0 0 0 0 0 0 1 0;
      0 0 0 0 0 0 0 1 ]
    
  • t&=Rs

    'aaababbc'
    [ 1 2 3 1 4 2 3 1 ]
    
  • t&=Rs3<

    'aaababbc'
    [ true true false true false true false true ]
    
  • t&=Rs3<)

    'aabbc'
    
Luis Mendo
źródło
4

Siatkówka , 14 bajtów

D`(.)(?<=\1.*)

Sprawdź wszystkie przypadki testowe. ( %Włącza tryb per-line)

Wykorzystuje nowy etap „deduplikacji”, aby zaoszczędzić kilka bajtów w stosunku do podejścia Kobi . Deduplikat gromadzi listę wszystkich dopasowań wyrażenia regularnego i zastępuje wszystkie oprócz pierwszego pustym ciągiem. Wyrażenie regularne dopasowuje znak, który już pojawia się raz w ciągu, co oznacza, że ​​pierwsze dwa zostaną zachowane.

FryAmTheEggman
źródło
3

K, 18 bajtów

  g:{x{?x@<x}@,/2#'=x}
  g "abc"
"abc"
  g "aaabcbccdbabdcd"
"aabcbcdd"

  /k4 request test vectors from internet
  R:"GET /raw/ftHe0bpE HTTP/1.0\r\nHost: pastebin.com\r\n\r\n"
  t:+0N 2#t@1_&|\(0=#:)'t:1_"\r\n"\:`:http://pastebin.com:80 R 

  /k4 no internet? use a file called "t.txt" in current directory
  t:+0N 2#0:`:t.txt

  /k6?
  t:+0N 2#0:"t.txt"

  /visually inspect test cases
  g't[0]
(();"xx";"abcabc";"abcdabc";"abacbdc";"aabcbcdd")

  /do all tests pass?
  |/ t[1] {$[0=#x;0=#y;x~y]}' g't[0]
1b

K4 jest dostępny do pobrania za darmo ; K6 jest w fazie rozwoju . Jeśli pobrałeś KDB, możesz dostać się do K z ukośnikiem odwrotnym .

Być może najłatwiej jest to rozdzielić, ale najpierw trochę składni: g:xustawia gna x. {x+1}jest funkcją, która przyjmuje argument x . W K pierwszym argumentem funkcji jest x(drugi jest, ya trzeci jestz . Nie potrzebujesz czwartego).

Teraz:

x:"aaabcbccdbabdcd"

=xoznacza grupę x , która wytwarza:

"abcd"!(0 1 2 10;3 5 9 11;4 6 7 13;8 12 14)

2#'oznacza dwa pobrane (z) każdego, które produkuje

"abcd"!(0 1;3 5;4 6;8 12)

Jak widać, są to przesunięcia pierwszych dwóch dopasowań każdej postaci. 2 mogą być uogólnione.

,/oznacza dołączyć do każdego i jest często nazywany raze . Dostarczy nam tylko wartości naszego słownika. W ten sposób ,/"abcd"!(0 1;3 5;4 6;8 12)produkuje:

0 1 3 5 4 6 8 12

które musimy posortować. {x@<x}@to idiom, który często widzą programiści K (Q nazywa to asc ), co mówi x przy ocenie x . Rozbijając to na części:

  <0 1 3 5 4 6 8 12
0 1 2 4 3 5 6 7

zwróciło wskaźniki posortowanej tablicy, które chcemy pobrać z oryginalnej tablicy. x@yoznacza x at y, więc indeksuje tablicę indeksami tego rodzaju (jeśli ma to jakiś sens).

  {x@<x}@0 1 3 5 4 6 8 12
0 1 3 4 5 6 8 12

które po prostu indeksujemy teraz do naszej oryginalnej tablicy. My mogliśmy powiedzieć x@tutaj, ale K obsługuje naprawdę potężne pojęcie, które możemy wykorzystać tutaj: application funkcja indeksowania. Oznacza to, że a[0]może szukać zerowej szczeliny alub może zastosować funkcję 0do wywołanej funkcji a. Powodem, dla którego potrzebowaliśmy @poprzednio, {x@<x}jest to, że x<yoznacza xs mniej niż ys : Operatory w K mają formę diadadową (dwuparametrową) i formę monadyczną (jednotargową) pochodzącą z APL. Q nie ma tej „ambiwalencji”.

geocar
źródło
Witamy w PPCG! Świetna pierwsza odpowiedź. :)
Martin Ender
Mam kilka pytań. 1. Czy K4 jest tym samym językiem, do którego prowadzi link (Q / kdb +)? 2. Czy możesz pokazać, jak wywołać funkcję na wejściu lub jak należy sformatować elementy w testVectors.txt?
Dennis
@Dennis 1. Tak. Naciśnij ukośnik, aby przejść z Q do K. 2. Tak jak pojawiają się w pytaniu: pastebin.com/ftHe0bpE przykładowe połączenie:g"aaabcbccdbabdcd"
geocar
Ok dzięki. Nie można uruchomić części pliku, ale załatwia sprawę g"...". Niestety Twój kod zwraca aabbccdane wejściowe abc.
Dennis
@Dennis Mogłeś zrobić coś złego: {x{?x@<x}@,/2#'=x}"abc"zdecydowanie wraca "abc". Wróci, "aabbcc"jeśli przegapisz ?wyraźne.
geocar
2

Python 2, 51 bajtów

f=lambda s:s and f(s[:-1])+s[-1]*(s.count(s[-1])<3)

Przetestuj na Ideone .

Dennis
źródło
2

Java 8 lambda, 90 znaków

i->{int[]o=new int[128];String r="";for(char c:i.toCharArray())if(++o[c]<3)r+=c;return r;}

Wersja bez golfa:

public class Q86503 {

    static String detriplicate(String input) {
        int[] occurences = new int[128];
        String result = "";
        for (char c : input.toCharArray()) {
            if (++occurences[c] < 3) {
                result += c;
            }
        }
        return result;
    }
}

Tworzy tablicę dla wszystkich znaków ascii. Jeśli pojawi się postać, odpowiedni licznik zostanie zwiększony. Jeśli przekroczy 2, znak nie zostanie dołączony do ciągu wynikowego. Bardzo łatwe, bardzo krótkie;)

Frozn
źródło
2

Perl 6, 27 bajtów

{.comb.grep({++%.{$_} <3})}

Wyjaśnienie:

{.comb.grep({++%.{$_} <3})}
{                         } # a function
 .comb                      # get all the characters in the argument
      .grep({           })  # filter
               %.           # an anonymous hash (shared between calls to grep)
             ++  {$_}       # increment the value at the current key (current letter).
                            # if the key doesn't exist, it defaults to 0 (then gets incremented)
                      <3    # return True if it wasn't seen 3 times

(Uwaga: Perl 6 nie jest tak „zorientowany na golfa” jak jego siostra Perl 5 ... Więc tak, to miejsce przed <koniecznością. %.{}Jest to anonimowy skrót).

Ven
źródło
24 bajty
Jo King
2

SmileBASIC, 77 72 69 68 bajtów

DIM R[#Y]READ S$WHILE""<S$Q=ASC(S$)INC R[Q]?SHIFT(S$)*(R[Q]<3);
WEND

Wyjaśniono:

DIM R[128] 'array to store letter frequencies
READ S$ 'get input string
WHILE""<S$ 'much shorter than LEN(S$)
 Q=ASC(S$) 'get ascii value of first character in S$
 INC R[Q]
 ?SHIFT(S$)*(R[Q]<3); 'remove the first character of S$, and print it if there are less than 3 occurrences.
WEND
12Me21
źródło
Witamy w ppcg! Miły pierwszy post!
R
1

Common Lisp, 127

(lambda(s)(map()(lambda(x)(flet((p(b)(1+(position x s :start b))))(setf s(remove x s :start(p(p 0))))))(remove-duplicates s))s)

Całkiem drukowane

(lambda (s)
  (map nil
       (lambda (x)
         (flet ((p (b)
                  (1+ (position x s :start b))))
           (setf s (remove x s :start (p (p 0))))))
       (remove-duplicates s))
  s)
rdzeń rdzeniowy
źródło
1

Q , 52 bajtów

q)f2:{x asc raze{distinct 2#where x}each x~'/:distinct x}
q)f2 each testList
"xx"
"abcabc"
"abcdabc"
"abacbdc"
"aabcbcdd"
q)
Chromozorz
źródło
1

K , 27 bajtów

    f:{x{x@<x}@,/{?2#&x}'x~'/:?x}
    testList:("xxxxx";"abcabc";"abcdabcaba";"abacbadcba";"aaabcbccdbabdcd")
    f'testList
("xx";"abcabc";"abcdabc";"abacbdc";"aabcbcdd")
Chromozorz
źródło
1

Ruby , 79 62 57 bajtów

Jest to dość niewygodne, ale nie jestem pewien, czy mogę teraz grać w golfa o wiele lepiej. Wszelkie sugestie dotyczące gry w golfa są mile widziane. Wypróbuj online!

Edycja: -17 bajtów dzięki Value Ink, sugerując bardziej golfowy sposób na usunięcie trzech powtórzeń. -5 bajtów od usunięcia .uniqmetody.

->s{s.chars.map{|a|s[s.rindex a]=""while s.count(a)>2};s}

Nie golfowany:

def g(s)
 s.chars.each do |a|
  while s.count(a) > 2
   i = s.rindex(a)
   s[i] = ""
  end
 end
 return s
end
Sherlock9
źródło
62 bajty:->s{s.chars.uniq.map{|a|s[s.rindex a]=""while s.count(a)>2};s}
Wartość Ink
1

JavaScript, 30 bajtów

v=>v.filter(x=>!(v[x]+=x)[11])

Używając metody, którą @ edc65 wymyślił do zliczania, ale z filtrem tablicowym. Gdy pojawia się pierwszy znak, wartość obiektu staje się „niezdefiniowana” plus znak (tzn. „Niezdefiniowany”). Następnym razem, gdy wartość obiektu stanie się „undefinedxx”.

Następnie v [x] [11] zwraca true, a po połączeniu z operatorem not, false, co oznacza, że ​​znaki, które pojawiły się dwukrotnie, zostaną odfiltrowane.

Grax32
źródło
0

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

To był dobry! Nie wygrał, ale było fajnie

n=>{a={};return _.From(n).Where(x=>{b=a[x]?a[x]++:a[x]=1;return b<2}).Write("")}

Link do lib: https://github.com/mvegh1/Enumerable/

Objaśnienie kodu: Metoda akceptuje ciąg znaków, biblioteka analizuje go jako tablicę znaków, a klauzula Where jest złożonym predykatem filtrującym, który sprawdza skrót mapy „a” pod kątem obecności bieżącego znaku. Jeśli istnieje, licznik przyrostów, w przeciwnym razie ustawiony na 1. Jeśli <2, predykat (i bieżący znak) przejdzie, w przeciwnym razie nie powiedzie się

wprowadź opis zdjęcia tutaj

applejacks01
źródło
Można uniknąć stosując returnale czyni czynność listę oddzielonych przecinkami ciągu wyrażeń w nawiasach: n=>(a={},_From(n)....). Ostatnie wyrażenie jest wartością zwracaną. W swojej Wherefunkcji, można wyeliminować pośredni bcałkowicie porównując przeciwko wyniku cesji lub przyrostu: x=>(a[x]?a[x]++:a[x]=1)<2.
apsillers
Wreszcie, można uniknąć za pomocą zewnętrznej biblioteki w ogóle (i oszczędzania bajtów) przy użyciu wielokropka string-i podziału filterz join: [...n].filter(...).join(""). Odwróć logikę prawda / fałsz przy zmianie Wherena filter.
apsillers
Ahh dobre obserwacje! Przyjrzę się bliżej twojej sugestii
applejacks01
0

Clojure, 72 bajty

#(apply str(reduce(fn[r c](if(<(count(filter #{c}r))2)(conj r c)r))[]%))

Tyle bajtów ...

NikoNyrh
źródło
0

Pascal (FPC) , 103 bajty

var a:array['a'..'z']of word;c:char;begin repeat read(c);inc(a[c]);if a[c]<3then write(c)until eof end.

Wypróbuj online!

Wyjaśnienie:

var a:array['a'..'z']of word; //used for counting occurences of characters in the input
                              //array indices are accessed by chars
    c:char;
begin
  repeat
    read(c);                  //read a character from input
    inc(a[c]);                //increment the count of that character (its number in array)
    if a[c]<3 then write(c)   //if this is character's 1st or 2nd occurence, output it
  until eof                   //go back to reading if input is not read completely
end.
AlexRacer
źródło