ลบกรณีที่ซ้ำ & สลับ


27

เป้าหมาย

เป้าหมายของความท้าทายนี้คือ: กำหนดสตริงเป็นอินพุตลบตัวอักษรคู่ที่ซ้ำกันหากรายการที่สองในคู่นั้นเป็นตัวพิมพ์ใหญ่ที่ตรงกันข้าม (เช่นตัวพิมพ์ใหญ่กลายเป็นตัวพิมพ์เล็กและในทางกลับกัน)

ควรเปลี่ยนคู่จากซ้ายไปขวา ยกตัวอย่างเช่นaAaควรจะเป็นและไม่ได้aaaA

ตัวอย่าง

อินพุตและเอาต์พุต:

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 ฯ'ที่ซ้ำกันและสวิทช์กรณี' คุณสามารถย้อนกลับได้หรือไม่

ขอบคุณสำหรับผู้มีส่วนร่วมทั้งหมดจากกล่องทราย!

แค็ตตาล็อก

ส่วนย่อยของสแต็กที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการของวิธีแก้ปัญหาที่สั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

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


4
ฮ่าฮ่านั่นคือ NniIcCeE :)
nicael

@nicael ฉันดีใจที่คุณอนุมัติ :)
aloisdg พูดว่า Reinstate Monica

ผลลัพธ์สำหรับ: abBอะไร abBหรือab?
Downgoat

@ Downgoat abBควรให้ผลลัพธ์ab
aloisdg พูดว่า Reinstate Monica

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.

สั้นกว่า Regex เหี้ย!
aloisdg พูดว่า Reinstate Monica

2
เอาชนะจอประสาทตาด้วยความท้าทายด้านสตริง .
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");

ด้วยregex อันยิ่งใหญ่จาก Martin Ender C # lambda โดยที่อินพุตและเอาต์พุตอยู่stringแลมบ์ดาที่เข้าและส่งออกที่มี

บันทึก 12 ไบต์โดย Martin Ender และTùxCräftîñg


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

7 ไบต์ขอบคุณ Martin Ender!


ลองออนไลน์!


@ TùxCräftîñgแน่นอน แต่อ่านได้ง่ายเช่นนี้ ตรวจสอบเวอร์ชั่นแข็งแรงเล่นกอล์ฟของฉันสำหรับน้อย verbose คำตอบ :)
aloisdg กล่าวว่าคืนสถานะโมนิกา

4

Perl, 40 24 + 1 = 25 ไบต์

ใช้ regex เดียวกับ Martin
ใช้-pธง

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

ทดสอบบนideone


หากคุณใช้แฟล็ก -p คุณสามารถลบรหัสเกือบทั้งหมดได้ยกเว้น s /// เพื่อความประหยัด!
Dom Hastings



3

Pyth, 24 20 ไบต์

ขอบคุณ 4 ไบต์สำหรับ @Jakube

สิ่งนี้ยังคงใช้ regex แต่เพียงเพื่อ tokenizing

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.
  • รุ่น 24 ไบต์ที่นี่

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 คือทั้งสำหรับcและlมีค่าเดียวกัน (พวกเขาไม่สามารถมีค่าเป็นศูนย์เพราะเราไม่รวมพื้นที่และศูนย์และถ้าพวกเขาไม่มีค่าแล้วนิพจน์จะประเมินNaN<1ซึ่งเป็น false) สำหรับพวกเขาที่จะเป็นตัวอักษรเดียวกัน อย่างไรก็ตามเรารู้ว่าพวกเขาไม่ใช่ตัวอักษรตัวพิมพ์เล็กและใหญ่ดังนั้นพวกเขาจะต้องเป็นตัวพิมพ์เล็กและใหญ่

โปรดทราบว่าอัลกอริทึมนี้ใช้ได้เฉพาะเมื่อฉันตรวจสอบทุกตัว "a+A"ถ้าผมพยายามที่จะลดความซับซ้อนของมันโดยการจับคู่ตัวอักษรก็จะล้มเหลวในสิ่งที่ต้องการ

แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @ edc65


ใช้แทนที่แทนที่แผนที่ 68. แต่ฉันขี้เกียจเกินไปที่จะหาวิธีใส่ '' 'ในความคิดเห็น (mod เล่ห์เหลี่ยมที่ 37)
edc65

@ edc65 ฉันไม่จำเป็นต้องมี`s replaceถ้าผมใช้ (ฉันมีพวกเขาก่อนที่จะพยายามที่จะให้สอดคล้องกัน แต่จากนั้นฉันกอล์ฟคำตอบของฉันในขณะที่แก้ไขมันสำหรับการส่งและไม่สอดคล้องกันอีกครั้งถอนหายใจ ... )
Neil

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

พอร์ต AC ของฉันC # คำตอบ My C อาจจะแย่ไปหน่อย ฉันไม่ได้ใช้ภาษามากนักอีกต่อไป ยินดีต้อนรับความช่วยเหลือใด ๆ !

  • บันทึก 1 ไบต์ด้วยเคล็ดลับของ Lowjacker : a!=b=a^b
  • บันทึก 1 ไบต์ด้วยเคล็ดลับของ Walpen : a&&b=a*b
  • 12 ไบต์บันทึกโดยเคล็ดลับของ Lynn และได้รับแรงบันดาลใจจากTùxCräftîñg
  • บันทึก 1 ไบต์ด้วยกลอุบายของ Joey Adams และได้รับแรงบันดาลใจจาก orlp: การย้ายตัวแปรสู่ระดับโลก
  • 2 ไบต์บันทึกโดย SEJPM โดยการแก้ไขปัญหาระดับ(c|32)==(d|32)บิตของฉัน
  • บันทึก 5 ไบต์โดย Pietu1998

รหัส:

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ฉันลืมเรื่องนี้ ฉันแก้ไขข้อเสนอของคุณตามคำตอบของลินน์ ขอขอบคุณสำหรับความช่วยเหลือ!
aloisdg พูดว่า Reinstate Monica

1
ฉันคิดว่าคุณสามารถเปลี่ยนไปs+++1 ++s
PurkkaKoodari

@ Pietu1998 แน่นอนฉันทำได้!
aloisdg พูดว่า Reinstate Monica

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 ซึ่งเริ่มต้น4โดยเริ่มต้น

อักขระปัจจุบันถูกเปรียบเทียบกับอักขระตัวก่อนหน้านี้สองครั้ง: ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แบบตัวพิมพ์เล็ก ควรลบอักขระปัจจุบันถ้าหากการเปรียบเทียบครั้งแรกเป็นจริงและอักขระที่สองเป็นเท็จ โปรดทราบว่าเนื่องจากคลิปบอร์ด 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");}

ที่ใช้regex มาร์ตินเอนเดอร์จากคำตอบของเขา

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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='')

ขอบคุณNeilสำหรับการบันทึก 5 ไบต์


1
ข่าวร้าย: คุณผิดและนั่นคือ 62 ไบต์ ข่าวดี: ฉันช่วยคุณประหยัดได้ห้าไบต์! s=>s.replace(/./g,c=>l=c!=l&/(.)\1/i.test(l+c)?'':c,l='')
Neil

โอ้ขอโทษฉันนับได้ใช้"code".lengthไม่ได้ตระหนักว่ามีลำดับการหลบหนีอยู่ในนั้น ขอบคุณ
cPu1

ลองใช้(code).toString().lengthดู
Neil

ใช่หรือ(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)
  }
)


ตกลงฉันจะกัด ทำไม===?
Neil

0==""แต่ไม่ใช่0===""@Neil
edc65

1

นูน, 18 ไบต์

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

ลองออนไลน์!

วิธีการที่คล้ายกันเป็น@Leaky แม่ชีคำตอบ มันสร้างอาร์เรย์["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.]ร่วมกับ'|ตัวละครและทดสอบอินพุตตาม regex นั้น จากนั้นจะใช้อักขระตัวแรกของแต่ละการแข่งขัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.