重複して切り替えられたケースを削除する


27

ゴール

このチャレンジの目標は、入力として文字列を指定し、ペアの2番目の項目が大文字と反対の場合、重複する文字のペアを削除することです。(つまり、大文字は小文字になり、その逆も同様です)。

ペアは左から右に交換する必要があります。たとえば、にaAaなるべきでaaあり、ではありませんaA

例

入力と出力:

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

入力は、印刷可能なASCIIシンボルで構成されます。

重複した数字やその他の文字以外の文字を削除しないでください。

了承

この課題は、@ nicaelの"Duplicate&switch case"の反対です。逆にできますか?

サンドボックスからのすべての貢献者に感謝します!

カタログ

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


4
ハハ、それはNniIcCeEです:)
nicael

@nicaelあなたが承認してくれてうれしいです:)
aloisdgは、モニカを復活させる

次の出力は何abBですか?abBまたはab
ダウンゴート

@Downgoat abB出力すべきab
aloisdgは回復モニカ言う

1
@raznagulどうしてですか?それを分割します:aa; aA; AA、真ん中のペアのみがパターンに一致しa、そうなるaa; a; AA
LLlAMnYP

回答:


12

ゼリー、8 バイト

ṛŒsḟḟȧµ\

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

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

正規表現よりも短い!
aloisdgは、モニカを復活させる

2
ストリングチャレンジでRetinaを倒します。
TuxCrafting

11

網膜、18バイト

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

オンラインでお試しください!

説明

これは、関連するペアに一致し、それらを最初の文字のみで置き換える単一の(そしてかなり単純な)置換です。ペアは、パターンの途中で大文字と小文字を区別しないことを有効にすることで一致します。

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

置換は、1とにかくグループで既にキャプチャしたキャラクターを単に書き戻します。


1
いい答えだ!Debuggexはこれでうまく機能します!
aloisdgは、Reinstate Monicaを言う

5

Brachylog、44バイト

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

Brachylogには正規表現はありません。

説明

    .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バイト

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

とともに 強大な正規表現マーティンエンダーから。入力と出力がであるC#ラムダstring

Martin EnderとTùxCräftîñgによって保存された12バイト。


C#、141 134バイト

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#ラムダ string。アルゴリズムは単純です。これは私が参照として使用するものです。

コード:

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のおかげで7バイト!


オンラインで試してみてください!


@TùxCräftîñg確かに、しかしこのように読むのは簡単です。あまり冗長でない答えについては私のゴルフバージョンを確認してください:)
aloisdgがReinstate Monicaを言う

4

Perl、40 24 + 1 = 25バイト

Martinと同じ正規表現を使用します。フラグを
使用する-p

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

イデオンでテストする


-pフラグを使用すると、s ///以外のほとんどすべてのコードを削除して、節約できます。
ドムヘイスティングス

4

Python 3、64 59 58バイト

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

Ideoneでテストします。


4

C、66バイト

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

3

Pyth、24 20バイト

@ジャクベのおかげで4バイト。

これは正規表現を使用しますが、トークン化のためだけです。

shM:zj\|+s_BVGrG1\.1

テストスイート。

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バイト

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

説明:

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

与えられたc>'@'parseInt(c+l,36)37の倍数になる唯一の方法は、両方cl同じ値を持つことです(スペースとゼロを除外したためゼロ値を持つことはできず、値がない場合、式はNaN<1れますfalse)は、それらが同じ文字であることです。ただし、大文字と小文字が区別される同じ文字ではないことがわかっているため、大文字と小文字を区別しない同じ文字にする必要があります。

このアルゴリズムは、すべての文字をチェックした場合にのみ機能することに注意してください。文字を照合することでそれを簡素化しようとすると、それはのようなことで失敗し"a+A"ます。

編集:@ edc65のおかげで3バイトを保存しました。


マップの代わりに置換を使用します。68.しかし、コメントの中に「 `」を入れる方法を理解するのが
面倒

@ edc65を`使用する場合、s は必要ありませんreplace。(以前は一貫性を保とうと試みただけでしたが、提出用に編集中に回答をゴルフし、再び一貫性がなくなりました。ため息...)
ニール

3

C、129 127 125 107 106 105 93 92 90 88の 85 78のバイト

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

私のC#回答の ACポート。私のCは少し悪いかもしれません。私はもうこの言語をあまり使いません。どんな助けでも大歓迎です!

  • Lowjackerのトリックのおかげで1バイト節約されました:a!=b=a^b
  • Walpenのトリックのおかげで1バイト節約されました:a&&b=a*b
  • Lynnのトリックによって保存され、TùxCräftîñgからインスピレーションを受けた12バイト
  • Joey Adamsのトリックのおかげで1バイト節約され、orlpにインスパイアされました:変数をグローバルに移動
  • (c|32)==(d|32)ビット単位の問題を解決してSEJPMで2バイト節約
  • Pietu1998によって5バイトが保存されました

コード:

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

オンラインでお試しください!


1
ポインタをインクリメントしてバイトを節約できると思います。私はこれを見つけました(テストされていません):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私はこれについて忘れていました。Lynnの回答に基づいて提案を修正しました。お手伝いありがとう!
aloisdgは回復モニカ言う

1
私はあなたが変えることができると思いますs+++1++s
-PurkkaKoodari

@ Pietu1998本当にできる!
aloisdgは、モニカの復活を

1
cそしてd、常に印刷可能なASCIIとなりますので、95の代わりに動作するはずです~32。また、動作すると思いますc;d;f(char*s){for(;*s;){putchar(c=*s);s+=isalpha(c)*(d=*(++s))&&(!((c^d)&95)&&c^d);}}(ただし、テストされていません)。
PurkkaKoodari

3

MATL、21バイト

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

オンラインでお試しください!。または、すべてのテストケースを確認します

説明

これにより、各文字がループで処理されます。各反復は、現在の文字を前の文字と比較します。後者はクリップボードKに保存され、クリップボードKに初期化されます4、デフォルトでれます。

現在の文字は前の文字と2回比較されます。最初に大文字と小文字を区別せずに、次に大文字と小文字を区別します。最初の比較がtrueで、2番目の比較がfalseの場合にのみ、現在の文字を削除する必要があります。クリップボードKには最初4が含まれているため、最初の文字は常に保持されることに注意してください。

現在の文字が削除された場合、クリップボードKをリセットする必要があります(次の文字が保持されます)。それ以外の場合は、現在のキャラクターで更新する必要があります。

"            % 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バイト

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

彼のRetina answerからMartin Enderの正規表現を使用しました。

未ゴルフ&テストコード:

ここで試してみてください。

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

出力:

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

2

JavaScript(ES6)、61バイト、57バイト

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

5バイトを節約してくれたNeilに感謝します。


1
悪いニュース:あなたは間違って数えました、そしてそれは実際には62バイトです。良いニュース:5バイト節約できます!s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
ニール

ああ、申し訳ありませんが、を使用してカウントし"code".lengthましたが、そこにエスケープシーケンスがあることに気づきませんでした。ありがとう
-cPu1

を使用してみてください(code).toString().length
ニール

ええ、または(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)
  }
)


噛むよ なぜ===
ニール

0==""しかしない0===""@Neil
edc65

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.