Напишите программу для замены всех вхождений «force» на «first» и всех вхождений «first» на «force», сохраняя исходный регистр для всех позиций символов:
"ForcefoRcefOrcE" -> "FirstfiRstfIrsT"
"FirstfiRstfIrsT" -> "ForcefoRcefOrcE"
Остальная часть строки должна оставаться неизменной, и, следовательно, запуск вашей программы дважды должен вернуть исходную строку:
"thirst of forces" -> "thirst of firsts" -> "thirst of forces"
Ваша программа должна работать с любой начальной строкой. Так что в качестве подсказки лучше избегать использования магических символов в качестве промежуточного представления, потому что, если вы попробуете трехпроходную замену ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first"
), она потерпит неудачу на содержащих строки "zzzzz"
.
Вы должны поддерживать полный диапазон символов, разрешенных в определении String вашим языком программирования (в большинстве случаев это Unicode). Пример использования представления в стиле JSON для непечатаемых символов (\ u + 4 цифры):
"\u0000\u0001\u0002\u0003the Force of the firsT"
|
V
"\u0000\u0001\u0002\u0003the First of the forcE"
[Ff]
, то вы не должны заменить слово.Ответы:
Сетчатка , 33 байта
Попробуйте онлайн!
Изменить: Сохранено 5 байтов благодаря @MartinEnder за указание, что
Ro
делает.источник
Ro
.R
влиянию диапазонов; например, я бы никогда не понял, чтоRE
это эквивалентно,86420
если бы ты не указал на это.JavaScript (ES6),
9388 байтРедактировать: Сохранение 5 байтов путем оптимизации неизменного регистра букв.
источник
APL (Dyalog) , 61 байт
Требуется
⎕IO←0
по умолчанию во многих системах. Может быть на четыре символа короче, используя символ Unicode⍠
вместо⎕OPT
.Попробуйте онлайн!
источник
PHP, 88 байт
Онлайн версии
PHP, 110 байт
источник
$t[0]^first^force
вместоstrtr()
.Perl 5 , 52 байта
51 байт кода +
-p
флаг.Попробуйте онлайн!
Ничего слишком сумасшедшего не происходит. Найдите вхождения
force
иfirst
без учета регистра (s%force|first%%gi
), а затем транслитерируйте символы для преобразования одного в другое.источник
CJam, 66 байт
Проходит через каждый вариант вариации «first» и «force» и пытается разделить его. Если это возможно, он затем присоединяется к нему с обратными словами.
псевдокод:
источник
f
это важно, чтобы избежать измененияthirst
вthorce
илиdivorce
вdivirst
?Java 7,
318310 байтХорошо, это было довольно сложно в Java ..
Объяснение:
Тестовый код:
Попробуй это здесь.
Выход:
источник
c(c("..."))
!Желе ,
3736 байтЕсть ли способ использовать уменьшение для срезов длиной 5 вместо?
Попробуйте онлайн!
Как?
источник
MATL , 47 байт
Попробуйте онлайн!
При этом в качестве промежуточного шага используются отрицательные значения, а после двух проходов он принимает абсолютное значение.
источник
Pyth ,
3635 байтПопробуйте онлайн!
Пиф не особенно хорош в манипуляциях со струнами.
источник
Flex (лексер), 72 байта
Чтобы скомпилировать и запустить:
источник
first.l:3: EOF encountered inside an action
(о, неважно: в конце требуетсяld: library not found for -lfl
(о, неважно, командаgcc lex.yy.c -ll
на macOS)Python 2, 171 байт
Я хотел попробовать сделать это, используя встроенные модули, но он не может справиться с беспорядочным методом со всеми разбиениями и архивами.
Я думаю, что совершенно ясно, что я здесь делаю. Разбейте строку на экземпляры first и force (без учета регистра), замените эти экземпляры версиями, переведенными с помощью str.translate, и снова соедините ее обратно в строку.
Попробуйте онлайн!
источник
Python 2.7,
173165 байт8 байтов, сохраненных Quintopia
Этот получил брутто:
Попробуйте онлайн
Разбивая это шаг за шагом:
S.lower().split("force")
: взять строку, объединить в нижний регистр, разбить на подстроки, разделенные"force"
s.replace("first","force")for s in <STEP 1>
: Заменить все"first"
на"force"
_`.join("first".join(<STEP 2>)`[2::5]`_
: заменить все"force"
на с"first"
помощью рекомбинирования"force"
выделенных подстрок с"first"
и воссоединиться в одну строку (подчеркивания добавлены, чтобы получить правильные метки)zip(<STEP 3>,[(2,1)[l.isupper()]for l in S])
: заархивируйте каждый символ заменяемой фразы в регистр исходной строки (2 в нижнем регистре, 1 в верхнем регистре)_`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_
: Восстановить исходный регистр, преобразовать список в строку (подчеркивание добавлено, чтобы получить правильные метки)источник
C (лязг) ,
201183226214 байтовБыли некоторые ошибки ... Все еще нужно играть в гольф довольно много
(сохранено 12 благодаря возрастанию Cat)
Попробуйте онлайн!
источник
C # 273 байта
Попробуйте онлайн!
Прямой порт Java-ответа Кевина Круйссена , оказывается, когда дело доходит до получения символа в строке по заданному индексу, C # намного лучше, чем Java (
s[i++]
вместоs.charAt(i++)
)источник
Japt , 41 байт
Попробуйте онлайн!
Это было бы значительно короче, если бы у Джапта была нормальная функция транслитерации ...
Альтернативная версия:
Попробуйте онлайн!
источник
C #, 235 символов
источник
Рубин , 55 байт
Попробуйте онлайн!
источник
Java, 382 байта не соответствует
Попробуйте онлайн
источник
"The first, force,|first'forced!"
? Кроме того, вы можете немного изменить свой текущий код:if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))
->,z
послеString s=""
иz=w.toLowerCase();if(z.equals("force")|z.equals("first"))
. Кроме того,'O'
может быть79
,'C'
может быть67
и'E'
может быть69
. А тоif
else
можно заменить одним большим троичным, если оба так и естьs+=
.non competent
в заголовкеC # (269 байт)
еще одно решение на C #, только второе наименьшее, потому что я объявил две переменные и поэтому не могу использовать лямбда-синтаксис. да ладно, мне было весело. :)
объяснение:
переместить оригинальную строку вверх, затем разделить на «FORCE» и «FIRST».
агрегируйте результаты и при каждом разбиении найдите подстроку из пяти символов, которая использовалась для разбиения исходной строки, используя длину агрегируемой строки. если это было «силой», сделайте это «первым» и наоборот
источник