Расшифруй эти (очень) чувствительные к регистру строки


53

Цель

Это простой вызов. Ваша цель - расшифровать строку, поменяв каждую букву следующей буквой в том же регистре, не изменяя буквенные символы.

пример

Пошаговое объяснение

  1. Первый персонаж - это E. Мы ищем следующую букву в верхнем регистре: это C. Мы меняем этих персонажей, что приводит к CdoE!.

  2. Переходим к следующему персонажу: это d. Мы ищем следующую букву в нижнем регистре: это o. Мы меняем этих персонажей, что приводит к CodE!.

  3. Мы переходим к следующему персонажу: это то, dчто мы только что переехали сюда. Мы игнорируем это, потому что это уже было обработано.

  4. Мы переходим к следующему персонажу: это то, Eчто было перемещено здесь на шаге № 1. Мы игнорируем это, потому что это уже было обработано.

  5. Переходим к следующему персонажу: это !. Мы игнорируем это, потому что это не письмо.

правила

  • Можно предположить, что входная строка состоит исключительно из печатных символов ASCII, в диапазоне от 32 до 126.

  • Вы можете написать либо полную программу, либо функцию, которая либо печатает, либо возвращает результат.

  • Если входная строка содержит нечетное количество букв, последняя оставшаяся буква не может быть заменена другой и должна оставаться на месте, независимо от ее регистра. Та же логика применяется, если строка содержит четное количество букв, но нечетное количество прописных букв и нечетное количество строчных букв.

  • Это код-гольф, поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.

Контрольные примеры

Input : lLEhW OroLd!
Output: hELlO WorLd!

Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf

Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg

Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!

Не очень случайные тестовые случаи:

Input : (^_^)
Output: (^_^)

Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP

Input : hwn oeesd acsp nawyya
Output: who needs caps anyway

Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken

Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.

Я предполагаю, что аналогичный комментарий имеет место, если ввод содержит четное количество букв, но нечетное количество прописных букв и нечетное количество строчных букв.
Грег Мартин

14
Это действительно умная задача ... Мне также нравится тот факт, что контрольные примеры можно выполнить, набрав строку в нижнем регистре, произвольно изменив некоторые буквы в верхний регистр, а затем запустив точно такую ​​же программу, которая решает проблему!
Грег Мартин

1
@GregMartin Я обнаружил, что проблема сама по себе обратная, потому что при попытке выполнить тестовый случай я случайно набрал в выводе вместо ввода :-)
Луис Мендо

Я думаю, что вы должны включить тестовые случаи с более чем одним не-буквенным символом ASCII ... Я думаю, что некоторые реализации могут случайно переключать их друг с другом, когда это не должно происходить.
Грег Мартин

3
Тестовые случаи, вероятно, должны включать строку без заглавных букв и строку без каких-либо букв.
Деннис

Ответы:


4

Желе , 21 20 19 18 байт

s2UF,
nŒlTÇyJịŒsµ⁺

Попробуйте онлайн!

Как это устроено

nŒlTÇyJịŒsµ⁺  Main link. Argument: s (string)

 Œl           Convert to lowercase.
n             Test for inequality.
   T          Truth; yield all indices of 1's.
    Ç         Call the helper link. Yields [A, B] (pair of lists).
      J       Indices; yield I := [1, ..., len(s)].
     y        Translate; replace the integers of I that occur in A with the
              corresponding integers in B.
        Œs    Swapcase; yield s with swapped case.
       ị      Use the translated index list to index into s with swapped case.
          µ   Combine all links to the left into a chain.
           ⁺   Duplicate the chain, executing it twice.


s2UF,         Helper link. Argument: J (list of indices)

s2            Split J into pairs. If the length is odd, the last list will be
              a singleton list.
  U           Upend; reverse each pair. This is a no-op for singletons lists.
   F          Flatten, concatenating the pairs.
    ,          Pair the previous result with J.


9

MATL , 22 байта

2:"tttk<f2etAZ))P5M(Yo

Попробуйте онлайн! Или проверьте все тестовые случаи .

Как это устроено

2:"       % Do the following twice
  ttt     %   Input string (implicit). Push three more copies
  k       %   Convert to lowercase
  <f      %   Indices of characters that had their code point increased by
          %   the lowercase conversion, i.e. that were uppercase letters
  2e      %   Convert to 2-row matrix. This pads a zero in the lower-right 
          %   corner if necessary
  tAZ)    %   Keep only columns that don't contain zeros. Thus if there
          %   was a character that can't be swapped it will be ignored             
  )       %   Get 2-row matrix of characters at those positions
  P       %   Flip vertically. This does the swapping
  5M      %   Push matrix of original indices again
  (       %   Write the swapped characters onto their original positions
  Yo      %   Change case. In the first iteration, this prepares the
          %   string so the second iteration will process the letters that
          %   were originally lowercase. In the second iteration, it
          %   undoes the change of case 
          % End (implicit)
          % Display (implicit)

6

Утилиты Bash + Unix, 77 62 57 56 54 байта

sed -r "s/([$1)([^$1*)([$1)/\3\2\1/g"||$0 a-z]|$0 A-Z]

Ввод в стандартный ввод. Вывод в стандартный вывод.

(В этой последней версии stderr также записан, но консенсус PPCG, похоже, в порядке - stderr просто игнорируется. )

Редактировать 1: Спасибо @Dennis за 15 байтов! Улучшения: (а) Получение ввода через стандартный ввод данных; (б) объединение двух сценариев sed в один; и (c) замена tr заменой посредством расширения параметра bash; (б) и (в) исчезли в Правке 2.

Редактировать 2: короче на 5 дополнительных байтов. Использовал вызов функции, чтобы заменить оба (b) и (c) в Edit 1.

Редактировать 3: еще один байт - переданный] как часть аргументов функции.

Редактировать 4: заменены два вызова функции вызовами самой программы, когда она не имеет аргументов.

Испытательный стенд и образец вывода:

for x in 'lLEhW OroLd!' 'rpGOZmaimgn uplRzse naC DEoO LdGf' 'eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg' 'NraWgCi: Nsas-eNEiTIsev rNsiTG!!' '(^_^)' 'AWCTY HUOS RETP' 'hwn oeesd acsp nawyya' 'SpMycaeIesKyBorekn' "D's mroyr, Ivam. I'e faardi I act'n od htta."; do ./swapping <<<"$x" 2>/dev/null; done

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.

6

ES6, 185 95 байт

i=>(o=[...i]).map((c,j)=>/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?o[o[j]=o[b],b]=c:j:0)&&o.join``

Решение сильно укорочено с помощью @Neil, @Arnauld и @ edc65

объяснение

f = i =>
  // Get array of characters from input string
  (o = [...i])
    .map((c, j) => 
      // Check if it's a text character, otherwise skip it
      /[a-z]/i.test(c) ? 
        // Get last character position for case
        // merged with setting a variable for if the character is lowercase
        // merged with storing the current case character position,  
        // under properties on the array (with keys "true" or "false")
        o[e = c>"Z"] =
          // Check if there exists a character position to switch with
          // merged with storing the current position for quick access
          1/(b=o[e]) ? 
            // This statement will end up returning the Array subset, 
            // which will be falsy in the above conditional since (1/[])==false
            o[
              // Switch left character to the right
              o[j]=o[b]
            // Switch right character to the left
            ,b]=c : 
            // No character exists for case, so return current character position
            j
         // It was not a text character, so do nothing
         :0
      )
  // Join array and return as result
  && o.join``;

`lLEhW OroLd!
NraWgCi: Nsas-eNEiTIsev rNsiTG!!
rpGOZmaimgn uplRzse naC DEoO LdGf
eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
(^_^)
AWCTY HUOS RETP
hwn oeesd acsp nawyya
SpMycaeIesKyBorekn
D's mroyr, Ivam. I'e faardi I act'n od htta`
  .split`\n`
  .map(testCase => console.log(f(testCase)));


6 байтов, заключенные в скобки лишние, когда мы удаляем второе утверждение :) Отлично.
Jan

2
Пожалуйста, игнорируйте мой последний комментарий. Вот 99:/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
Арно

2
[o[b],o[j]]=[c,o[b]]может бытьo[o[j]=o[b],b]=c
edc65

Настоящий мастерский ход здесь использует true и false в качестве индексов для массива
edc65

Спасибо, ребята, до 95 сейчас. Становится действительно трудно документировать решение таким образом, чтобы это имело смысл. XD @ edc65 они хранятся в виде свойств объекта массива, а не индексов. Да, Арно выяснил, что они хранятся в массиве персонажей, но повторное использование объекта было скорее счастливой случайностью, которая, как мне кажется, возникла из отдельного предложения. Первоначально он хранился на отдельном объекте, который, конечно, был совершенно не нужен для решения проблемы.
Jan

3

Python , 82 байта

lambda s:S(r.lower(),t,S(r,t,s))
import re
S=re.sub
r='([A-Z])(.*?)'*2
t=r'\3\2\1'

Попробуйте онлайн!


как это работает? лямбда вообще называется?
Sarge Borsch

Лямбда - это фактическое (функциональное) представление. Все остальное - просто сопровождающий код, который должен быть выполнен до вызова лямбды.
Деннис

3

QBasic, 229 байт

LINE INPUT s$
FOR i=1TO LEN(s$)
c$=MID$(s$,i,1)
IF"@"<c$AND"[">c$THEN
IF u THEN MID$(s$,u,1)=c$:MID$(s$,i,1)=u$
u=-i*(u=0)
u$=c$
ELSEIF"`"<c$AND"{">c$THEN
IF l THEN MID$(s$,l,1)=c$:MID$(s$,i,1)=l$
l=-i*(l=0)
l$=c$
END IF
NEXT
?s$

стратегия

Мы перебираем входную строку. Когда мы встречаем заглавную букву, мы сохраняем ее и ее позицию. Во второй раз, когда мы встречаем заглавную букву, мы используем эти сохраненные значения, чтобы заменить ее предыдущей. То же самое для строчных.

(Я собирался опубликовать более длинную версию, в которой использовался массив, потому что я думал, что строки QBasic неизменны. Затем я наткнулся на тот факт, что он MID$(strng$, index, length) = replacement$работает просто отлично. Живи и учись.)

Ungolfed + прокомментировал

LINE INPUT text$

FOR i = 1 TO LEN(text$)
  char$ = MID$(text$, i, 1)
  IF "A" <= char$ AND "Z" >= char$ THEN
    ' Uppercase
    IF upperIndex = 0 THEN
      ' This is the first of a pair of uppercase letters
      ' Store the letter and its index for later
      upperLetter$ = char$
      upperIndex = i
    ELSE
      ' This is the second of a pair of uppercase letters
      ' Put it at the position of the previous uppercase letter
      ' and put that letter at this letter's position
      MID$(text$, upperIndex, 1) = char$
      MID$(text$, i, 1) = upperLetter$
      upperIndex = 0
    END IF
  ELSEIF "a" <= char$ AND "z" >= char$ THEN
    ' Lowercase
    IF lowerIndex = 0 THEN
      ' This is the first of a pair of lowercase letters
      ' Store the letter and its index for later
      lowerLetter$ = char$
      lowerIndex = i
    ELSE
      ' This is the second of a pair of lowercase letters
      ' Put it at the position of the previous lowercase letter
      ' and put that letter at this letter's position
      MID$(text$, lowerIndex, 1) = char$
      MID$(text$, i, 1) = lowerLetter$
      lowerIndex = 0
    END IF
  END IF
NEXT i

PRINT text$

2

C ++ 11 (GCC), 154 149 байт

#include<algorithm>
[](std::string s){int*p,u,l=u=-1;for(auto&c:s)(c|32)-97<26U?p=&(c&32?u:l),~*p?(std::swap(c,s[*p]),*p=-1):*p=&c-&s[0]:0;return s;}

1
Вы также должны либо #include<string>переключиться на C ++ 14 и объявить общую лямбду [](auto s)и предположить, sчто она имеет значение std::string. Кроме того, объявление [](auto&s)избавляет вас от возврата строки, так как разрешено изменять входные аргументы, которые будут использоваться в качестве выходных данных.
Карл Напф

2

Qbasic, 436 408 байт

LINE INPUT a$:b=len(a$):FOR a=1TO b:t$=MID$(a$,a,1)
IF"@"<t$AND"[">t$THEN
b$=b$+"U":u$=u$+t$
ELSEIF"`"<t$AND"{">t$THEN
b$=b$+"L":l$=l$+t$
ELSE b$=b$+t$
END IF:NEXT
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT
FOR x=1TO b:t$=MID$(b$,x,1)
IF"U"=t$THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF"L"=t$THEN l=l+1:z$=z$+MID$(h$,l,1)
ELSE z$=z$+t$
END IF:NEXT:?z$

Сохранено один байт благодаря DLosc. Сохранено еще несколько, изменив обработку не-буквенных символов.

Это в основном состоит из трех частей:

  • Разделение ввода на 3 строки (верхний регистр, нижний регистр и карта (также с другими символами))
  • Листать прописные и строчные буквы
  • Использование карты для (пере) построения выходных данных.

Более подробное объяснение (обратите внимание, что это более ранняя версия кода, но принцип все еще применяется):

' --- Part I: Reading the input
LINE INPUT a$
'This FOR loop takes one character at a time
b=len(a$):FOR a=1TO b
' And checks in what category the character belongs
t$=MID$(a$,a,1):SELECT CASE t$
' For each group, char t$ is added to that group (u$ for uppercase, 
' l$ for lowercase. The map in b$ is updated with a U or L on this index,
' or with the non-letter char t$.
CASE"A"TO"Z":b$=b$+"U":u$=u$+t$
CASE"a"TO"z":b$=b$+"L":l$=l$+t$
CASE ELSE:b$=b$+t$
END SELECT:NEXT

' --- Part II: Swapping within case-groups
' Loop through u$ and l$ twp chars at a time, and add those chunks in reverse order
' to g$ and h$. Because mid$ doesn't fail past the end of a string (but returns ""), 
' this automatically compensates for odd-length groups.
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT

' --- Part III: Read the map to put it all back together
FOR x=1TO b:t$=MID$(b$,x,1)
' See what group was in this spot, then read the next char from the flipped string.
' This keeps an index on those strings for the next lookup.
IF t$="U"THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF t$="L"THEN l=l+1:z$=z$+MID$(h$,l,1)
' The map contains a non-letter char, just drop that in
ELSE z$=z$+t$
' And finally,display the end result.
END IF:NEXT:?z$

2

PHP, 108 93 83 байта

<?=preg_replace([$a="/([a-z])([^a-z]*)([a-z])/",strtoupper($a)],"$3$2$1",$argv[1]);

Предыдущая версия (93 байта)

<?=preg_replace(["/([a-z])([^a-z]*)([a-z])/","/([A-Z])([^A-Z]*)([A-Z])/"],"$3$2$1",$argv[1]);

Спасибо @ user59178 за напоминание о том, что preg_replace()в качестве аргументов можно использовать массивы строк.


Оригинальный ответ (108 байт)

$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

Код обернут здесь, чтобы соответствовать доступному пространству.
Это может быть выполнено из командной строки:

$ php -d error_reporting=0 -r '$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));' 'lLEhW OroLd!'

Более короткая версия на 1 байт возможна в PHP 7, сжимая назначение $fвнутри его первого вызова:

echo($f=preg_replace)("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

На Github можно найти оба решения, с тестовыми примерами и версиями без гольфа .


1
preg_replaceможет принять массив замен, поэтому вам нужен только один вызов. Кроме того, он короче, <?=чем использовать echo. С их помощью легко получить ваш ответ до 93 байтов.
user59178

Вы правы насчет preg_replace(). Я забыл об этом. Мне не нравится <?=(на мой взгляд, <?это не часть языка, это просто маркер), и я люблю писать короткие однострочные программы, которые можно выполнять из командной строки с помощью php -r. Но для целей кода гольф вы снова правы. Я могу сохранить 1 байт, используя <?=.
Axiac

1

Mathematica, 96 байт

s[#,r="([a-z])(.*?)([a-z])"]~(s=StringReplace[#,RegularExpression@#2->"$3$2$1"]&)~ToUpperCase@r&

Порт ответа от Retina Лео , который использует регулярные выражения.


Я искренне удивлен, что у mathematica нет встроенной функции для этого, я имею в виду, если встроенные функции "Когда Пасхальное воскресенье", "Когда закат" и "Какова форма Франции", это тоже должно быть!
sagiksp


1

Бин , 83 байта

HexDump:

00000000 26 53 d0 80 d3 d0 80 a0 5d 20 80 0a a1 81 81 00  &SÐ.ÓÐ. ] ..¡...
00000010 23 81 01 20 80 0a a1 81 81 02 23 81 01 a8 db c1  #.. ..¡...#..¨ÛÁ
00000020 ad da dd a9 a8 db de c1 ad da dd aa bf a9 a8 db  .ÚÝ©¨ÛÞÁ.Úݪ¿©¨Û
00000030 c1 ad da dd 29 a4 b3 a4 b2 a4 31 a8 db e1 ad fa  Á.ÚÝ)¤³¤²¤1¨Ûá.ú
00000040 dd a9 a8 db de e1 ad fa dd aa bf a9 a8 db e1 ad  Ý©¨ÛÞá.úݪ¿©¨Ûá.
00000050 fa dd 29                                         úÝ)
00000053

Эквивалентный JavaScript:

a.replace(/([A-Z])([^A-Z]*?)([A-Z])/g,'$3$2$1').replace(/([a-z])([^a-z]*?)([a-z])/g,'$3$2$1')

Объяснение:

Неявно принимает первую строку ввода как неотформатированную как a(поскольку символы новой строки не могут быть частью зашифрованной строки) и неявно выводит нешифрованную строку путем последовательной замены заглавных, а затем строчных пар.

Попробуйте демо здесь.

Попробуйте тестовый набор здесь.


1

Рубин, 81 байт

puts f=->(i,s){i.gsub /([#{s})([^#{s}*)([#{s})/,'\3\2\1'}[f[$*[0],'a-z]'],'A-Z]']

1

JavaScript (ES6), 80 байт

Основано на ответе Retina Лео .

s=>eval("s"+(r=".replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')")+r.toLowerCase())

Это работает, потому что в коде .replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')используются только заглавные символы Aи Z, которые используются для описания диапазонов символов. Это именно то, что нам нужно преобразовать в нижний регистр, чтобы обработать второй проход.

Контрольные примеры


На самом деле, он очень похож на ответ Дениса на Python .
Арно

1

ES6 155 - 195 байт

Я знаю, что уже есть лучший ответ, но я хотел попробовать без регулярных выражений. Этот работает и на пунктуацию, но это, кажется, нарушает (^_^)тест. В этом случае у меня есть другая c()функция, приведенная ниже.

f=(s)=>{d={};s=[...s];for(i in s){b=s[i];for(j in s)if(i<j&!d[i]&c(s[j])==c(b)){d[j]=1;s[i]=s[j];s[j]=b;break}}return s.join('')}
c=c=>~(c.charCodeAt()/32)

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> )_^^(

c=c=>((c!=c.toUpperCase())<<1|c!=c.toLowerCase())||c.charCodeAt()

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> (^_^)

объяснение

f=(s)=>{
    d={};        //list of indexes already swapped
    s=[...s];        //string to array, stolen from above ES6 answer
    for(i in s){
        b=s[i];        //keep a note of what we are swapping
        for(j in s)        //iterate over the array again
            if( i<j & !d[i] & c(s[j])==c(b) ){
                        //only pay attention after we pass i'th
                        //only swap if this char hasn't been swapped
                        //only swap if both chars in same 'category'
                d[j]=1;        //note that the latter char has been swapped
                s[i]=s[j];
                s[j]=b;
                break        //avoid swapping on the same 'i' twice
            }
    }
    return s.join('')        //return as string
}

1

Perl 6 , 56 байт

{for "A".."Z","a".."z" ->@c {s:g/(@c)(.*?)(@c)/$2$1$0/}}

Принимает строковую переменную в качестве аргумента и изменяет ее на месте так, чтобы после вызова лямбда-переменной переменная содержала результат.

Дольше, чем это было бы в Perl, потому что:

  • Новый синтаксис регулярных выражений более многословен, например, выписывание классов символов будет выглядеть <[A..Z]>вместо [A-Z].
  • Регулярные выражения - это первоклассный исходный код, анализируемый во время компиляции, и строка может быть интерполирована в них только во время выполнения, если она состоит из самоподдерживающегося подрегекса (т.е. вы не можете интерполировать строку в символьный класс).
  • Explict EVAL, который позволил бы больше гибкости, требует недружественной игры в гольф use MONKEY-SEE-NO-EVAL;.

С другой стороны, на массив в @переменной можно ссылаться непосредственно в регулярном выражении, и он рассматривается как чередование.


Perl 6 , 65 байт

{reduce ->$_,@c {S:g/(@c)(.*?)(@c)/$2$1$0/},$_,"A".."Z","a".."z"}

Функциональная версия (выводит результат в виде возвращаемого значения лямбды).


1

R, 343 байта

Ужасно неуклюжее решение R:

f <- function(x) {
        y=unlist(strsplit(x,""))
        z=data.frame(l=ifelse(y %in% letters,0,ifelse(y %in% LETTERS,1,2)),s=y)
        l <- list(which(z$l==0),which(z$l==1))
        v <- unlist(l)
        for(j in 1:2) for (i in seq(1,ifelse(length(l[[j]])%%2==1,length(l[[j]])-2,length(l[[j]])-1),2)) l[[j]][i:(i+1)] <- rev(l[[j]][i:(i+1)])
        z[v,] <- z[unlist(l),]
        return(z$s)
    }

f("D's mroyr, Ivam. I'e faardi I act'n od htta.")

# [1] I ' m   s o r r y ,   D a v e .   I ' m   a f r a i d   I   c a n ' t   d o   t h a t .

1

Python 2, 181 байт

Намного дольше, чем должно быть, но в любом случае:

def F(s):
 for l in[i for i,c in enumerate(s)if c.isupper()],[i for i,c in enumerate(s)if c.islower()]:
  for a,b in zip(l[0::2],l[1::2]):s=s[:a]+s[b]+s[a+1:b]+s[a]+s[b+1:]
 print s

Сначала создаются два списка: один из символов верхнего регистра и один для символов нижнего регистра. Каждый из этих списков проходит по парам индексов, и символы в этих индексах переключаются.

Я сделаю это завтра , но сейчас пора спать .


1

Пип , 28 байт

Y[XLXU]aRy.`.*?`.y{Sa@0a@va}

Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!

объяснение

Это решение регулярного выражения, использующее встроенные переменные регулярного выражения XL(строчные буквы, `[a-z]`) и XU(заглавные буквы, `[A-Z]`).

                              a is 1st cmdline arg; v is -1 (implicit)
Y[XLXU]                       Yank a list containing XL and XU into y
         y.`.*?`.y            Concatenate y, `.*?`, and y itemwise, giving this list:
                              [`[a-z].*?[a-z]`; `[A-Z].*?[A-Z]`]
       aR                     In a, replace matches of each regex in that list...
                  {        }  ... using this callback function:
                   Sa@0a@v     Swap the 0th and -1st characters of the match
                          a    and return the resulting string
                              Print (implicit)

Когда вторым аргументом Rявляется список, замены выполняются последовательно; таким образом, замена в нижнем регистре и замена в верхнем регистре не мешают друг другу.



1

AWK , 121 129 байт

BEGIN{FS=OFS=""}{for(a=1;a<=NF;a++){if($a~/[A-Z]/?U>0?p=U+(U=0):0*(U=a):$a~/[a-z]/?L>0?p=L+(L=0):0*(L=a):0>0){t=$a;$a=$p;$p=t}}}1

Попробуйте онлайн! Примечание: ссылка имеет 8 дополнительных байтов для многострочного ввода

Использование является довольно типичным, но требует версии, AWKкоторая принимает пустую строку в качестве разделителя полей (большинство версий, gawkно я почти уверен, что оригинал AWKпотерпит неудачу :()

Это очень просто, так как он просто перебирает каждый символ и проверяет, был ли он найден в одном из этих случаев раньше. Если это так, он меняет местами символы и сбрасывает проверенный индекс. Что касается обучения, я никогда раньше не использовал оператор присваивания внутри оператора присваивания AWK. По некоторым причинам это никогда не подходило. :)

Я мог бы побрить пару байтов, сказав, что присваивать OFS и FS вне BEGINблока с помощью назначения из командной строки или аналогичным образом, но это «чище» таким образом.

Добавление ссылки TIO показало, что у меня произошла ошибка транскрипции, для исправления которой потребовалось 8 байт :( (я пропустил 0*(U=a):)




1

R , 223 163 байт 148 байт

РЕДАКТИРОВАТЬ: -60 байтов путем реализации цикла for

РЕДАКТИРОВАТЬ: -15 байт от Джузеппе

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));x=sum(l|1)%/%2;u[l[1:(x*2)]]=u[c(matrix(l,2)[2:1,1:x])]};cat(intToUtf8(u,T),sep="")

Попробуйте онлайн!

Работает, проверяя, является ли символ нижним или верхним регистром, помещает их в матрицу, инвертирует матрицу для извлечения значений в обменном формате. Затем выведите с cat. Попробуйте в Интернете бороться с тем, scan(,'')если код состоит из более чем одной строки, следовательно, точка с запятой по всей строке кода.


Я получаю 168 по вашей ссылке, но этот гольф 163
Джузеппе

И это приводит к 162.
Джузеппе

это, вероятно, работает; xпустячное это умное немного, но избавившись от m=matrixбыл 4 байта , а также.
Джузеппе

Как насчет scan(,'')проблемы? И сокращение "LLEWW OroLd!" в TIO scan(,'')или какой-либо другой способ получить вход?
Sumner18


0

Java 7, 117 байт

String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

РЕДАКТИРОВАТЬ: Только что заметил, что у меня есть такой же ответ, как ответ Retina @Leo , хотя я думал об этом независимо ...

Ungolfed:

String c(final String s) {
  String x = "([a-z])(.*?)([a-z])",
         y = "$3$2$1";
  return s.replaceAll(x, y).replaceAll(x.toUpperCase(), y);
}

Тестовый код:

Попробуй это здесь.

class M{
  static String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

  public static void main(String[] a){
    System.out.println(c("lLEhW OroLd!"));
    System.out.println(c("rpGOZmaimgn uplRzse naC DEoO LdGf"));
    System.out.println(c("eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg"));
    System.out.println(c("NraWgCi: Nsas-eNEiTIsev rNsiTG!!"));
    System.out.println(c("(^_^)"));
    System.out.println(c("AWCTY HUOS RETP"));
    System.out.println(c("hwn oeesd acsp nawyya"));
    System.out.println(c("SpMycaeIesKyBorekn"));
    System.out.println(c("D's mroyr, Ivam. I'e faardi I act'n od htta."));
  }
}

Выход:

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.