Ваша задача - написать программу или функцию, которая при задании двух строк одинаковой длины меняет местами все остальные символы и выводит / возвращает полученные строки в любом порядке.
Примеры
"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"
правила
- Строки будут содержать только символы ASCII (32-126).
- Строки всегда будут одинаковой длины и никогда не будут пустыми.
- Вы можете принять ввод в любом подходящем формате: отдельные параметры, элементы в массиве, разделенные одним или несколькими символами новой строки, даже объединенные. Единственное ограничение заключается в том, что одна строка должна полностью предшествовать другой (например,
a1\nb2\nc3
for"abc", "123"
недействительна). - Вывод может быть в любом порядке (т. Е. Вы можете начать замену с первого или второго символа) и в любом допустимом формате, указанном выше. (2-элементный массив, разделенный символами новой строки, объединенными и т. Д.)
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах для каждого языка.
DrMcMoylex
. : DОтветы:
Haskell, 37 байт
Застегивает две строки поочередно, меняя местами символы, затем распаковывая их.
37-байтовая рекурсивная альтернатива:
источник
Python, 42 байта с вводом / выводом в гольф
Меняет местами все остальные символы двух списков. Принимает в качестве входных данных два списка символов и выводит их путем изменения .
дает
источник
Vim,
18, 17 байтПопробуйте онлайн!
Это использует интерпретатор V из-за обратной совместимости. Вход поступает в следующем формате:
Объяснение:
источник
x
вместо,yl
а затем jusP
вместо второгоvP
:lqqxjvPkPll@qq@q
[save]
кнопку? В любом случае, это не работает для меня . Настоящая причина в том, что когда выx
последний символ в строке, он перемещает курсор влево, портя расположение свопа.Haskell, 41 байт
Возвращает пару со строками. Пример использования:
( (unzip.).(#) ) "Hello," "world!"
->("Hollo!","werld,")
.Простой рекурсивный подход: возьмите первый символ каждой строки как пару и добавьте рекурсивный вызов с заменой (остальной части) строк.
unzip
делает пару списков из списка пар.источник
05AB1E ,
1110 байтПопробуйте онлайн!
объяснение
вход =
["code", "golf"]
используется в качестве примера.источник
Perl, 48 байт
Bytecount включает 47 байтов кода и
-p
флага.Запуск с
-p
и-E
флаг. Ожидайте каждую строку в отдельной строке:Пояснения :
-p
: захват ввода$_
и печать его в конце. (получить и напечатать первую строку)<>
: получить строку ввода. (чтобы получить вторую строку).=~
: применить регулярное выражение к<>
:,s%%%geer
где благодаряr
измененной строке возвращается (и затем печатается благодаряsay
). и замените его символом внешнего регулярного выражения ( ). И затем мы добавляем так, что результатом является символ, который мы захватили во внутреннем регулярном выражении. Вы, возможно, заметили, что ссылаетесь на символ, который мы хотим заменить в обеих строках (таким образом, два разных символа), поэтому мы играем с модификатором регулярного выражения, который дважды оценивает правую часть регулярного выражения: первый заменит толькоРегулярное выражение:
.\K(.)
находит два символа и заменяет второй символ результатом вычисления этого кода"s/.{$-[0]}\\K(.)/$1/;\$1"
:Первая часть
s/.{$-[0]}\\K(.)/$1/
применяет регулярное выражение для$_
:.{$-[0]}
пропускает первые символы, чтобы попасть в ту же точку, что и внешнее регулярное выражение (поскольку$-[0]
содержит индекс первой группы захвата, так что в этом случае индекс символов для замены), а затем мы собираем символ с(.)
$1
$1
"s/.{$-[0]}\\K(.)/$1/;\$1"
$1
/ee
$1
что не предшествует\
.источник
Python, 55 байт
Нарезка!
58 байт:
64 байта:
Рекурсивно накапливает символы двух строк в
s
иt
и выводит пару из них в конце. Чередование осуществляется путем переключения входных строк при каждом рекурсивном вызове. Вывод строки через пробел был одинаковой длины:Это узко выбило другую рекурсивную стратегию поочередного взятия символов из каждой строки, с каждой из двух возможных строк в качестве первой. (65 байт)
источник
MATL ,
111098 байтСпасибо ETHproductions за 1 байт!
Входной является 2D массив , содержащий две строки, такие как:
['Halloween'; 'Challenge']
. Выходные строки в обратном порядке.Попробуйте онлайн!
объяснение
Старая версия: 9 байт
объяснение
источник
Желе , 5 байт
Ввод в качестве отдельных аргументов, вывод объединяется.
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Желе ,
986 байтСпасибо Деннису за сохранение 2 байта!
Использует кодировку желе .
Попробуйте онлайн!
источник
ṙ"J$
вместоĖṙ@/€
. Кроме того, разделение строки не требуется, поэтому вы можете удалитьY
.V , 12 байт
Попробуйте онлайн!
Ничего особенного, просто прямой порт моего ответа vim, чтобы я мог конкурировать (но не побеждать) с 05AB1E.
источник
Пайк, 9 байт
Попробуй это здесь!
источник
JavaScript (ES6), 51
54Редактировать 3 байта, сохраненные thx @Neil
Функция с массивом ввода / вывода
Мне нравится этот еще один, но это 55 (2 строки на входе, массив на выходе)
Тест
источник
replace
экономит вам 3 байта:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
.Pyth, 8 байт
Попробуйте онлайн: демонстрация
Транспонирует слова, переворачивает каждую пару букв «текущий индекс», транспонирует снова.
источник
JavaScript (ES6), 55 байт
Я хотел сделать что-то умное с использованием регулярных выражений для замены альтернативных символов, но в итоге потребовалось
6757 байт:источник
f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]
такая же длина.map
, это уменьшило на 10 байтов мой ответ регулярного выражения. Все еще слишком долго, хотя.Perl, 40 байт
Включает +1 для
-n
Дайте строки как строки на STDIN
interlace.pl
источник
Java,
132103100 байтСпасибо Кевину Круйссену за предложение вернуть массив (среди других улучшений) и сэкономить 29 байт! Также Оливье Грегуар за 3 байта!
Вызывается так:
Выход:
Hollo,werld!
Использует тот факт, что входные данные можно в основном отформатировать любым способом (в данном случае, один массив символов Strings, разделенных запятой), а также довольно мягкие правила вывода.
источник
char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}
( 103 байта ) с выводом результата вместо прямой печати. Пример вводаSystem.out.println(c("Hello,world!".toCharArray(), 5));
:; Пример вывода:Hollo,werld!
.Hollo!werld,
а неHollo,werld!
(пунктуация неверна). Я полагаю, что это можно исправить с помощью входного значения 6 вместо 5.t
кchar
, почему бы не объявить его в цикл непосредственно какchar
? Вы бы сэкономили несколько байтов, делая это.C, 124 байта
Звоните с:
Длина строки ограничена 98 символами.
источник
Октава ,
6461 байтАнонимная функция, которая вводит двумерный массив символов с каждой строкой в строке и создает выходные данные в том же формате.
Попробуйте это в Ideone .
источник
Ракетка 208 байт
Ungolfed:
Тестирование:
Выход:
Выше приведена рекурсивная версия.
Итерационная версия:
Ungolfed:
источник
PowerShell v2 +, 82 байта
Все еще играю в гольф ...Нет. Похоже, что это невозможно, без использования регулярных выражений, как другие ответы (бу на алгоритмах копирования).Таким образом, мы берем
$a
и в$b
виде строк, устанавливаем индекс$i
в0
, приводим$a
какchar
-array и отправляем его через цикл|%{...}
. На каждой итерации мы объединяем строки$c
и$d
индексируем в массиве select (то есть он чередуется взад и вперед). Затем мы оставляем$c
и$d
на конвейере, и вывод через неявныйWrite-Output
происходит при завершении программы.источник
Lithp , 120 символов (+3 для флага -v1)
Строка разделена на 2 для удобства чтения:
Требуется
-v1
флаг дляrun.js
поскольку некоторые функции еще не являются частью стандартной библиотеки.Пример использования:
Такого рода основные моменты, которые я не провел достаточно времени в стандартной библиотеке. Необходимость использования
js-bridge/1
дважды и длинную форму регулярных выражений, а также вызывать карту, используяinvoke/*
все, способствуют тому, что это намного дольше, чем нужно.Пора работать над моей стандартной библиотекой больше, я думаю.
источник
PHP, 79 байт
Предыдущая версия PHP, 82 байта
источник
for(...)echo$a[1+$i%2][$i];echo" $y";
(-2)for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";
- еще -2, хотя для этого требуется php 7Notice: String offset cast occurred in Command line code on line 1
C,
5452 байтаПредполагается, что выход
c
уже имеет желаемую длину.Использование:
}
Если вы настаиваете на создании вывода, вот 91-байтовое решение:
Использование:
источник
C, 150 байтов
Я использовал типичные пропуски заголовочных файлов, а также
main()
тип возврата и оператор возврата. Выдает предупреждение, но компилируется без проблем. Я также использовал специфический для GCC прием, который позволяет объявлять массивы с помощью переменных выражений.Программа ожидает строки из командной строки, и, как таковая, программа должна быть запущена с
./a.out string1 string2
.Или более разборчиво,
источник
Mathematica, 51 байт
Принимает ввод в виде массива из двух массивов символов с выводом в том же формате. Функция просто создает новый массив, используя операцию (mod 2).
источник
QBasic 4.5, 172 байта
Ой, это становится больно с старым QBasic ...
Интересный факт: использование
DEFSTR
сэкономило больше байтов, чем стоило, потому что теперь я могу использоватьA
вместоa$
.источник
QBIC , 112 байт
QBIC может оптимизировать многие шаблоны QBasic, но основной
MID$
механизм все еще должен быть выполнен в QBasic, потому что в QBIC отсутствует функция подстроки. Тем не менее, экономит мне 60 байтов.источник
MIND$
=>MIN$
в тексте.Java, 68 байт
Неуправляемый и тестирующий
источник
APL, 12
Объяснение: {...} определяет функцию, ⍵ - правильный аргумент. Take (↑) создает матрицу из двух строк, затем вращает каждый столбец (⊖) n раз, где n - часть в скобках (⍳⍴⊃⍵). Это определяется как йота длины первого аргумента. (Пример: длина = 5 ==> 1 2 3 4 5). Таким образом, первый столбец поворачивается один раз, второй - дважды (возвращаясь к исходным позициям), третий - три раза и т. Д.
Попробуйте это на tryapl.org
источник