Розшифруйте ці рядки, чутливі до регістру (дуже)


53

Мета

Це простий виклик. Ваша мета - розшифрувати рядок, поміняючи кожну букву на наступну букву того ж випадку, залишаючи символи без букви незмінними.

приклад

Покрокове пояснення

  1. Перший персонаж - а E. Наступну букву шукаємо у верхньому регістрі: це a C. Ми обміняємось цими символами, що призводить до CdoE!.

  2. Переходимо до наступного персонажа: це a d. Наступний лист ми шукаємо в нижньому регістрі: це a o. Ми обміняємось цими символами, що призводить до CodE!.

  3. Переходимо до наступного персонажа: це те, dщо ми щойно переїхали сюди. Ми ігноруємо це, оскільки воно вже оброблене.

  4. Переходимо до наступного символу: це те, Eщо було переміщено сюди на кроці №1. Ми ігноруємо це, оскільки воно вже оброблене.

  5. Переходимо до наступного персонажа: це a !. Ми ігноруємо це, бо це не лист.

Правила

  • Можна припустити, що рядок введення складається виключно з друкованих символів 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]

Введення в stdin. Вихід у stdout.

(В цій останній версії, як буває, пишеться і stderr, але, здається, консенсус PPCG є таким, що це нормально - stderr просто ігнорується. )

Редагувати 1: Дякуємо @Dennis за 15 байт! Поліпшення: (a) Введення інформації через stdin; (b) поєднання 2 сценаріїв sed в один; та (c) заміна tr заміщенням через розширення параметра bash; (b) і (c) зникли в редакції 2.

Редагувати 2: скоротити на 5 додаткових байт. Використовували виклик функції для заміни обох (b) та (c) в Edit 1.

Edit 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 байт, додаткові парени зайві, коли ми видаляємо другий вислів :) Добре.
січня

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

Справжній masterstroke тут використовує true та false як індекси для масиву
edc65

Дякую, хлопці, зараз до 95. Починати стає дуже важко документувати рішення таким чином, що має сенс. XD @ edc65 вони зберігаються як властивості об’єкта масиву, а не індекси. Так, Арнольд зрозумів, що вони зберігаються в масиві символів, але повторне використання об'єкта було більш щасливою випадковістю, я думаю, що виходила з окремої пропозиції. Спочатку він зберігався на окремому об'єкті, що, звичайно, було абсолютно непотрібно для розгляду завдання.
січня

3

Пітон , 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 байт.
користувач59178

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

1

Математика, 96 байт

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

Порт відповіді Ретіна Лео , який використовує регулярні вирази.


Я чесно здивований, що математика не має для цього вбудованого, я маю на увазі, якщо "Коли є Великдень у неділю", "Коли настає захід сонця" та "яка форма Франції", набудуються вбудовані елементи, і це має бути!
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 байт

На основі відповіді Ретіна Лео .

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].
  • Regexes є першокласним вихідним кодом, розібраним під час компіляції, і рядок може бути інтерпольований у них під час виконання, лише якщо він складається з автономного підрегексу (тобто ви не можете інтерполювати рядок у клас символів).
  • 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

Пітон 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 байт

EDIT: -60 байт шляхом впровадження циклу for

EDIT: -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(,'')проблемою? І зменшення "lLEhW 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);}

EDIT: Щойно помітив, я маю подібну відповідь, як відповідь @Leo Retina , хоча я думав про це самостійно.

Безголівки:

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.