Больше удовольствия от (очень) чувствительных к регистру строк


28

Вдохновленный этим вызовом (или, точнее, неправильным его чтением), я придумал следующий вызов:

Если задана входная строка S, измените порядок всех заглавных и строчных букв. Оставьте все не-буквенные символы на месте. Например:

Привет, мир!

Обратите внимание, что верхний регистр W(первая заглавная буква) был заменен на H(последний). То же самое касается строчных букв: «d» (первый) заменяется на ( eпоследний), l(второй) заменяется на l(pen-ultimate) ... Все не-буквенные символы остаются на месте.

вход

  • Ввод - это строка, содержащая только символы ASCII в диапазоне 32-126.
  • Длина ввода должна быть не менее 1 символа и не превысит лимит вашего языка.

Выход

  • Та же самая строка с замененными символами, как описано.

Дополнительные правила

  • Стандартные лазейки запрещены
  • Ответом должна быть полная программа или функция, а не фрагмент или запись REPL.
  • , самый короткий ответ в байтах выигрывает.

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

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

Возможно, вы захотите включить двухсимвольный тестовый набор, но мое первоначальное решение на этом не сработало. (Исправлено без каких-либо затрат путем изменения .+на .*)
ETHproductions

«Ленивый дож» напомнил мне об этом: youtube.com/watch?v=W-d6uUSY9hk
FinW

Ответы:


5

MATL , 14 байтов

2:"t@Y2myy)Pw(

Попробуйте это на MATL Online

объяснение

        % Impicitly grab input as a string
2:      % Push the array [1, 2] to the stack
"       % For each value in this array
  t     % Duplicate the top element of the stack (S)
  @     % Get the current loop index
  Y2    % Load the predefined literal 1Y2 ('ABC...Z') on the first loop
        % and the predefined literal 2Y2 ('abc...z') on the second loop (M)
  m     % Create a logical array the length of S that is TRUE when a character is in the
        % array M and FALSE otherwise (B)
  yy    % Make a copy of both S and B
  )     % Grab just the letters of S that were in M using B as an index
  P     % Reverse this array
  w     % Flip the top two stack elements
  (     % Assign them back into the string
        % Implicit end of for loop and implicit display

1
Отличная работа! У меня было 2:"tttXk>f)5MP(Yoпо 17 байт
Луис Мендо

11

Сетчатка , 19 байт

Retina не имеет прямого способа перевернуть строку, но мы можем сделать это, используя этап сортировки:

O^#`[a-z]
O^#`[A-Z]

Sort ( O), считывая их как числа ( #), а затем в обратном порядке ( ^) для всех строк, соответствующих данному регулярному выражению (строчные буквы для первой строки и прописные буквы для второй).

Это работает, потому что когда мы пытаемся прочитать строки без числовых символов как числа, к которым они относятся 0, то есть все символы имеют одинаковое значение для сортировки. Так как сортировка стабильна, они остаются в том же порядке, и их обращение возвращает исходную строку в обратном порядке.

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


10

Perl , 45 байт

44 байта кода + -pфлаг.

for$c(u,l){@T=/\p{L$c}/g;s/\p{L$c}/pop@T/ge}

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

Классы символов Unicode \p{Lu}и \p{Ll}соответствуют соответственно прописным и строчным буквам.
Так /\p{L$c}/что вернет список всех прописных (или строчных) букв (и сохранит его внутри @T).
И затем, регулярное выражение s/\p{$c}/pop@T/geзаменит каждую букву (в верхнем, а затем в нижнем регистре) последней буквой @Tпри удалении из @T.


7

JavaScript (ES6), 74 73 71 70 байт

f=
s=>(g=r=>s=s.replace(r,_=>a.pop(),a=s.match(r)))(/[A-Z]/g,g(/[a-z]/g))
<input oninput=o.textContent=f(this.value)><pre id=o>

Редактировать: 1 байт сохранен благодаря @Arnauld.


4
Я знал, что есть лучший способ ...
ETHproductions

5

JavaScript (ES6), 92 байта

s=>(F=(r,s)=>s.replace(r,([x],a,y)=>y+F(r,a)+x))(/[a-z](.*)([a-z])/,F(/[A-Z](.*)([A-Z])/,s))

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

Тестовый фрагмент


Предполагается ли, что функция назначена переменной с именем f? Разве это не должно быть в числе байтов?
Steenbergh

@steenbergh Функция анонимная, ее можно вызывать как угодно
Kritixi Lithos

1
@steenbergh Нет, это анонимная функция, которая создает другую функцию, а Fзатем дважды вызывает ее рекурсивно. Внешняя функция на самом деле не вызывает себя в любой точке.
ETHproductions

Почему вы используете круглые скобки .*в регулярных выражениях?
Лука

@ Люк, чтобы запечатлеть этих персонажей (the ain ([x],a,y)=>)
ETHproductions

4

Perl 6 , 75 69 байт

{my @a=.comb;@(grep $_,@a).&{@$_=[R,] $_} for /<:Lu>/,/<:Ll>/;[~] @a}

Как это работает

  1. my @a=.comb;
    Разбейте строку на символы и сохраните их в массиве.

  2. for /<:Lu>/,/<:Ll>/
    Для двух регулярных выражений, совпадающих с прописными и строчными буквами, соответственно ...

    • @(grep $_,@a)
      Получить часть всех записей массива, соответствующих регулярному выражению.

    • .&{@$_=[R,] $_}
      Назначьте обратный срез себе.

  3. [~] @a
    Объединить измененный массив, чтобы снова сформировать строку, и вернуть ее.


-6 байт, украдя идею использовать классы Unicode вместо диапазонов символов, из решения @ Dada.


3

Желе , 14 байт

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.
    ,Ṛ$         Pair with its reverse. 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.

не быть придирчивым, но .. 14 символов! = 23 байта :) mothereff.in/byte-counter
Gizmo

@Gizmo Jelly использует кодовую страницу . Смотрите эту мета пост для получения дополнительной информации.
17

@Suever О, это здорово, узнал кое-что сегодня ^. ^
Gizmo

3

Утилиты Bash + Unix, 122 121 байт

f()(p=[^$1*
v="\)\([$1\)\("
for((n=99;n;n--)){
q="$q;s/^\($p$v.*$v$p\)$/\1\4\3\2\5/"
p=[^$1*[$1$p
}
sed $q)
f a-z]|f A-Z]

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

Не очень очень короткий; возможно кто-то может сыграть в гольф дальше.

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

Это будет правильно работать на входах менее 200 символов.

(На самом деле он правильно обрабатывает любую строку, содержащую менее 200 строчных букв и менее 200 заглавных букв.)

Если вы увеличите 99 в коде до 102 (за счет одного дополнительного байта), он будет обрабатывать строки длиной до 205 символов.

Однако вы не можете увеличить 99 в коде за 102, так как тогда вы превысите максимальную длину аргумента sed.

Вот версия без какого-либо конкретного ограничения входного размера, но счетчик немного длиннее, 137 байтов. (Эта более длинная версия записывает во вспомогательный файл с именем t.)

f()(p=[^$1*
v="\)\([$1\)\("
for((n=`wc -c<t`;n;n--)){
sed -i "s/^\($p$v.*$v$p\)$/\1\4\3\2\5/" t
p=[^$1*[$1$p
})
cat>t
f a-z]
f A-Z]
cat t

Тестовые прогоны:

for x in A Ok OK 'Hello, World!' 0123456789 'The quick brown Fox jumps over the lazy doge' odd racecar 'EtOn Em OsN R AaToNsIsIhT!!1!'
  do
    echo "$x"
    ./swapping3 <<<"$x"
    echo
  done

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

Интересно, что это терпит неудачу в TIO. ☹ Может зависеть от sedреализации, установленной в вашей системе, но в GNU sedвы можете добавить -rопцию и удалить \экранирование всех скобок.
Манатворк

2

Python 2 , 115 байт

s=input();u=str.isupper
exec"r='';i=0\nfor c in s:r+=c[u(c):]or filter(u,s)[~i];i+=u(c)\ns=r.swapcase();"*2
print s

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


Можете ли вы заменить \ n на;?
Тим

К сожалению нет. Аргумент аргумента execанализируется как обычный код Python, поэтому цикл for должен находиться в отдельной строке.
Деннис

2

Java (OpenJDK 8) , 271 байт

s->new String(new Error(){char[]o=s.toCharArray();char c;int b;{while(b++<2)for(int l=0,r=o.length;l<r;l++){for(--r;r>l&&f(r);r--);for(;l<r&&f(l);l++);if(l<r){o[l]=o[r];o[r]=c;}}}boolean f(int i){c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);}}.o)

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


Вы можете сэкономить несколько байтов, превратив это в лямбду. s->new String...
Нелинейный

1
@NonlinearFruit спасибо! 294 -> 272, также исправлена ​​ошибка при повторном использовании r an l без инициализации
Дмитрий Самойленко

Добро пожаловать в PPCG! Некоторые вещи, которые вы все еще можете сыграть в гольф: char[]o=s.toCharArray();char c;int b;чтобы char o[]=s.toCharArray(),c,b;; и как &&к &«; и c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);до c=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);(всего 259 байт ). И я, вероятно, пропустил некоторые вещи, чтобы играть в гольф больше. Кроме того, если вы еще этого не видели, интересно почитать советы по игре в гольф на Java .
Кевин Круйссен

1

R , 107 байт

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));u[l]=u[rev(l)]};cat(intToUtf8(u,T),sep="")

Адаптировано из моего ответа на связанный вызов. Это значительно проще, чем просто поменять пары. Интересно, могу ли я получить саб 100 с некоторыми гольфами ...

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.