Цель
Это простой вызов. Ваша цель - расшифровать строку, поменяв каждую букву следующей буквой в том же регистре, не изменяя буквенные символы.
Пошаговое объяснение
Первый персонаж - это
E
. Мы ищем следующую букву в верхнем регистре: этоC
. Мы меняем этих персонажей, что приводит кCdoE!
.Переходим к следующему персонажу: это
d
. Мы ищем следующую букву в нижнем регистре: этоo
. Мы меняем этих персонажей, что приводит кCodE!
.Мы переходим к следующему персонажу: это то,
d
что мы только что переехали сюда. Мы игнорируем это, потому что это уже было обработано.Мы переходим к следующему персонажу: это то,
E
что было перемещено здесь на шаге № 1. Мы игнорируем это, потому что это уже было обработано.Переходим к следующему персонажу: это
!
. Мы игнорируем это, потому что это не письмо.
правила
Можно предположить, что входная строка состоит исключительно из печатных символов 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.
Ответы:
Желе ,
21201918 байтПопробуйте онлайн!
Как это устроено
источник
Сетчатка , 53 байта
Не очень умное, но чистое и вполне читаемое решение
Попробуйте онлайн!
источник
MATL , 22 байта
Попробуйте онлайн! Или проверьте все тестовые случаи .
Как это устроено
источник
Утилиты Bash + Unix,
7762575654 байтаВвод в стандартный ввод. Вывод в стандартный вывод.
(В этой последней версии stderr также записан, но консенсус PPCG, похоже, в порядке - stderr просто игнорируется. )
Редактировать 1: Спасибо @Dennis за 15 байтов! Улучшения: (а) Получение ввода через стандартный ввод данных; (б) объединение двух сценариев sed в один; и (c) замена tr заменой посредством расширения параметра bash; (б) и (в) исчезли в Правке 2.
Редактировать 2: короче на 5 дополнительных байтов. Использовал вызов функции, чтобы заменить оба (b) и (c) в Edit 1.
Редактировать 3: еще один байт - переданный] как часть аргументов функции.
Редактировать 4: заменены два вызова функции вызовами самой программы, когда она не имеет аргументов.
Испытательный стенд и образец вывода:
источник
ES6,
18595 байтРешение сильно укорочено с помощью @Neil, @Arnauld и @ edc65
объяснение
источник
/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
[o[b],o[j]]=[c,o[b]]
может бытьo[o[j]=o[b],b]=c
Python , 82 байта
Попробуйте онлайн!
источник
QBasic, 229 байт
стратегия
Мы перебираем входную строку. Когда мы встречаем заглавную букву, мы сохраняем ее и ее позицию. Во второй раз, когда мы встречаем заглавную букву, мы используем эти сохраненные значения, чтобы заменить ее предыдущей. То же самое для строчных.
(Я собирался опубликовать более длинную версию, в которой использовался массив, потому что я думал, что строки QBasic неизменны. Затем я наткнулся на тот факт, что он
MID$(strng$, index, length) = replacement$
работает просто отлично. Живи и учись.)Ungolfed + прокомментировал
источник
C ++ 11 (GCC),
154149 байтисточник
#include<string>
переключиться на C ++ 14 и объявить общую лямбду[](auto s)
и предположить,s
что она имеет значениеstd::string
. Кроме того, объявление[](auto&s)
избавляет вас от возврата строки, так как разрешено изменять входные аргументы, которые будут использоваться в качестве выходных данных.Qbasic,
436408 байтСохранено один байт благодаря DLosc. Сохранено еще несколько, изменив обработку не-буквенных символов.
Это в основном состоит из трех частей:
Более подробное объяснение (обратите внимание, что это более ранняя версия кода, но принцип все еще применяется):
источник
PHP,
1089383 байтаПредыдущая версия (93 байта)
Спасибо @ user59178 за напоминание о том, что
preg_replace()
в качестве аргументов можно использовать массивы строк.Оригинальный ответ (108 байт)
Код обернут здесь, чтобы соответствовать доступному пространству.
Это может быть выполнено из командной строки:
Более короткая версия на 1 байт возможна в PHP 7, сжимая назначение
$f
внутри его первого вызова:На Github можно найти оба решения, с тестовыми примерами и версиями без гольфа .
источник
preg_replace
может принять массив замен, поэтому вам нужен только один вызов. Кроме того, он короче,<?=
чем использоватьecho
. С их помощью легко получить ваш ответ до 93 байтов.preg_replace()
. Я забыл об этом. Мне не нравится<?=
(на мой взгляд,<?
это не часть языка, это просто маркер), и я люблю писать короткие однострочные программы, которые можно выполнять из командной строки с помощьюphp -r
. Но для целей кода гольф вы снова правы. Я могу сохранить 1 байт, используя<?=
.Mathematica, 96 байт
Порт ответа от Retina Лео , который использует регулярные выражения.
источник
Python 2 , 124 байта
Не так коротко, как мое решение на основе регулярных выражений , но я думаю, что оно все еще интересно.
Попробуйте онлайн!
источник
Бин , 83 байта
HexDump:
Эквивалентный JavaScript:
Объяснение:
Неявно принимает первую строку ввода как неотформатированную как
a
(поскольку символы новой строки не могут быть частью зашифрованной строки) и неявно выводит нешифрованную строку путем последовательной замены заглавных, а затем строчных пар.Попробуйте демо здесь.
Попробуйте тестовый набор здесь.
источник
Рубин, 81 байт
источник
JavaScript (ES6), 80 байт
Основано на ответе Retina Лео .
Это работает, потому что в коде
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
используются только заглавные символыA
иZ
, которые используются для описания диапазонов символов. Это именно то, что нам нужно преобразовать в нижний регистр, чтобы обработать второй проход.Контрольные примеры
Показать фрагмент кода
источник
ES6 155 - 195 байт
Я знаю, что уже есть лучший ответ, но я хотел попробовать без регулярных выражений. Этот работает и на пунктуацию, но это, кажется, нарушает
(^_^)
тест. В этом случае у меня есть другаяc()
функция, приведенная ниже.объяснение
источник
Perl 6 , 56 байт
Принимает строковую переменную в качестве аргумента и изменяет ее на месте так, чтобы после вызова лямбда-переменной переменная содержала результат.
Дольше, чем это было бы в Perl, потому что:
<[A..Z]>
вместо[A-Z]
.EVAL
, который позволил бы больше гибкости, требует недружественной игры в гольфuse MONKEY-SEE-NO-EVAL;
.С другой стороны, на массив в
@
переменной можно ссылаться непосредственно в регулярном выражении, и он рассматривается как чередование.Perl 6 , 65 байт
Функциональная версия (выводит результат в виде возвращаемого значения лямбды).
источник
R, 343 байта
Ужасно неуклюжее решение R:
источник
Python 2, 181 байт
Намного дольше, чем должно быть, но в любом случае:
Сначала создаются два списка: один из символов верхнего регистра и один для символов нижнего регистра. Каждый из этих списков проходит по парам индексов, и символы в этих индексах переключаются.
Я сделаю это завтра
, но сейчас пора спать.источник
Пип , 28 байт
Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
Это решение регулярного выражения, использующее встроенные переменные регулярного выражения
XL
(строчные буквы,`[a-z]`
) иXU
(заглавные буквы,`[A-Z]`
).Когда вторым аргументом
R
является список, замены выполняются последовательно; таким образом, замена в нижнем регистре и замена в верхнем регистре не мешают друг другу.источник
Perl 5 , 48 + 1 (-p) = 49 байт
Попробуйте онлайн!
источник
AWK ,
121129 байтПопробуйте онлайн! Примечание: ссылка имеет 8 дополнительных байтов для многострочного ввода
Использование является довольно типичным, но требует версии,
AWK
которая принимает пустую строку в качестве разделителя полей (большинство версий,gawk
но я почти уверен, что оригиналAWK
потерпит неудачу :()Это очень просто, так как он просто перебирает каждый символ и проверяет, был ли он найден в одном из этих случаев раньше. Если это так, он меняет местами символы и сбрасывает проверенный индекс. Что касается обучения, я никогда раньше не использовал оператор присваивания внутри оператора присваивания
AWK
. По некоторым причинам это никогда не подходило. :)Я мог бы побрить пару байтов, сказав, что присваивать OFS и FS вне
BEGIN
блока с помощью назначения из командной строки или аналогичным образом, но это «чище» таким образом.Добавление ссылки TIO показало, что у меня произошла ошибка транскрипции, для исправления которой потребовалось 8 байт :( (я пропустил
0*(U=a):
)источник
C (gcc) ,
212206 байтПопробуйте онлайн!
источник
Stax , 18 байт
Запустите и отладьте его
Общий подход основан на регулярных выражениях.
[a-z].*?[a-z]
.источник
R ,
223163 байт148 байтРЕДАКТИРОВАТЬ: -60 байтов путем реализации цикла for
РЕДАКТИРОВАТЬ: -15 байт от Джузеппе
Попробуйте онлайн!
Работает, проверяя, является ли символ нижним или верхним регистром, помещает их в матрицу, инвертирует матрицу для извлечения значений в обменном формате. Затем выведите с
cat
. Попробуйте в Интернете бороться с тем,scan(,'')
если код состоит из более чем одной строки, следовательно, точка с запятой по всей строке кода.источник
x
пустячное это умное немного, но избавившись отm=matrix
был 4 байта , а также.scan(,'')
проблемы? И сокращение "LLEWW OroLd!" в TIOscan(,'')
или какой-либо другой способ получить вход?Java 7, 117 байт
РЕДАКТИРОВАТЬ: Только что заметил, что у меня есть такой же ответ, как ответ Retina @Leo , хотя я думал об этом независимо ...
Ungolfed:
Тестовый код:
Попробуй это здесь.
Выход:
источник