Hapus duplikat & switched case

27

Tujuan

Tujuan dari tantangan ini adalah: memberikan string sebagai input, menghapus duplikat pasangan huruf, jika item kedua dalam pasangan adalah kapitalisasi yang berlawanan. (Yaitu huruf besar menjadi huruf kecil dan sebaliknya).

Pasangan harus diganti dari kiri ke kanan. Misalnya, aAaharus menjadi aadan tidak aA.

contoh

Input & output:

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

Input terdiri dari simbol ASCII yang dapat dicetak.

Anda tidak boleh menghapus digit yang digandakan atau karakter non-huruf lainnya.

Pengakuan

Tantangan ini adalah kebalikan dari "kasus Duplikat & saklar" @nicael . Bisakah kamu membalikkannya?

Terima kasih untuk semua kontributor dari kotak pasir!

Katalog

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

aloisdg kata Reinstate Monica
sumber
4
Haha, itu NniIcCeE :)
nicael
@nicael Saya senang Anda menyetujui :)
aloisdg mengatakan Reinstate Monica
apa output untuk: abB? abBatau ab?
Downgoat
@Downgoat abBharus menampilkanab
aloisdg mengatakan Reinstate Monica
1
@raznagul kenapa begitu? Membaginya: aa; aA; AA, hanya pasangan tengah yang sesuai dengan pola dan menjadi a, jadi aa; a; AA
LLlAMnYP

Jawaban:

12

Jelly , 8 byte

ṛŒsḟḟȧµ\

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ṛŒ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
sumber
Lebih pendek dari Regex!
Aloisdg mengatakan Reinstate Monica
2
Kalahkan Retina dengan tantangan string ._.
TuxCrafting
11

Retina , 18 byte

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

Cobalah online!

Penjelasan

Ini satu (dan cukup sederhana) substitusi yang cocok dengan pasangan yang relevan dan menggantinya dengan hanya karakter pertama. Pasangan ini dicocokkan dengan mengaktifkan insensitivitas kasus di tengah pola:

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

Substitusi hanya menulis kembali karakter yang sudah kita tangkap dalam grup 1.

Martin Ender
sumber
1
Jawaban bagus! Debuggex bekerja sangat baik untuk yang satu ini!
aloisdg mengatakan Reinstate Monica
5

Brachylog , 44 byte

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

Brachylog tidak memiliki ekspresi reguler.

Penjelasan

    .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
Fatalisasi
sumber
5

C #, 87 75 byte

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

Dengan regex yang perkasa dari Martin Ender. C # lambda di mana input dan output beradastring .

12 byte disimpan oleh Martin Ender dan TùxCräftîñg.


C #, 141 134 byte

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 di mana input dan output berada string. Algoritma itu naif. Ini yang saya gunakan sebagai referensi.

Kode:

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 byte berkat Martin Ender!


Cobalah secara online!

aloisdg kata Reinstate Monica
sumber
@ TùxCräftîñg Memang tetapi mudah dibaca seperti ini. Periksa versi
golf
4

Perl, 40 24 + 1 = 25 byte

Gunakan regex yang sama dengan Martin.
Gunakan -pbendera

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

Uji di ideone

TuxCrafting
sumber
Jika Anda menggunakan flag -p, Anda dapat menghapus hampir semua kode Anda kecuali s /// untuk penghematan yang bagus!
Dom Hastings
4

Python 3, 64 59 58 byte

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

Uji di Ideone .

Dennis
sumber
4

C, 66 byte

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

Pyth, 24 20 byte

4 byte berkat @Jakube.

Ini masih menggunakan regex, tetapi hanya untuk tokenizing.

shM:zj\|+s_BVGrG1\.1

Suite uji.

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.
  • Versi 24 byte di sini .
Biarawati Bocor
sumber
3

JavaScript (ES6), 71 68 byte

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

Penjelasan:

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

Mengingat c>'@', satu-satunya cara untuk parseInt(c+l,36)menjadi kelipatan 37 adalah untuk keduanya cdan lmemiliki nilai yang sama (mereka tidak dapat memiliki nilai nol karena kami mengecualikan ruang dan nol, dan jika mereka tidak memiliki nilai maka ekspresi akan mengevaluasi keNaN<1 yang false) adalah bagi mereka untuk menjadi surat yang sama. Namun, kita tahu bahwa mereka bukan huruf yang sama-sensitif, jadi mereka harus sama-tidak sensitif.

Perhatikan bahwa algoritma ini hanya berfungsi jika saya memeriksa setiap karakter; jika saya mencoba menyederhanakannya dengan mencocokkan pada huruf maka akan gagal pada hal-hal seperti "a+A".

Sunting: Disimpan 3 byte berkat @ edc65.

Neil
sumber
Gunakan ganti bukan peta. 68. Tapi saya terlalu malas untuk mencari tahu bagaimana memasukkan '' 'di dalam komentar (trik bagus mod 37)
edc65
@ edc65 Saya tidak butuh apapun `jika saya gunakan replace. (Saya hanya meminta mereka sebelumnya untuk mencoba konsisten, tetapi kemudian saya memasukkan jawaban saya sambil mengeditnya untuk pengiriman dan menjadi tidak konsisten lagi. Sigh ...)
Neil
3

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

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

Port AC jawaban C # saya . C saya mungkin agak buruk. Saya tidak lagi menggunakan bahasa itu. Setiap bantuan dipersilahkan!

  • 1 byte disimpan berkat trik Lowjacker : a!=b=a^b
  • 1 byte disimpan berkat trik Walpen : a&&b=a*b
  • 12 byte disimpan oleh trik Lynn dan terinspirasi di sini oleh TùxCräftîñg
  • 1 byte disimpan berkat trik Joey Adams dan terinspirasi di sini oleh orlp: Memindahkan variabel ke global
  • 2 byte disimpan oleh SEJPM dengan menyelesaikan (c|32)==(d|32)masalah bitwise saya
  • 5 byte disimpan oleh Pietu1998

Kode:

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

Cobalah online!

aloisdg kata Reinstate Monica
sumber
1
Saya pikir Anda dapat menambahkan pointer untuk menghemat beberapa byte. Saya telah menemukan ini (belum diuji):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 Saya lupa tentang yang ini. Saya mengoreksi proposisi Anda berdasarkan jawaban Lynn. Terima kasih atas bantuannya!
aloisdg berkata Reinstate Monica
1
Saya pikir Anda bisa berubah s+++1menjadi ++s.
PurkkaKoodari
@ Pietu1998 Memang saya bisa!
aloisdg berkata Reinstate Monica
1
cdan dakan selalu dapat dicetak ASCII, jadi 95harus berfungsi sebagai gantinya ~32. Juga, saya pikir c;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}akan berhasil (tetapi belum diuji).
PurkkaKoodari
3

MATL , 21 byte

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

Cobalah online! . Atau verifikasi semua kasus uji .

Penjelasan

Ini memproses setiap karakter dalam satu lingkaran. Setiap iterasi membandingkan karakter saat ini dengan karakter sebelumnya. Yang terakhir disimpan dalam clipboard K, yang diinisialisasi ke 4secara default.

Karakter saat ini dibandingkan dengan yang sebelumnya dua kali: pertama case-insensitive dan kemudian case sensitif. Karakter saat ini harus dihapus jika dan hanya jika perbandingan pertama benar dan yang kedua salah. Perhatikan bahwa, karena clipboard K awalnya berisi 4, karakter pertama akan selalu disimpan.

Jika karakter saat ini dihapus clipboard K harus diatur ulang (sehingga karakter selanjutnya akan disimpan); jika tidak, harus diperbarui dengan karakter saat ini.

"            % 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
sumber
2

Java 7, 66 byte

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

Menggunakan regex Martin Ender dari jawaban Retina-nya .

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

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

JavaScript (ES6), 61 byte , 57 Bytes

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

Terima kasih kepada Neil untuk menghemat 5 byte.

cPu1
sumber
1
Berita buruk: Anda salah menghitung, dan itu sebenarnya 62 byte. Berita bagus: Saya bisa menghemat lima byte! s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Neil
Oh, maaf, saya menghitung menggunakan "code".length, tidak menyadari ada urutan melarikan diri di sana. Terima kasih
cPu1
Coba gunakan (code).toString().length.
Neil
Ya, atau(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
sumber
Oke, saya akan gigit. Mengapa ===?
Neil
0==""tetapi tidak 0===""@ Neil
edc65
1

Cembung, 18 byte

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

Cobalah online!

Pendekatan serupa dengan jawaban Pyth @Leaky Nun . Itu membangun array ["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.], bergabung dengan '|karakter, dan menguji input berdasarkan regex itu. Kemudian dibutuhkan karakter pertama dari setiap pertandingan.

GamrCorps
sumber