Entfernen Sie den doppelten und vertauschten Fall

27

Tor

Das Ziel dieser Herausforderung ist: Geben Sie eine Zeichenfolge als Eingabe ein und entfernen Sie doppelte Buchstabenpaare, wenn das zweite Element des Paares die entgegengesetzte Groß- und Kleinschreibung aufweist. (dh Großbuchstaben werden zu Kleinbuchstaben und umgekehrt).

Paare sollten von links nach rechts ausgetauscht werden. Zum Beispiel aAasollte werden aaund nicht aA.

Beispiele

Eingänge Ausgänge:

Input:         Output:  
bBaAdD         bad     
NniIcCeE       Nice    
Tt eE Ss tT    T e S t 
sS Ee tT       s E t   
1!1!1sStT!     1!1!1st!
nN00bB         n00b    
(eE.gG.)       (e.g.)  
Hh3lL|@!       H3l|@!
Aaa            Aa
aaaaa          aaaaa
aaAaa          aaaa

Die Eingabe besteht aus druckbaren ASCII-Symbolen.

Sie sollten keine doppelten Ziffern oder andere Nichtbuchstaben entfernen.

Wissen

Diese Herausforderung ist das Gegenteil von @nicaels "Duplicate & Switch" -Fall . Kannst du es umkehren?

Vielen Dank für alle Mitwirkenden aus der Sandbox!

Katalog

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

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 + 2 (-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

aloisdg sagt Reinstate Monica
quelle
4
Haha, das ist NniIcCeE :)
Nicael
@ Nicael Ich bin froh, dass Sie zustimmen :)
Aloisdg sagt Reinstate Monica
Wofür wird ausgegeben abB? abBoder ab?
Downgoat
@ Downgoat abBsollte ausgebenab
Aloisdg sagt Reinstate Monica
1
@raznagul warum sollte es? Teilen Sie es auf aa:; aA; AA, nur das mittlere Paar stimmt mit dem Muster überein und wird aso aa; a; AA
LLlAMnYP

Antworten:

12

Gelee , 8 Bytes

ṛŒsḟḟȧµ\

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

Wie es funktioniert

ṛŒsḟḟȧµ\  Main link. Argument: s (string)

      µ   Convert all links to the left into a chain (unknown arity) and begin a
          new chain.
       \  Do a cumulative reduce by the chain to the left.
          Left argument:   r (previous result or first character)
          Right argument:  c (next character)
ṛ           Set the return value to c.
 Œs         Swap c's case.
    ḟ       Remove c from r (if present).
            This yields an empty string if c and r are identical (repeated letter
            with the same case or non-letter) and r otherwise.
            Note that r will be empty if the previous character has been removed.
   ḟ        Remove the resulting characters (if any) from c with swapped case.
            This yields c with swapped case if the result to the right does not
            contain c; otherwise, it yields the empty string.
     ȧ      Flat logical AND with c.
            Replace swapped case c with c; do not modify an empty string.
Dennis
quelle
Kürzer als der Regex!
Aloisdg sagt Reinstate Monica
2
Schlage Retina bei einer String Challenge ._.
TuxCrafting
11

Retina , 18 Bytes

(.)(?!\1)(?i)\1
$1

Probieren Sie es online!

Erläuterung

Dies ist eine einfache Ersetzung, die den relevanten Paaren entspricht und sie nur durch das erste Zeichen ersetzt. Die Paare werden abgeglichen, indem die Groß- / Kleinschreibung in der Mitte des Musters aktiviert wird:

(.)     # Match a character and capture it into group 1.
(?!\1)  # Use a negative lookahead to ensure that the next character *isn't* the same
        # as the character we just captured. This doesn't advance the position of the
        # regex engine's "cursor".
(?i)    # Now activate case-insensitivity for the remainder of the pattern.
\1      # Match the second character with a backreference to the first. With the i
        # modifier activated, this will match if the two characters only differ
        # by case.

Die Ersetzung schreibt einfach das Zeichen zurück, das wir bereits in der Gruppe erfasst 1haben.

Martin Ender
quelle
1
Gute Antwort! Debuggex funktioniert gut mit diesem!
Aloisdg sagt Reinstate Monica
5

Brachylog , 44 Bytes

.v|.l1|hA,?bhB(@uA;A@uB),?bb&~b.hA|?b&~b.h~h?

Brachylog hat keine regulären Ausdrücke.

Erläuterung

    .v          Input = Output = ""
|               OR
    .l1         Input = Output = string of one character
|               OR
    hA,         A is the first char or the Input
    ?bhB        B is the second char of the Input
    (
        @uA         B uppercased is A
        ;           OR
        A@uB        A uppercased is B
    ),
    ?bb&        Call recursively on Input minus the first two elements
    ~b.hA       Output is the result of that call with A appended before it
|               OR
    b&          Call recursively on Input minus the first element
    ~b.h~h?     Output is the result of that call with the first element of Input appended
                  before it
Tödlich
quelle
5

C # 87 75 Bytes

s=>System.Text.RegularExpressions.Regex.Replace(s,@"(.)(?!\1)(?i)\1","$1");

Mit dem mächtigen Regex von Martin Ender. C # Lambda, wo die Eingabe und die Ausgabe sind string.

12 Bytes von Martin Ender und TùxCräftîñg gespeichert.


C #, 141 134 Bytes

s=>{var r="";for(int i=0,l=s.Length;i<l;i++){var c=s[i];r+=c;if(char.IsLetter(c)&i+1<l&&(c|32)==(s[i+1]|32)&c!=s[i+1])i++;}return r;};

C # Lambda, wo die Eingabe und die Ausgabe sind string. Der Algorithmus ist naiv. Dies ist die, die ich als Referenz verwende.

Code:

s=>{
    var r = "";
    for(int i = 0; i < s.Length; i++)
    {
        r+=s[i];
        if (char.IsLetter(s[i]) & i+1 < s.Length)
            if (char.ToLower(s[i])==char.ToLower(s[i+1])
              & char.IsLower(s[i])!=char.IsLower(s[i+1]))
                i += 1;
    }       
    return r;
};

7 Bytes dank Martin Ender!


Probiere sie online aus!

aloisdg sagt Reinstate Monica
quelle
@ TùxCräftîñg Tatsächlich ist es aber einfach so zu lesen. Überprüfen Sie meine Golf-Version für eine weniger ausführliche Antwort :)
Aloisdg sagt Reinstate Monica
4

Perl, 40 24 + 1 = 25 Bytes

Verwenden Sie den gleichen regulären Ausdruck wie Martin.
Benutze die -pFlagge

s/(.)(?!\1)(?i)\1/\1/g

Teste es auf ideone

TuxCrafting
quelle
Wenn Sie das Flag -p verwenden, können Sie fast Ihren gesamten Code mit Ausnahme von s /// entfernen, um eine gute Speicherung zu erzielen!
Dom Hastings
4

Python 3, 64 59 58 Bytes

r=input()
for c in r:r=c[c.swapcase()==r!=c:];print(end=r)

Teste es auf Ideone .

Dennis
quelle
4

C 66 Bytes

l;main(c){for(;~(c=getchar());)l=l^c^32|!isalpha(c)?putchar(c):0;}
orlp
quelle
3

Pyth, 24 20 Bytes

4 Bytes dank @Jakube.

Dies verwendet immer noch Regex, aber nur zum Tokenisieren.

shM:zj\|+s_BVGrG1\.1

Testsuite.

shM:zj\|+s_BVGrG1\.1   input as z
         s_BVGrG1      generate ['aA', 'Aa', 'bB', 'Bb', ..., 'zZ', 'Zz']
        +        \.    add "." to the back of the array
     j\|               insert "|" between every element of the array,
                       forming a new long string, which will be our
                       tokenizer: "aA|Aa|bB|Bb|cC|Cc|...|yY|Yy|zZ|Zz|."
                       the "." at the end is to capture the remaining characters
  :z               1   return all matches of z against that regex
                       this is effectively a tokenizer
 hM                    take the first character of each token
s                      join all the transformed tokens together, and then
                       implicitly print to STDOUT.
  • 24-Byte-Version hier .
Undichte Nonne
quelle
3

JavaScript (ES6), 71-68 Byte

s=>s.replace(/./g,c=>l=c!=l&&c>'0'&&parseInt(c+l,36)%37<1?'':c,l='')

Erläuterung:

s=>s.replace(/./g,c=>   Loop over each character in the string
 l=                     Save result for next loop
  c!=l&&                Check whether characters differ
  c>'@'&&               Check minimum character code
  parseInt(c+l,36)%37<1 Check if characters have same value
  ?'':c,                If so then delete this character
 l='')                  Initial empty previous character

In Anbetracht c>'@', für die einzige Möglichkeit , parseInt(c+l,36)ein Vielfaches von 37 zu sein , ist sowohl für cund lden gleichen Wert haben (sie können nicht Null - Wert haben , weil wir Raum ausgeschlossen und Null, und wenn sie keinen Wert haben , dann wird der Ausdruck auswerten zu NaN<1denen false) ist, dass sie den gleichen Buchstaben haben. Wir wissen jedoch, dass bei Groß- und Kleinschreibung nicht die gleiche Groß- und Kleinschreibung beachtet werden muss.

Beachten Sie, dass dieser Algorithmus nur funktioniert, wenn ich jedes Zeichen überprüfe. Wenn ich versuche, es durch Übereinstimmungen mit Buchstaben zu vereinfachen, scheitert es an Dingen wie "a+A".

Bearbeiten: 3 Bytes dank @ edc65 gespeichert.

Neil
quelle
Verwenden Sie "Ersetzen" anstelle von "Karte". 68. Aber ich bin zu faul, um herauszufinden, wie man '' 'in einen Kommentar
einfügt
@ edc65 Ich brauche keine `s wenn ich benutze replace. (Ich hatte sie nur vorher, um zu versuchen, konsistent zu sein, aber dann habe ich meine Antwort beim Bearbeiten zur Einreichung abgelegt und wurde wieder inkonsistent. Seufz ...)
Neil
3

C, 129 127 125 107 106 105 93 92 90 88 85 78 Bytes

c;d;f(char*s){for(;putchar(c=*s);)s+=isalpha(c)*(d=*++s)&&(!((c^d)&95)&&c^d);}

AC Port meiner C # Antwort . Mein C kann ein bisschen schlecht sein. Ich benutze die Sprache nicht mehr oft. Jede Hilfe ist willkommen!

  • 1 Byte gespart dank Lowjackers Trick : a!=b=a^b
  • 1 Byte gespart dank Walpens Trick : a&&b=a*b
  • 12 Bytes von Lynns Trick gespeichert und hier von TùxCräftîñg inspiriert
  • Dank Joey Adams ' Trick 1 Byte gespart und hier inspiriert von orlp: Moving variable to global
  • 2 Bytes, die von SEJPM gespeichert wurden, indem mein (c|32)==(d|32)bitweises Problem behoben wurde
  • 5 Bytes von Pietu1998 gespeichert

Code:

c;d;f(char*s) {
    for(;putchar(c=*s);)
        s+=isalpha(c)*(d=*++s)&&(!((c^d)&95)&&c^d);
}

Probieren Sie es online!

aloisdg sagt Reinstate Monica
quelle
1
Ich denke, Sie können den Zeiger erhöhen, um einige Bytes zu sparen. Ich habe dies gefunden (ungetestet):f(char*s){while(*s) {char c=*s,d=s+1;putchar(c);s+=isalpha(c)&&d&&((c|32)==(d|32)&&c!=d);}}
TuxCrafting
@ TùxCräftîñg Ich habe diesen vergessen. Ich habe Ihren Vorschlag basierend auf der Antwort von Lynn korrigiert. Danke für die Hilfe!
Aloisdg sagt Reinstate Monica
1
Ich denke du kannst wechseln s+++1zu ++s.
PurkkaKoodari
@ Pietu1998 Ja das kann ich!
Aloisdg sagt Reinstate Monica
1
cund dwird immer druckbar sein ASCII, 95sollte also anstelle von arbeiten ~32. Auch ich denke c;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}würde funktionieren (aber ungetestet).
PurkkaKoodari
3

MATL , 21 Bytes

"Kk@k=K@XK=>?4XKx}K&h

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

Erläuterung

Dies verarbeitet jedes Zeichen in einer Schleife. Bei jeder Iteration wird das aktuelle Zeichen mit dem vorherigen Zeichen verglichen. Letzteres ist in der Zwischenablage K gespeichert, die 4standardmäßig aktiviert ist.

Das aktuelle Zeichen wird zweimal mit dem vorherigen verglichen: zuerst ohne Berücksichtigung der Groß- und Kleinschreibung und dann mit Berücksichtigung der Groß- und Kleinschreibung. Das aktuelle Zeichen sollte nur dann gelöscht werden, wenn der erste Vergleich wahr und der zweite falsch war. Beachten Sie, dass das erste Zeichen immer beibehalten wird, da die Zwischenablage K anfänglich 4 enthält.

Wenn das aktuelle Zeichen gelöscht wird, sollte die Zwischenablage K zurückgesetzt werden (damit das nächste Zeichen erhalten bleibt). Andernfalls sollte es mit dem aktuellen Zeichen aktualisiert werden.

"            % Take input string implicitly. For each char from this string:
  K          %   Push previous char, initiallized to number 4
  k          %   Convert to lower case. For numbers it rounds down
  @          %   Push current char
  k          %   Convert to lower case. 
  =          %   True if current and previous chars are (case-insensitively) equal
  K          %   Push previous char
  @          %   Push current char
  XK         %   Update clipboard K with current char. This doesn't affect the stack
  =          %   True if current and previous chars are (case-sensitively) equal
  >?         %   If first comparison was true and second was false
    4XKx     %     Reset clipboard K to 4
  }          %   Else
    K        %     Push previous char
    &h       %     Concatenate horizontally to gradually build the output string
Luis Mendo
quelle
2

Java 7, 66 Bytes

String c(String i){return i.replaceAll("(.)(?!\\1)(?i)\\1","$1");}

Benutzt Martin Enders Regex aus seiner Retina-Antwort .

Ungolfed & Testcode:

Probieren Sie es hier aus.

class Main{
  static String c(String i){
    return i.replaceAll("(.)(?!\\1)(?i)\\1", "$1");
  }

  public static void main(String[] a){
    System.out.println(c("bBaAdD"));
    System.out.println(c("NniIcCeE"));
    System.out.println(c("Tt eE Ss tT"));
    System.out.println(c("sS Ee tT"));
    System.out.println(c("1!1!1sStT!"));
    System.out.println(c("nN00bB"));
    System.out.println(c("(eE.gG.)"));
    System.out.println(c("Hh3lL|@!"));
    System.out.println(c("Aaa"));
    System.out.println(c("aaaaa"));
    System.out.println(c("aaAaa"));
  }
}

Ausgabe:

bad
Nice
T e S t
s E t
1!1!1st!
n00b
(e.g.)
H3l|@!
Aa
aaaaa
aaaa
Kevin Cruijssen
quelle
2

JavaScript (ES6), 61 Byte , 57 Byte

s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')

Vielen Dank an Neil für das Speichern von 5 Bytes.

cPu1
quelle
1
Schlechte Nachricht: Sie haben falsch gezählt, und das sind tatsächlich 62 Bytes. Gute Nachricht: Ich kann Ihnen fünf Bytes sparen! s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Neil
Oh, sorry, ich habe mit gezählt "code".length, habe nicht bemerkt, dass es eine Fluchtsequenz gibt. Danke
cPu1
Versuchen Sie es mit (code).toString().length.
Neil
Ja, oder(code+"").length
cPu1
1

JavaScript (ES6) 70

(s,p,q)=>s.replace(/./g,c=>p!=c&q===(d=parseInt(c,36))?q='':(q=d,p=c))

f=(s,p,q)=>s.replace(/./g,c=>p!=c&q===(d=parseInt(c,36))?q='':(q=d,p=c))

;
[['bBaAdD','bad']
,['NniIcCeE','Nice']
,['Tt eE Ss tT','T e S t']
,['sS Ee tT','s E t']
,['1!1!1sStT!','1!1!1st!']
,['nN00bB','n00b']
,['(eE.gG.)','(e.g.)']
,['Hh3lL|@!','H3l|@!']
,['Aaa','Aa']
,['aaaaa','aaaaa']
,['aaAaa','aaaa']]
.forEach(
  x=>
  {
    var i=x[0],k=x[1],r=f(i)
    console.log(k==r?'OK':'KO',i,r)
  }
)

edc65
quelle
OK, ich werde beißen. Warum das ===?
Neil
0==""aber nicht 0===""@Neil
edc65
1

Konvex, 18 Bytes

V±V.+'.+'|*\ô{0=}%

Probieren Sie es online!

Ähnliches Vorgehen wie bei der Antwort von @Leaky Nun's Pyth . Es erstellt das Array ["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.], verbindet sich mit dem '|Zeichen und testet die Eingabe basierend auf diesem regulären Ausdruck. Dann wird das erste Zeichen jedes Matches genommen.

GamrCorps
quelle