Вдохновленный этим вызовом (спасибо @cairdcoinheringaahing за заголовок!), Ваша задача - взять две печатные строки ASCII и умножить их поэлементно по следующим правилам.
Как это работает?
Учитывая две строки (например, split
и isbn
), вы сначала обрежете более длинную, чтобы они имели равную длину, а затем определили их коды ASCII :
split -> spli -> [115, 112, 108, 105]
isbn -> isbn -> [105, 115, 98, 110]
Следующим шагом будет сопоставление их с диапазоном [0..94]
путем вычитания 32
каждого кода:
[115, 112, 108, 105] -> [83, 80, 76, 73]
[105, 115, 98, 110] -> [73, 83, 66, 78]
Теперь вы умножите их поэлементно по модулю 95
(чтобы остаться в области печати):
[83, 80, 76, 73] ⊗ [73, 83, 66, 78] -> [74, 85, 76, 89]
Добавить, 32
чтобы вернуться к диапазону [32..126]
:
[74, 85, 76, 89] -> [106, 117, 108, 121]
И последний шаг - отобразить их обратно в символы ASCII:
[106, 117, 108, 121] -> "july"
правила
- Вы напишите программу / функцию, которая реализует описанные шаги для двух строк и либо печатает, либо возвращает полученную строку
- Формат ввода гибкий: вы можете взять две строки, кортеж строк, список строк и т. Д.
- Ввод может состоять из одной или двух пустых строк
- Введенные символы будут находиться в диапазоне для печати (
[32..126]
) - Вывод либо выводится на консоль, либо вы возвращаете строку
- Вывод может иметь конечные пробелы
Контрольные примеры
"isbn", "split" -> "july"
"", "" -> ""
"", "I don't matter" -> ""
" ", "Me neither :(" -> " "
"but I do!", "!!!!!!!!!" -> "but I do!"
'quotes', '""""""' -> 'ck_iKg'
"wood", "hungry" -> "yarn"
"tray", "gzip" -> "jazz"
"industry", "bond" -> "drop"
"public", "toll" -> "fall"
"roll", "dublin" -> "ball"
"GX!", "GX!" -> "!!!"
"4 lll 4", "4 lll 4" -> "4 lll 4"
"M>>M", "M>>M" -> ">MM>"
Примечание : кавычки предназначены только для удобства чтения, в 6-м тесте я использовал '
вместо "
.
abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
Ответы:
MATL , 12 байт
Попробуйте онлайн!
объяснение
источник
Желе ,
1512 байтПопробуйте онлайн!
-3 спасибо Джонатану Аллану .
источник
ØṖ
сz⁶O_32P€‘ịØṖ
- вам лучше дважды проверить , что арифметика работает , хотя.Python 3 ,
807471 байтСпасибо @shooqie за 3 байта!
Попробуйте онлайн!
источник
(s, t)
в качестве кортежа:lambda t:''.join(map(lambda x,y:chr((ord(x)-32)*(ord(y)-32)%95+32),*t))
Python 2 ,
7570 байт-3 байта благодаря предложению Денниса о предложении shooqie. -2 байта благодаря предложению Захари.
Попробуйте онлайн!
источник
lambda*t:''.join(chr(((ord(i)-32)*(ord(j)-32))%95+32)for i,j in zip(*t))
((ord(i)-32)*(ord(j)-32))%95+32
=>(ord(i)-32)*(ord(j)-32)%95+32
...map
. Я просто немного опоздал.Haskell ,
6057 байтПопробуйте онлайн!
Первая строка - анонимная функция, принимающая два аргумента.
Это прямая реализация алгоритма:
zipWith
принимает обе строки и применяет данную функцию к парам символов. Он обрабатывает усечение, а также работает для пустых строк.fromEnum
иtoEnum
являются альтернативамиord
иchr
для переключения между символами и их значениями ASCII, которые не требуют длительного импорта.Изменить: -3 байта благодаря Брюсу Форте.
источник
3
байты, извлекая-32
и сохраняя эти скобки, см. Здесь .C ++,
331291282270268 байт, версия 2 =178176150148 байтОригинальная версия :
-40 байт благодаря Брюсу Форте
-39 байт благодаря Захари
Версия 2, вдохновленная ответами других людей
Если в первой версии используется лямбда, то это потому, что я хотел протестировать функцию std :: async в C ++ 11, которую я только что изучил, поэтому я сохранил ее без всяких причин ...
Более читаемая версия:
источник
#include <string>
=>#include<string>
и#include <algorithm>
=>#include<algorithm>
?string
и использовать его соответственно.Dyalog APL,
3634332524 байтаПопробуйте онлайн (TryAPL)!
Попробуйте онлайн (TIO)!
Ввод представляет собой список строк, и имеет пробел в конце.
Вот как это работает:
источник
tryapl.org
, так что вот TIO для тех, кто хочет попробовать.FSharp 275 байт
источник
CJam , 23 байта
Попробуйте онлайн!
источник
C # (.NET Core) ,
100 9695 байтовПопробуйте онлайн!
-4 байта благодаря @ Zacharý
-1 байт, перемещая приращение
Использует лямбду и злоупотребляет тем фактом, что символы в основном являются целыми числами.
источник
(l[i]-32)*(n[i]-32)%95+32
?Console
и вы можете использовать карри для сохранения байта. Компилировать вAction<string, Action<string>>
лайкl=>n=>
и называть лайк("word")("string")
Mathematica, 114 байт
вход
источник
С накоплением , 52 байта
Попробуйте онлайн!
Функция, которая принимает два аргумента из стека.
объяснение
Давайте посмотрим на первую часть, считая сверху два элемента
'split'
и'isbn'
:Эта часть выполняет обрезку.
Затем:
Тогда последняя часть:
источник
R , 88 байт
анонимная функция; принимает входные данные в виде двух строк; Третий аргумент просто для того, чтобы убедиться, что это однострочная функция и сохранить несколько байтов
Ссылка TIO ниже возвращает массив с записями, названными с первым вводом.
Попробуйте все тестовые случаи!
источник
Perl 5 , 65 байт
64 байта кода +
-p
флаг.Попробуйте онлайн!
источник
D, 113 байт
Это порт решения Cats от HatsuPointerKun , не забудьте высказать свое мнение!
Попробуйте онлайн!
источник
05AB1E ,
1615 байтПопробуйте онлайн!
-1 Эмигна указывает на
₃
толчки95
.Другой.
источник
₃
сохраняет байт. Слишком плохо насчет ввода пустой строки. В противном случаеø
сэкономил бы еще несколько.Java 8,
1271159795 байтОбъяснение:
Попробуй это здесь.
источник
C #, 166 байт
Я уверен, что много предстоит сыграть в гольф, но сейчас у меня нет времени.
Попробуйте онлайн!
Полная / Отформатированная версия:
источник
(((c-32)*(t.Substring(0,l)[i]-32))%95)+32)
может быть((c-32)*(t.Substring(0,l)[i]-32)%95+32)
(возможно,Common Lisp, 99 байт
Попробуйте онлайн!
источник
Japt , 24 байта
Возвращает строку с завершающим null-chars (
\u0000
), когда первый вход длиннее второго.Попробуйте онлайн! с
-Q
флагом, чтобы показать форматированный вывод, включая нулевые символы.Запустите все тестовые случаи, используя мой WIP CodePen.
источник
Python 2 ,
9573 байтаПопробуйте онлайн!
источник
(((ord(x[i])-32)*(ord(y[i])-32))%95)+32
=>(ord(x[i])-32)*(ord(y[i])-32)%95+32
Древесный уголь , 30 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Я на самом деле написал калькуляцию,
(32 - ord(q)) * (32 - ord(h))
потому что она избегает последовательных числовых литералов, но я думаю, что я мог бы просто написать(ord(q) - ord(" ")) * (ord(h) - ord(" "))
вместо этого.источник
Perl 5 , 95 байт
Попробуйте онлайн!
Объяснение:
источник
Пип , 19 байт
Принимает строки в качестве аргументов командной строки. Попробуйте онлайн!
объяснение
источник
Фактор , 45
Это цитата (лямбда),
call
она с двумя строками в стеке, оставляет новую строку в стеке.Как слово:
источник
K (ок) , 26 байтов
Решение:
Попробуйте онлайн!
Пример:
Объяснение:
Оценка выполняется справа налево:
источник
PHP, 112 байт
источник
for($i=0;$i<strlen($a=$argv[1])&&$i<strlen($b=$argv[2]);)echo chr((ord($a[$i])-32)*(ord($b[$i++])-32)%95+32);
Кроме того , я не совсем уверен , что замена&&
с&
также может быть возможно в PHP, уменьшая его другим байта до 108 .JavaScript (ES6), 89 байт
Javascript и проклятие длинных имен функций ...
Использование каррирования и тот факт, что
charCodeAt
возвращаетсяNaN
при вызове с недопустимой позиции. На выходе могут быть завершающие нули.Тест
источник