Usuń zduplikowaną i przełączoną obudowę

27

Cel

Celem tego wyzwania jest: biorąc pod uwagę ciąg znaków, usuń zduplikowane pary liter, jeśli drugi element w parze ma przeciwne wielkie litery. (tzn. wielkie litery stają się małe i odwrotnie).

Pary należy wymieniać od lewej do prawej. Na przykład aAapowinien zostać aai nie aA.

przykłady

Wejścia wyjścia:

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

Dane wejściowe składają się z drukowanych symboli ASCII.

Nie należy usuwać zduplikowanych cyfr ani innych znaków innych niż litery.

Potwierdzenie

To wyzwanie jest przeciwieństwem „Duplicate & switch case” @nicael . Czy możesz to odwrócić?

Dziękujemy za wszystkich współpracowników z piaskownicy!

Katalog

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli 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 + 2 (-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

aloisdg mówi Przywróć Monikę
źródło
4
Haha, to jest NniIcCeE :)
nicael
@nicael Cieszę się, że zatwierdzasz :)
aloisdg mówi Przywróć Monikę
jaka jest wydajność dla abB:? abBczy ab?
Downgoat
@Downgoat abBpowinien wypisaćab
aloisdg mówi Przywróć Monikę
1
@raznagul dlaczego miałby to zrobić? Podzielić go: aa; aA; AA, tylko środkowa para pasuje do wzoru i staje się a, więc aa; a; AA
LLlAMnYP

Odpowiedzi:

12

Galaretka , 8 bajtów

ṛŒsḟḟȧµ\

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ṛŒ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
źródło
Cholera niższa od Regex!
aloisdg mówi Reinstate Monica
2
Pokonaj siatkówkę na wyzwaniu strunowym ._.
TuxCrafting
11

Siatkówka , 18 bajtów

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

Wypróbuj online!

Wyjaśnienie

Jest to pojedyncze (i dość proste) podstawienie, które pasuje do odpowiednich par i zastępuje je tylko pierwszą postacią. Pary są dopasowywane przez aktywację rozróżniania wielkości liter w połowie wzoru:

(.)     # 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.

Zastąpienie po prostu odpisuje postać, którą już złapaliśmy w grupie 1.

Martin Ender
źródło
1
Niezła odpowiedź! Debuggex działa świetnie z tym!
aloisdg mówi Przywróć Monikę
5

Brachylog , 44 bajty

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

Brachylog nie ma wyrażeń regularnych.

Wyjaśnienie

    .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
Fatalizować
źródło
5

C #, 87 75 bajtów

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

Z potężnym regexem Martina Endera. C # lambda, gdzie znajdują się dane wejściowe i wyjściowe string.

12 bajtów zapisanych przez Martina Endera i TùxCräftîñga.


C #, 141 134 bajtów

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, gdzie znajdują się dane wejściowe i wyjściowe string. Algorytm jest naiwny. Tego używam jako odniesienia.

Kod:

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 bajtów dzięki Martinowi Enderowi!


Wypróbuj je online!

aloisdg mówi Przywróć Monikę
źródło
@ TùxCräftîñg Rzeczywiście, ale łatwo to odczytać w ten sposób. Sprawdź moją wersję w golfa, aby uzyskać mniej szczegółową odpowiedź :)
aloisdg mówi Przywróć Monikę
4

Perl, 40 24 + 1 = 25 bajtów

Użyj tego samego wyrażenia regularnego co Martin.
Użyj -pflagi

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

Przetestuj na ideonie

TuxCrafting
źródło
Jeśli użyjesz flagi -p, możesz usunąć prawie cały kod z wyjątkiem s /// dla dobrego oszczędzania!
Dom Hastings
4

Python 3, 64 59 58 bajtów

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

Przetestuj na Ideone .

Dennis
źródło
4

C, 66 bajtów

l;main(c){for(;~(c=getchar());)l=l^c^32|!isalpha(c)?putchar(c):0;}
orlp
źródło
3

Pyth, 24 20 bajtów

4 bajty dzięki @Jakube.

Nadal używa wyrażeń regularnych, ale tylko do tokenizacji.

shM:zj\|+s_BVGrG1\.1

Zestaw testowy.

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.
  • Wersja 24-bajtowa tutaj .
Leaky Nun
źródło
3

JavaScript (ES6), 71 68 bajtów

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

Wyjaśnienie:

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

Biorąc pod uwagę c>'@', jedynym sposobem, parseInt(c+l,36)aby być wielokrotnością liczby 37, jest oboje ci lmieć tę samą wartość (nie mogą mieć wartości zerowej, ponieważ wykluczyliśmy spację i zero, a jeśli nie mają żadnej wartości, wyrażenie oceni, NaN<1która jest false) oznacza, że ​​mają być tą samą literą. Wiemy jednak, że wielkość liter nie jest rozróżniana, więc muszą być rozróżniani.

Zauważ, że ten algorytm działa tylko wtedy, gdy sprawdzę każdy znak; jeśli spróbuję to uprościć, dopasowując litery, to nie powiedzie się na przykładach "a+A".

Edycja: Zapisano 3 bajty dzięki @ edc65.

Neil
źródło
Użyj zamień zamiast mapy. 68. Ale jestem zbyt leniwy, aby wymyślić, jak wstawić `` '' w komentarzu (fajna sztuczka mod 37)
edc65
@ edc65 Nie potrzebuję żadnych, `jeśli używam replace. (Miałem tylko je przed starać się być spójne, ale potem grałem moją odpowiedź podczas edycji składania i stał się ponownie niezgodne Ech ....)
Neil
3

C, 129 127 125 107 106 105 93 92 90 88 85 78 bajtów

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

Port AC mojej odpowiedzi C # . Moje C może być trochę złe. Często nie używam tego języka. Każda pomoc jest mile widziana!

  • 1 bajt zapisany dzięki Lowjacker za podstęp : a!=b=a^b
  • 1 bajt zapisany dzięki Walpen za podstęp : a&&b=a*b
  • 12 bajtów zapisanych przez sztuczkę Lynn i zainspirowanych tutaj przez TùxCräftîñg
  • 1 bajt zapisany dzięki sztuczce Joeya Adamsa i zainspirowany tutaj przez orlp: Przenoszenie zmiennej na globalną
  • 2 bajty zapisane przez SEJPM, rozwiązując mój (c|32)==(d|32)problem bitowy
  • 5 bajtów zapisanych przez Pietu1998

Kod:

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

Wypróbuj online!

aloisdg mówi Przywróć Monikę
źródło
1
Myślę, że możesz zwiększyć wskaźnik, aby zaoszczędzić trochę bajtów. Znalazłem to (niesprawdzone):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 Zapomniałem o tym. Poprawiłem twoją propozycję na podstawie odpowiedzi Lynn. Dziękuję za pomoc!
aloisdg mówi Przywróć Monikę
1
Myślę, że możesz się zmienić s+++1na ++s.
PurkkaKoodari,
@ Pietu1998 Rzeczywiście mogę!
aloisdg mówi Przywróć Monikę
1
ci dzawsze będzie można wydrukować ASCII, więc 95powinno działać zamiast ~32. Myślę też, że c;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}zadziałałoby (ale nie zostało przetestowane).
PurkkaKoodari
3

MATL , 21 bajtów

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

Wypróbuj online! . Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Przetwarza to każdy znak w pętli. Każda iteracja porównuje obecną postać z poprzednią postacią. Ten ostatni jest przechowywany w schowku K, który jest 4domyślnie inicjowany.

Obecny znak jest porównywany z poprzednim dwukrotnie: najpierw bez rozróżniania wielkości liter, a następnie z rozróżnianiem wielkości liter. Obecny znak powinien zostać usunięty tylko wtedy, gdy pierwsze porównanie było prawdziwe, a drugie fałszywe. Zauważ, że ponieważ schowek K początkowo zawiera 4, pierwszy znak zawsze zostanie zachowany.

Jeśli bieżący znak zostanie usunięty, schowek K powinien zostać zresetowany (aby następny znak został zachowany); w przeciwnym razie powinien zostać zaktualizowany o obecną postać.

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

Java 7, 66 bajtów

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

Wykorzystał regex Martina Endera z odpowiedzi Retina .

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

bad
Nice
T e S t
s E t
1!1!1st!
n00b
(e.g.)
H3l|@!
Aa
aaaaa
aaaa
Kevin Cruijssen
źródło
2

JavaScript (ES6), 61 bajtów , 57 bajtów

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

Podziękowania dla Neila za oszczędność 5 bajtów.

cPu1
źródło
1
Złe wieści: przeliczyłeś się, a to w rzeczywistości 62 bajty. Dobra wiadomość: mogę zaoszczędzić ci pięć bajtów! s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Neil
Och, przepraszam, liczyłem na użycie "code".length, nie zdawałem sobie sprawy, że jest tam sekwencja ucieczki. Dzięki
cPu1
Spróbuj użyć (code).toString().length.
Neil,
Tak, lub(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
źródło
OK, ugryzę. Dlaczego ===?
Neil
0==""ale nie 0===""@Neil
edc65
1

Wypukły, 18 bajtów

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

Wypróbuj online!

Podobne podejście jak w Pyth @Leaky Nun . Konstruuje tablicę ["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.], łączy '|znak i testuje dane wejściowe na podstawie tego wyrażenia regularnego. Następnie bierze pierwszą postać każdego meczu.

GamrCorps
źródło