Verdreifache eine Zeichenfolge

39

Viele Sprachen verfügen über integrierte Methoden zum Entfernen von Duplikaten oder zum "Deduplizieren" oder "Eindeutigen" einer Liste oder Zeichenfolge. Eine seltenere Aufgabe ist es, eine Zeichenfolge zu "zerlegen". Das heißt, für jedes erscheinende Zeichen werden die ersten beiden Vorkommen beibehalten.

Hier ist ein Beispiel, in dem die Zeichen, die gelöscht werden sollen, mit gekennzeichnet sind ^:

aaabcbccdbabdcd
  ^    ^ ^^^ ^^
aabcbcdd

Ihre Aufgabe ist es, genau diese Operation zu implementieren.

Regeln

Die Eingabe ist eine einzelne, möglicherweise leere Zeichenfolge. Sie können davon ausgehen, dass es nur Kleinbuchstaben im ASCII-Bereich enthält.

Die Ausgabe sollte eine einzelne Zeichenfolge sein, wobei alle Zeichen entfernt werden, die bereits mindestens zweimal in der Zeichenfolge vorkommen (sodass die beiden am weitesten links stehenden Vorkommen beibehalten werden).

Anstelle von Strings können Sie auch mit Listen von Zeichen (oder Singleton-Strings) arbeiten, das Format muss jedoch zwischen Eingabe und Ausgabe konsistent sein.

Sie können ein Programm oder eine Funktion schreiben und eine unserer Standardmethoden zum Empfangen und Bereitstellen von Eingaben verwenden.

Sie können jede Programmiersprache verwenden , beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind.

Das ist , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .

Testfälle

Jedes Zeilenpaar ist ein Testfall, Eingabe gefolgt von Ausgabe.



xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd

Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert eine Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Martin Ender
quelle
5
Singleton-Saiten ... Saiten?
dkudriavtsev

Antworten:

15

JavaScript (ES6), 42 48

Bearbeite ganze 6 Bytes, die dank @Neil gespeichert wurden

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

Erläuterung: Ich verwende die Eigenschaften 'a' ... 'z' von object k, um Informationen für jedes Zeichen zu speichern (object k ist in diesem Fall ein regulärer Ausdruck, um nur Bytes zu speichern). Diese Eigenschaften sind zunächst undefined. In Javascript undefinedergibt das Hinzufügen einer Zahl zu " gives" NaN(durchaus sinnvoll), das Hinzufügen einer Zeichenfolge "X" jedoch "undefinedX"- eine Zeichenfolge mit der Länge 10 (albern). Wenn Sie mehr Zeichen hinzufügen, erhalten Sie längere Zeichenfolgen. Wenn die erhaltene Zeichenfolge für ein bestimmtes Zeichen länger als 11 ist, wird dieses Zeichen nicht in die Ausgabe kopiert.

Prüfung

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
quelle
Streng genommen ist eine Leerzeile einer der Testfälle.
Neil
@Neil ok hat die leere Zeichenfolge test
edc65 26.07.16
Wenn Sie zur Array-Eingabe und -Ausgabe wechseln, können Sie mit .filter 12 weitere Zeichen speichern. v=>v.filter(x=>!(v[x]+=x)[11]). Ein dickes Lob auf den "undefinierten" Hack.
Grax32
@Grax Danke aber zu unterschiedlich. Sollte es selbst
posten
14

Python 2, 48 Bytes

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

c[r.count(c)/2:]ist eine gleichlange Alternative zu c*(r.count(c)<2).


49 Bytes:

r=''
for c in input():r+=c*(r.count(c)<2)
print r
xnor
quelle
12

Retina , 17 Bytes

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

Probieren Sie es online!

Einfaches Ersetzen von Regex - Ordnen Sie ein Zeichen zu, wenn es bereits zweimal vorkommt, und entfernen Sie es.

Kobi
quelle
Ich habe auch versucht, eine Schleife und eine wiederholte Gruppe mit{2} , beide mit 18 Bytes.
Kobi
1
Ich habe 14 mit einer kürzlich hinzugefügten Funktion. ;)
Martin Ender
Ich wusste, dass da etwas war. Ich habe mir Grenzen angesehen, wahrscheinlich nicht diese. Ich werde es noch einmal überprüfen.
Kobi
3
Ah, ich glaube ich habe Martins Antwort gefunden. Ich hatte einige Probleme, als ich es vorher versuchte, ich denke, weil ich nicht darüber nachdachte, wie Deduplizieren bei einem mehrzeiligen Eingang funktionieren würde. Spoiler (mit 5 Bytes hinzugefügt, um den Pro-Zeile-Modus zu aktivieren): retina.tryitonline.net/…
FryAmTheEggman
@FryAmTheEggman - Schön, dass ich das hier nicht gefunden habe. Fühlen Sie sich frei, eine Antwort hinzuzufügen - ich denke, das ist zu unterschiedlich von meiner Antwort und ich habe es nicht gut gemocht, sie zu bearbeiten :P. Vielen Dank!
Kobi
6

Brachylog , 25 Bytes

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

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Erläuterung

Das funktioniert, weil erst s - Subsetmit größeren Teilmengen vereinheitlicht wird, also zB dafür vorher probiert "aaa"wird ."aa""a"

  • Hauptprädikat:

      .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
    
  • Prädikat 1: Stellen Sie sicher, dass alle Zeichen höchstens zweimal vorkommen. Eingabe =[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
    
  • Prädikat 2: Holen Sie sich ein Vorkommen eines Charakters. Eingabe =[String:Char]

    he         Take a character of the string in the input
      ~t?      That character is the char of the input
    
Tödlich
quelle
6

> <> , 22 Bytes

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

Probieren Sie es online! Verwendet die Codebox, um die bisherigen Zählungen zu verfolgen.

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
quelle
6

J, 20 15 Bytes

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

Dies definiert eine monadische Funktion, die einen String akzeptiert und zurückgibt. Probieren Sie es hier aus . Verwendungszweck:

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

Erläuterung

Ich habe auf denselben Algorithmus gewechselt, den einige andere Lösungen verwenden, da er sich als kürzer herausstellte ...

#~(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
quelle
6

Haskell, 40 39 Bytes

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

Anwendungsbeispiel: foldl(\s c->s++[c|filter(==c)s<=[c]])"" "aaabcbccdbabdcd"-> "aabcbcdd".

Behalten Sie das nächste Zeichen bei, cwenn die Zeichenfolge aller cbisherigen s weniger oder gleich der Singleton-Zeichenfolge ist [c].

Edit: @xnor hat ein Byte gespeichert, indem von Listenverständnis zu umgeschaltet wurde filter. Vielen Dank!

nimi
quelle
Ihre Alternative könnte filter(==c)s<=[c]ein Byte speichern.
XNOR
5

Perl, 22 Bytes

21 Byte Code + 1 für -p.

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

Verwendungszweck

perl -pe 's/./$&x(2>${$&}++)/ge' <<< 'aaabcbccdbabdcd'
aabcbcdd
Dom Hastings
quelle
5

C 57 Bytes

Rufen Sie f()mit der Zeichenfolge detriplicate. Die Funktion ändert ihren Parameter. Erfordert C99 wegen der for-loop-Deklaration.

f(char*p){for(char*s=p,m[256]={0};*s=*p;s+=++m[*p++]<3);}
owacoder
quelle
Kannst du die Erklärung von nicht sin die erste Aussage von setzen for?
Martin Ender
In C99 können Sie. Ich habe es einfach nicht getan, weil ich gerne Golf C89 kompatibel halte.
Owacoder
5

JavaScript (ES6), 35 Byte

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

Nimmt ein Array von Zeichen als Eingabe und gibt das detriplizierte Array zurück.

cPu1
quelle
Nett. Sie könnten c=>(s[c]=-~s[c])<3ein paar Bytes sparen.
ETHproductions
Ich hatte verpasst, dass Sie Arrays als Eingabe verwenden können und hatte eine Funktion mit geschrieben map. Golfen sah es im Wesentlichen aus wie bei Ihnen. Der Hauptunterschied war die Zuweisung, die beim Umschalten einige Bytes einspart. Versuchen Sie es s.filter(c=>(s[c]=s[c]+1|0)<3)mit 33 Bytes. EDIT: Whoops, Kommentar über mir verpasst haben , die sogar besser :)
Jan
4

PowerShell v2 +, 31 Byte

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

Verwendet den gleichen regulären Ausdruck wie in Kobis Retina-Antwort , der nur im PowerShell- -replaceOperator enthalten ist. Funktioniert, da beide .NET-Regex im Hintergrund verwenden.

Alternativ, ohne Regex, 56 Bytes

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

Erstellt ein Helfer-Array, das $bmit 0s gefüllt ist. Wandelt die Eingabezeichenfolge $args[0]in ein char-array um und leitet sie durch eine Schleife |%{...}. Bei jeder Iteration wird das aktuelle Zeichen $_als Zeichenfolge "$_"multipliziert mit einem Booleschen Wert ausgegeben, der nur dann $TRUE(implizit 1hierher gewandelt) wird, wenn der entsprechende Punkt im Hilfsarray kleiner ist als 2(dh, wir haben dieses Zeichen noch nicht zweimal gesehen). Die resultierende Sammlung von Zeichenfolgen wird in Parens eingekapselt und -joinzu einer einzigen Ausgabezeichenfolge zusammengefasst. Das bleibt in der Pipeline und die Ausgabe ist implizit.

AdmBorkBork
quelle
Regex ist unschlagbar. :) I beleave a Hashtable ist besser als ein Array für die Variante ohne regex: $b=@{};-join($args|% t*y|?{++$b.$_-lt3}).
mazzy
1
@mazzy Für die Variante ohne Regex und Ihren Code müsste es eine neuere Version als PowerShell 2 sein. Daher werde ich diese Antwort wohl unverändert beibehalten. Sie können Ihren Code jedoch auch als separate Antwort veröffentlichen!
AdmBorkBork
ist die hashtabelle in der version 3.0 aufgetaucht? Okay. Vielen Dank.
mazzy
4

Mathematica, 39 Bytes

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

Anonyme Funktion. Nimmt eine Zeichenliste als Eingabe und gibt die disziplinierte Liste als Ausgabe zurück. Verwendet die Methode des Umklappens der Liste und des Zurückweisens dreifacher Elemente, es ist nicht zu kompliziert.

LegionMammal978
quelle
4

05AB1E, 12 Bytes

vyˆ¯y¢O3‹iy?

Erläuterung

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

Probieren Sie es online aus

Emigna
quelle
4

MATL , 8 Bytes

t&=Rs3<)

Probieren Sie es online!

Erläuterung

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

Beispiel

Angenommen 'aaababbc', der Stack enthält nach den angegebenen Anweisungen Folgendes:

  • 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
quelle
4

Retina , 14 Bytes

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

Überprüfen Sie alle Testfälle. (Der %Aktiviert Pro-Line-Modus)

Verwendet die neue Stufe "Deduplizieren", um ein paar Bytes gegenüber Kobis Ansatz zu sparen . Deduplizieren sammelt eine Liste aller Übereinstimmungen mit dem regulären Ausdruck und ersetzt alle bis auf die erste durch die leere Zeichenfolge. Der reguläre Ausdruck stimmt mit einem Zeichen überein, das bereits einmal in der Zeichenfolge enthalten ist, sodass die ersten beiden Zeichen beibehalten werden.

FryAmTheEggman
quelle
3

K, 18 Bytes

  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 steht zum kostenlosen Download zur Verfügung . K6 ist in Entwicklung . Wenn Sie KDB heruntergeladen haben, können Sie mit Backslash in K einsteigen .

Es mag am einfachsten sein, dies auseinanderzubrechen, aber zuerst einige Syntax: g:xsetzt gauf x. {x+1}ist eine Funktion, die ein Argument x annimmt . In K ist das erste Argument für eine Funktion x(das zweite ist yund das dritte ist z. Benötige kein viertes).

Jetzt:

x:"aaabcbccdbabdcd"

=xbedeutet Gruppe x , die erzeugt:

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

2#'bedeutet zwei genommene (von) jeder, die erzeugt

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

Wie Sie sehen können, sind dies die Offsets der ersten beiden Übereinstimmungen jedes Charakters. Die 2 könnte verallgemeinert werden.

,/bedeutet verbinden und wird oft als raze bezeichnet . Es wird uns nur die Werte unseres Wörterbuchs bringen. So ,/"abcd"!(0 1;3 5;4 6;8 12)entsteht:

0 1 3 5 4 6 8 12

was wir sortieren müssen. {x@<x}@ist eine Redewendung, die K-Programmierer oft sehen (Q nennt sie asc ), die x beim Hochstufen x sagt . Brechen Sie es auseinander:

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

gab die Indizes des sortierten Arrays zurück, die wir aus dem ursprünglichen Array nehmen wollen. x@yBedeutet x bei y, so indiziert dies das Array mit den Indizes der Sortierung (falls dies irgendeinen Sinn ergibt).

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

was wir einfach jetzt in unserem ursprünglichen Array indizieren. Wir könntenx@ hier sagen , aber K unterstützt ein wirklich leistungsfähiges Konzept, das wir hier nutzen können: Funktionsanwendung ist Indizierung. Das bedeutet, dass a[0]der nullte Slot von nachgeschlagen aoder 0die aufgerufene Funktion angewendet werden könnte a. Der Grund , warum wir die benötigten @vorher in {x@<x}ist , weil x<yMittel xs weniger als ys : Operatoren in K eine dyadische Form haben (zwei Argumente) und eine monadische Form (ein Argument) , die von APL kommt. Q hat diese "Ambivalenz" nicht.

Geocar
quelle
Willkommen bei PPCG! Tolle erste Antwort. :)
Martin Ender
Ich habe ein paar Fragen. 1. Ist K4 dieselbe Sprache wie die, zu der Sie einen Link erstellen (Q / kdb +)? 2. Können Sie zeigen, wie Sie Ihre Funktion auf einem Eingang aufrufen oder wie die Elemente in testVectors.txt formatiert werden sollen?
Dennis
@ Tennis 1. Ja. g"aaabcbccdbabdcd"
Drücken Sie den umgekehrten
OK danke. Konnte den Dateiteil nicht zum Laufen bringen, macht aber g"..."den Trick. Leider wird Ihr Code aabbcczur Eingabe zurückgegeben abc.
Dennis
@ Tennis Sie haben vielleicht etwas falsch gemacht: auf {x{?x@<x}@,/2#'=x}"abc"jeden Fall zurück "abc". Es würde zurückkehren, "aabbcc"wenn Sie den ?Unterschied verpassen .
Geocar
2

Python 2, 51 Bytes

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

Teste es auf Ideone .

Dennis
quelle
2

Java 8 Lambda, 90 Zeichen

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

Ungolfed-Version:

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

Erstellt ein Array für alle ASCII-Zeichen. Wenn ein Zeichen vorkommt, wird der entsprechende Zähler erhöht. Wenn es über 2 liegt, wird das Zeichen nicht an die Ergebniszeichenfolge angehängt. Sehr einfach, sehr kurz;)

Frozn
quelle
2

Perl 6, 27 Bytes

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

Erläuterung:

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

(Hinweis: Perl 6 ist nicht so "golforientiert" wie seine Schwester Perl 5 ... Also ja, dieser Platz vor dem <ist notwendig. Das %.{}ist ein anonymer Hash).

Ven
quelle
24 Bytes
Jo King
2

SmileBASIC, 77 72 69 68 Bytes

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

Erklärt:

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
quelle
Willkommen bei ppcg! Schöner erster Beitrag!
24.
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)

Hübsch bedruckt

(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)
Core-Dump
quelle
1

Q , 52 Bytes

q)f2:{x asc raze{distinct 2#where x}each x~'/:distinct x}
q)f2 each testList
"xx"
"abcabc"
"abcdabc"
"abacbdc"
"aabcbcdd"
q)
Chromozorz
quelle
1

K , 27 Bytes

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

Ruby , 79 62 57 Bytes

Das ist ziemlich unhandlich, aber ich bin mir nicht sicher, ob ich im Moment so viel besser Golf spielen kann. Anregungen zum Golfen sind willkommen. Probieren Sie es online!

Bearbeiten: -17 Bytes dank Value Ink, indem eine bessere Methode zum Entfernen dreifacher Zeichen vorgeschlagen wird. -5 Bytes vom Entfernen der .uniqMethode.

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

Ungolfed:

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
quelle
62 Bytes:->s{s.chars.uniq.map{|a|s[s.rindex a]=""while s.count(a)>2};s}
Value Ink
1

JavaScript, 30 Bytes

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

Mit der Methode, die @ edc65 zum Zählen entwickelte, aber mit einem Arrayfilter. Das erste Mal, wenn ein Zeichen erscheint, wird der Objektwert "undefined" plus das Zeichen (dh "undefinedx"). Beim nächsten Mal wird der Objektwert "undefinedxx".

Danach gibt v [x] [11] true zurück, und in Kombination mit dem Operator not wird false zurückgegeben, was bedeutet, dass Zeichen, die bereits zweimal vorkommen, gefiltert werden.

Grax32
quelle
0

Javascript (mit externer Bibliothek) (80 Bytes)

Das war gut! Hat nicht gewonnen, aber es hat Spaß gemacht

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

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

Codeerklärung: Die Methode akzeptiert eine Zeichenfolge, die Bibliothek analysiert sie als Zeichenarray, und die Where-Klausel ist ein komplexes Filterprädikat, das die 'a'-Hashmap auf Vorhandensein des aktuellen Zeichens überprüft. Wenn vorhanden, Inkrementzähler, sonst auf 1 gesetzt. Wenn <2, besteht das Prädikat (und das aktuelle Zeichen), sonst schlägt fehl

Bildbeschreibung hier eingeben

applejacks01
quelle
Sie können mit einer vermeiden , returnaber machen Sie Ihre Funktion eine durch Kommata getrennte Liste von einem Ausdrücke in Klammern: n=>(a={},_From(n)....). Der letzte Ausdruck ist der Rückgabewert. In Ihrer WhereFunktion können Sie die Zwischen beseitigen bvollständig durch einen Vergleich gegen das Ergebnis der Zuordnung oder Schritt: x=>(a[x]?a[x]++:a[x]=1)<2.
Apsillers
Schließlich können Sie eine externe Bibliothek überhaupt vermeiden , mit (und speichert Bytes) mit den String-split Ellipsen und filtermit join: [...n].filter(...).join(""). Drehen Sie die Wahr / Falsch - Logik beim Wechsel Wherezu filter.
Apsillers
Ahh gute Beobachtungen!
Werfen Sie
0

Clojure, 72 Bytes

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

So viele Bytes ...

NikoNyrh
quelle
0

Pascal (FPC) , 103 Bytes

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.

Probieren Sie es online!

Erläuterung:

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
quelle