Видаліть скопійований і переключений корпус


27

Мета

Мета цього завдання: задати рядок у якості введення, видалити повторювані пари літер, якщо другий елемент у парі має протилежну велику літери. (тобто великі регістри стають малі і навпаки).

Пари слід замінити зліва направо. Наприклад, 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 . Чи можете ви це змінити?

Дякую за всіх учасників з пісочниці!

Каталог

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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 Я радий, що ти
схвалюєш

що вихід для: abB? abBабо ab?
Пух


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 повідомляє відновити Моніку

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 повідомляє про відновлення Моніки

5

Брахілог , 44 байти

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

Брахілог не має регулярних виразів.

Пояснення

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

12 байт зберегли Мартін Ендер та 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 байт завдяки Мартіну Ендеру!


Спробуйте їх онлайн!


@ TùxCräftîñg Дійсно, але читати так легко. Перевірте мою версію для гольфу на менш
усну

4

Perl, 40 24 + 1 = 25 байт

Використовуйте той самий регекс як Мартін.
Використовуйте -pпрапор

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

Перевірте це на ideone


Якщо ви використовуєте прапор -p, ви можете видалити майже весь свій код, за винятком s /// для гарного збереження!
Дом Гастінгс


4

C, 66 байт

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

3

Pyth, 24 20 байт

4 байти завдяки @Jakube

Це все ще використовує регулярний вираз, але тільки для токенізації.

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. Але я лінивий, щоб зрозуміти, як помістити '' 'всередину коментаря (приємний трюк мод 37)
edc65

@ edc65 Мені не потрібно `, якщо я використовую 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 # . Мій C може бути трохи поганим. Я вже мало використовую мову. Будь-яка допомога вітається!

  • 1 байт збережений завдяки Lowjacker в виверту : a!=b=a^b
  • 1 байт збережено завдяки хитрості Уолпена : a&&b=a*b
  • 12 байт, збережених хитрістю Лінни та натхненні тут TùxCräftîñg
  • 1 байт збережено завдяки хитрістю Джої Адамса та надихнуто сюди 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 повідомляє про відновлення Моніки

1
Я думаю , що ви можете змінити s+++1в ++s.
PurkkaKoodari


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

Використовував регекс Мартіна Ендера з його відповіді на Retina .

Невикористаний і тестовий код:

Спробуйте тут.

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 байт.


1
Погана новина: ви зробили неправильний рахунок, і це насправді 62 байти. Хороша новина: Я можу врятувати вас п’ять байтів! 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

1

Опукла, 18 байт

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

Спробуйте в Інтернеті!

Аналогічний підхід, як і відповідь Pyth @Leaky Nun's . Він конструює масив ["aA" "bB" ... "zZ" "Aa" "Bb" ... "Zz" '.], приєднується до '|символу і тестує вхід на основі цього регулярного вираження. Тоді він займає перший персонаж кожного матчу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.