Yinelenen ve değiştirilen kasayı kaldır


27

Hedef

Bu zorluğun amacı şudur: girdi olarak bir dize verilirse, çiftin ikinci maddesi ters büyük harfle yazılıyorsa, çift harf çiftlerini kaldırın. (yani büyük harf küçük harf olur veya tersi olur).

Çiftler soldan sağa değiştirilmelidir. Örneğin, aAaolmalı aave olmamalı aA.

örnekler

Girişler ve çıkışlar:

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

Giriş, yazdırılabilir ASCII sembollerinden oluşur.

Kopyalanan rakamları veya diğer harf olmayan karakterleri kaldırmamalısınız.

alındı

Bu meydan okuma @nicael'in "Duplicate & switch case" in tam tersidir . Tersine çevirir misin?

Sanal alandaki tüm katılımcılar için teşekkür ederiz !

Katalog

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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


4
Haha, bu NniIcCeE :)
nicael,

Sana :) onaylamak memnunum @nicael
aloisdg eski haline Monica diyor

için çıkış ne: abB? abBya ab?
Downgoat

@Downgoat abBçıkış yapmalıab
aloisdg Reinstate Monica

1
@raznagul neden olmasın? Böl aa:; aA; AASadece orta çifti deseni eşleşir ve olur aböylece, aa; a; AA
LLlAMnYP

Yanıtlar:


12

Jöle , 8 bayt

ṛŒsḟḟȧµ\

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

ṛŒ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.

Regex'in lanetlenmesinden daha kısa!
aloisdg diyor Reinstate Monica

2
Bir üzerinde Retina çırpın dize meydan ._.
TuxCrafting

11

Retina , 18 bayt

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

Çevrimiçi deneyin!

açıklama

İlgili çiftlerle eşleşen ve sadece ilk karakterle yer değiştiren tek (ve oldukça basit) bir oyuncu değişikliği. Çiftler, modelin yarısında büyük / küçük harfe duyarsızlığı etkinleştirerek eşleştirilir:

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

Değişim zaten zaten grupta yakaladığımız karakteri geri yazıyor 1.


1
Güzel cevap! Debuggex bununla harika çalışıyor!
aloisdg diyor Reinstate Monica

5

Brachylog , 44 bayt

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

Brachylog'un düzenli ifadeleri yok.

açıklama

    .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

5

C #, 87 75 bayt

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

İle kudretli regex Martin Ender dan. C # lambda burada girdi ve çıktı string.

Martin Ender ve TùxCräftîñg tarafından kaydedilen 12 bayt.


C #, 141 134 bayt

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 burada girdi ve çıktı string. Algoritma saftır. Bu referans olarak kullandığım.

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

Martin Ender sayesinde 7 bayt!


Onları çevrimiçi deneyin!


@ TùxCräftîñg Gerçekten de böyle okumak kolaydır. :) cevap ayrıntılı bir az benim golfed sürümünü kontrol
aloisdg eski durumuna Monica diyor

4

Perl, 40 24 + 1 = 25 bayt

Martin ile aynı regex kullanın. Bayrağı
kullan-p

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

İdeone üzerinde test et


-P bayrağını kullanırsanız, iyi bir tasarruf için s /// hariç hemen hemen tüm kodunuzu kaldırabilirsiniz!
Dom Hastings,

4

Python 3, 64 59 58 bayt

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

İdeone üzerinde test et .


4

C, 66 bayt

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

3

Pyth, 24 20 bayt

@Jakube sayesinde 4 bayt.

Bu hala regex kullanır, ancak sadece belirtmek için.

shM:zj\|+s_BVGrG1\.1

Test odası.

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.

3

JavaScript (ES6), 71 68 bayt

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

Açıklama:

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

Verilen c>'@', tek yolu parseInt(c+l,36)37 katı olması hem içindir cve l(biz uzay ve sıfır hariç çünkü onlar sıfır değerine sahip olamaz ve hiçbir değeri yoktur, o zaman ifade etmek değerlendirecek aynı değere sahip NaN<1olan bir false) aynı harf olması onlar içindir. Bununla birlikte, harflerin duyarlı bir şekilde aynı harf olmadıklarını biliyoruz, bu yüzden duyarsız bir şekilde aynı olmaları gerekiyor.

Bu algoritmanın sadece her karakteri kontrol edersem çalıştığını unutmayın; Harfleri eşleştirerek basitleştirmeye çalışırsam, bunun gibi şeylerde başarısız olur "a+A".

Düzenleme: @ edc65 sayesinde 3 bayt kaydedildi.


Harita yerine değiştirin kullanın. 68. Ama nasıl bir yorum içine '' 'koyacağımı anlamaya çok tembelim (güzel hile mod 37)
edc65

@ edc65 ben hiçbirine ihtiyacım yok `ben kullanırsanız s replace. (Sadece tutarlı olması için denemek için önce onları vardı, ama sunulması için, düzenleme sırasında sonra ben cevabımı golfed ve yine tutarsızlık başladı Kederlen ....)
Neil

3

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

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

C # cevabımın AC portu . Benim C'm biraz kötü olabilir. Artık dili pek kullanmıyorum. Herhangi bir yardım açığız!

  • Lowjacker'in numarası sayesinde 1 bayt kurtarıldı : a!=b=a^b
  • 1 bayt Walpen en sayesinde kaydedilen hile : a&&b=a*b
  • 12 byte Lynn'in tarafından kaydedilmiş hile ve TùxCräftîñg burada ilham
  • Joey Adams'ın hilesi sayesinde 1 bayt kurtarıldı ve orlp'ten buraya ilham verdi: Değişkeni global hale getirme
  • Benim gidererek SEJPM tarafından kaydedilen 2 byte (c|32)==(d|32)bit düzeyinde sorunu
  • Pietu1998 tarafından kaydedilen 5 bayt

Kod:

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

Çevrimiçi deneyin!


1
Sanırım bazı baytları kaydetmek için işaretçiyi artırabilirsin. Bunu buldum (denenmemiş):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 Bu konuyu unuttum. Lynn cevabını temel alarak önerinizi düzelttim. Yardım için teşekkürler!
aloisdg diyor Reinstate Monica

1
Ben değiştirebileceğiniz düşünmek s+++1için ++s.
PurkkaKoodari

@ Pietu1998 Gerçekten yapabilirim!
aloisdg diyor Reinstate Monica

1
cve dher zaman ASCII yazdırılabilir olacak, bu yüzden 95yerine çalışması gerekir ~32. Ayrıca, bence c;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}işe yarayacak (ancak denenmemiş).
PurkkaKoodari

3

MATL , 21 bayt

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

Çevrimiçi deneyin! . Veya tüm test durumlarını doğrulayın .

açıklama

Bu, bir döngüdeki her karakteri işler. Her yineleme, geçerli karakteri önceki karakterle karşılaştırır. Sonuncusu, 4varsayılan olarak başlatılan K panosunda saklanır .

Mevcut karakter öncekiyle iki kere karşılaştırılır: önce büyük / küçük harfe duyarsız, sonra büyük / küçük harfe duyarlı. Geçerli karakter, yalnızca ilk karşılaştırma doğruysa, ikincisi yanlışsa ve silinmelidir. Pano K başlangıçta 4 içerdiğinden, ilk karakterin her zaman tutulacağını unutmayın.

Mevcut karakter silinirse, pano K sıfırlanmalıdır (bir sonraki karakter korunacaktır); aksi takdirde geçerli karakterle güncellenmelidir.

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

2

Java 7, 66 bayt

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

Kullanılan onun Retina cevaptan Martin Ender'in normal ifade .

Ungolfed ve test kodu:

Burada dene.

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

Çıktı:

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

2

JavaScript (ES6), 61 bayt , 57 Bayt

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

Neil'e 5 bayt kaydettiği için teşekkürler .


1
Kötü haber: yanlış saydın ve bu aslında 62 byte. Müjde: Size beş byte kazandırabilirim! s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Neil,

Üzgünüm, kullanarak saydım "code".length, orada bir kaçış dizisi olduğunu anlamadım. Thanks
cPu1

Kullanmayı deneyin (code).toString().length.
Neil,

Evet, veya(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)
  }
)


Tamam, ısırırım. Neden ===?
Neil,

0==""ama değil 0===""@Neil
edc65 18:16

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.