Функция расшифровки
Вы должны написать программу, которая берет зашифрованную строку и расшифровывает ее в соответствии с определенными правилами, а затем распечатывает ее. Расшифровка будет происходить путем выполнения двух операций.
Пример входного аргумента 1 (зашифрованная строка)
HGJILKBADCFE
Операция 1:
Поменяйте местами первую половину строки со второй половиной, что должно оставить вас:
BADCFEHGJILK
Операция 2:
Поменяйте местами каждые два символа друг с другом, например, поменяйте местами символ 1 на 2, 3 на 4 и т. д., что должно оставить вас с расшифрованной строкой:
ABCDEFGHIJKL
Методические рекомендации:
Входной аргумент 1 будет содержать только прописные буквы
Длина входного аргумента 1 будет от 2 до 100 символов.
Длина входного аргумента 1 всегда будет четным числом.
Предпочтительно ввод будет осуществляться из командной строки (как показано ниже).
Другой тестовый пример
MPORQTSVUXWZYBADCFEHGJILKN— вход, выход —ABCDEFGHIJKLMNOPQRSTUVWXYZ
Моя попытка
import sys
_,a=sys.argv
b=len(a)//2
s=a[b:]+a[:b]
print(''.join(x+y for x,y in zip(s[1::2],s[::2])))
Ответы
J , 15 байт
[:,_2|.\-:@#|.]
Попробуйте онлайн!
Непосредственная реализация формулы.
Немного более интересно (не полезно для игры в гольф J, но, возможно, для другого языка) то, что алгоритм может быть решен с суммой сканирования:
- Сначала возьмите a ,
1затем-1 3, с-1 3повторением до длины списка. - Сканируйте сумму этого списка.
- Поверните числа на половину длины списка.
- Отсортируйте оригинал по этим номерам.
См. TIO для демонстрации в J.
Руби -p , 48 47 байт
$_=$_[l= ~/$//2,l]+$_[0,l];gsub /(.)(.)/,'\2\1'
Попробуйте онлайн!
Операция 1 обрабатывается путем разбиения $_(предопределенной глобальной переменной, содержащей входные данные) на две подстроки одинаковой длины; ~/$/дает длину ввода. Затем gsub /(.)(.)/,'\2\1'завершает операцию 2, меняя местами каждую пару символов. (С -pфлагом gsubбез получателя неявно действует на $_.)
05AB1E , 13 12 байт
D2äRJ2ι`s.ιJ
Попробуйте онлайн!
-1 благодаря совету по игре в гольф от @Kevin, который я видел в другом ответе
Объяснение
D2äRJ2ι`s.ιJ
- Дублировать ввод (
D) - Разделите его на 2 части (
2ä) - Переверните список и соедините его в одну строку (
RJ) - Удалите эту строку на каждом втором символе (
2ι) - Поместить все элементы из строки без чередования в стек (```)
- Чередовать эти элементы (
.ι) - И присоединиться к полученному списку (
J)
APL+WIN, 24 22 байта
-2 байта благодаря Джо Кингу
Запросы на ввод строки:
,⌽n⍴⊖(⌽n←⌽2,.5×⍴s)⍴s←⎕
Попробуйте онлайн! Предоставлено Дайалог Классик
R , 78 80 79 байт
Редактировать: +2 байта благодаря Dingus за выявление ошибок и -1 байт благодаря pajonk
n=nchar(s<-scan(,''));o=1:n;cat(substring(s,p<-(o+n/2-2+2*o%%2)%%n+1,p),sep='')
Попробуйте онлайн!
Ввод данных через консоль R (которую можно считать «командной строкой» для рабочей области R).
R также можно вызывать из оболочки (не R) с помощью Rscriptвспомогательного внешнего интерфейса, который позволяет аргументам командной строки следовать непосредственно за вызовом, и в этом случае модифицированная программа может иметь размер 87 байт и вызываться с использованием Rscript decrypt.r HGJILKBADCFE.
Вычисляет позиции декодированных букв, а затем выводит переставленную строку.
Прокомментировал:
n=nchar( # n = number of characters in...
s<-scan(,'')); # s = the input.
o=1:n; # o = sequence from 1 to n
p= # p = positions of decoded characters:
(o+n/2-1 # - reverse the first & second halves of o
# by adding n/2-1
# (will be fixed with final modulo below)
+2*o%%2-1) # - then add 2 at every odd position
# and subtract 1 from all, so in effect
# adding to odds & subtracting from evens
%%n # - all modulo n
+1 # - add 1 to get 1-based indices
cat( # output:
substring(s,p,p),sep='') # characters of s from positions p to p
Желе , 7 байт
ŒHṚFs2U
Попробуйте онлайн!
Эквивалентно 7 байтам, ṙLH$s2U.
Объяснение
ŒHṚFs2U Main Link
ŒH Split into two halves of similar length
Ṛ Reverse the order (swap the two halves)
F Flatten back into a single string
s2 Slice into chunks of length 2
U Reverse each chunk
Output is implicitly as one string
Другой ṙповорачивает его на $( Hполовина длины струны L), а затем делает то же самое для второй части задачи.
Python 3 , 75 байт
Как и просили: ввод из командной строки, вывод в STDOUT.
import sys
_,s=sys.argv
i=1
while s[i:]:print(end=s[i-len(s)//2]);i+=3|i%-2
Попробуйте онлайн!
Python 2 , 52 байта
Если мы можем использовать функцию:
f=lambda s,i=1:s[i:]and s[i-len(s)/2]+f(s,i+3-i%2*4)
Попробуйте онлайн!
Идея всего этого в том, что индекс \$i\$'й выходной символ в строке длины \$n\$является:
$$ i - \frac{n}{2} + (-1)^i $$
С учетом обычной семантики индексации Python. Если мы перепишем это итеративно, то \$i\$'й выходной символ:
$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3 - 4(i\%2) $$
Короче с определенным приоритетом:
$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3|(i\%-2) $$
Python 2 , 50 байт
f=lambda s,i=0:s[i:]and s[(i^1)-len(s)/2]+f(s,i+1)
Попробуйте онлайн!
Заимствуя идеи Sisyphus , i'th символ вывода является символом с индексом (i^1)-len(s)/2ввода. Здесь i^1XOR с 1, который переворачивает последний бит и, таким образом, меняет местами четные/нечетные пары 0<->1, 2<->3, 4<->5, ...
Вот нерекурсивная альтернатива той же длины, хотя она выводит список символов, которые, я не уверен, разрешены.
lambda s:[s[(i^1)-len(s)/2]for i in range(len(s))]
Попробуйте онлайн!
C (gcc) , 73 72 70 байт
Сэкономлено 2 байта благодаря Доминику ван Эссену !!!
i;l;f(char*s){for(i=1;(l=strlen(s))/i;)putchar(s[(i+l/2-++i%2*2)%l]);}
Попробуйте онлайн!
Вводит строку и выводит расшифровку.
Объяснение
Сопоставляет индекс (начиная с \$0\$до конца), входной строки, \$s\$длины \$l\$, в нужное место, переместив его на \$\frac{l}{2}+1\$места, а затем обратно \$2\$для нечетных индексов. Используя это \$\mod{l}\$дает правильный индекс \$s\$для следующего выходного символа.
JavaScript (Node.js) , 71 65 байт
s=>(s.slice(l=s.length/2)+s.slice(0,l)).replace(/(.)(.)/g,'$2$1')
Попробуйте онлайн!
Сэкономлено 6 байт благодаря @Shaggy.
Исходное 71-байтовое решение:
s=>(l=>s.slice(l)+s.slice(0,l))(s.length/2).replace(/(\w)(\w)/g,'$2$1')
Здесь все довольно просто — я использовал внутреннюю функцию, потому что мне все равно приходилось окружать вызовы slice— это экономит 4 байта.
Брахилог , 8 байт
ḍ↔cġ₂↔ᵐc
Попробуйте онлайн!
Как это работает
ḍ↔cġ₂↔ᵐc
ḍ split in two halves
↔ reverse
c join
ġ₂ group with length two
↔ᵐ reverse each
c join
Python 3 , 91 байт
a=input();x=len(a)//2;b=a[x:]+a[:x];c=''
for i in range(0,len(b),2):c+=b[i+1]+b[i]
print(c)
Попробуйте онлайн!
Пип , 21 байт
RV_M(JRV(a<>#a/2)<>2)
Попробуйте онлайн!
Объяснение
RV_M(JRV(a<>#a/2)<>2)
(a<>#a/2) split input into parts of size length/2
JRV reverse the list, and join it to string
<>2 split the joined string into parts of size 2
RV_M reverse each of those parts
implicit output
C (gcc) , 78 76 78 74 байта
Спасибо потолку за -4!
Изменить: возвращено использование сложения вместо ИЛИ, чтобы избежать проблем с приоритетом операторов.
Вместо того, чтобы разбивать строку, функция начинается с середины строки и обходит всю обработанную строку. Чтобы перевернуть каждый второй символ, индекс инвертирует 1-ю позицию счетчика.
f(s,i,j)char*s;{for(i=strlen(s),j=0;write(1,s+(i/2+j++/2*2+j%2)%i,j<i););}
Попробуйте онлайн!
Если программа обязательно должна взять из командной строки: 82 байта
main(i,s,j)char**s;{for(i=strlen(*++s),j=0;write(1,*s+(i/2+j++/2*2+j%2)%i,j<i););}
Попробуйте онлайн!
Стакс , 10 байт
ü♠yαæ♠╟«ºñ
Запустите и отладьте его
Какой замечательный онлайн-переводчик.
Ссылка на распакованную версию кода.
Объяснение
;%h/r$2/Frp
; copy input
% get it's length
h halve it
/ split input into parts of that size
r reverse
$ join to string
2/ split into parts of size 2
F for each element in the resulting array:
rp reverse, and print without newline.
K (ngn/k) , 17 байт
,/|'0N 2#,/|2 0N#
Попробуйте онлайн!
Фактор , 89 байт
: d ( s -- s ) halves swap [ >array ] bi@ append 2 group [ reverse ] map concat >string ;
Попробуйте онлайн!
R , 64 63 байта
m=matrix;intToUtf8(m(m(utf8ToInt(scan(,"")),,2)[,2:1],2)[2:1,])
Попробуйте онлайн!
Использовал другой подход, чем Доминик ван Эссен , который проиграл в гольф на байт. Использует изменение формы/индексацию матрицы для реверсирования.
Без гольфа:
s <- utf8ToInt(scan(,"")) # read input and convert to a list of byte values
m <- matrix(s,,2) # convert to a Nx2 matrix, filling down by columns
m <- m[,2:1] # reverse the columns of the matrix (flip the halves)
m <- matrix(m,2) # convert to an Nx2 matrix, filling down by the columns
m <- m[2:1,] # reverse the rows (swap adjacent characters)
intToUtf8(m) # convert back to string
bash+sed, 57 байт
Принимает ввод в качестве аргумента командной строки.
<<<"${1:${#1}/2}${1:0:${#1}/2}" sed 's/\(.\)\(.\)/\2\1/g'
Попробуйте онлайн!
Бурлеск , 17 байт
iRsa2./!!2co)<-++
Попробуйте онлайн!
Описание:
iR # Generate all rotations of the input string
sa # Duplicate and get length (which equals string length)
2./ # Divide by two
!! # And grab the string that's been rotated that many times
2co # Split the rotated string into chunks of two
<- # Reverse each chunk
++ # Join together and implicitly output
Джапт -P , 9 байт
éUÊz)ò mw
Попробуй
éUÊz)ò mw :Implicit input of string U
é :Rotate right by
UÊ : Length of U
z : Floor divided by 2
) :End rotate
ò :Partitions of length 2
m :Map
w : Reverse
:Implicitly join and output
Уголь , 13 байт
⭆⪪⪫⮌⪪θ⊘Lθω²⮌ι
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
θ Input string
L Length
⊘ Halved
⪪θ Split input string into substrings of this length
⮌ Reverse
⪫ ω Join together
⪪ ² Split into substrings of length 2
⭆ Map over substrings and join
ι Current substring
⮌ Reversed
Implicitly print
Ретина 0.8.2 , 36 байт
((.)+?)((?<-2>.)+)$
$3$1
(.)(.)
$2$1
Попробуйте онлайн! Объяснение: На первом этапе используется балансировочная группа .NET для сопоставления как можно меньшего числа символов $1при сохранении того же числа символов в $3. $#2увеличивается для каждого совпадающего символа $1и уменьшается для каждого совпадающего символа, $3но он не может уменьшаться ниже нуля, поэтому $1вынужден потреблять первую половину строки, чтобы обеспечить достижение конца строки. Затем на втором этапе переворачиваются пары соседних символов. (Также арт-объекты ASCII.)
МатГольф , 10 байт
h½/xy2/mx~
Попробуйте онлайн.
Объяснение:
h # Get the length of the (implicit) input-string (without popping)
# i.e. "HGJILKBADCFE" → "HGJILKBADCFE" and 12
½ # Halve this length
# → "HGJILKBADCFE" and 6
/ # Split the string into parts of that size
# → ["HGJILK","BADCFE"]
x # Reverse this pair
# → ["BADCFE","HGJILK"]
y # Join it back together to a string
# → "BADCFEHGJILK"
2/ # Split it into parts of size 2
# → ["BA","DC","FE","HG","JI","LK"]
m # Map over each pair:
x # Reverse the pair
# → ["AB","CD","EF","GH","IJ","KL"]
~ # Pop and push all strings separated to the stack
# → "AB", "CD", "EF", "GH", "IJ", and "KL"
# (after which the entire stack joined together is output implicitly)
# → "ABCDEFGHIJKL"
Красный , 89 байт
func[s][move/part s tail s(length? s)/ 2
rejoin collect[foreach[b a]s[keep rejoin[a b]]]]
Попробуйте онлайн!
Луа , 67 байт
a=...b=#a//2print(((a:sub(b+1)..a:sub(1,b)):gsub('(.)(.)','%2%1')))
Попробуйте онлайн!
Сначала строка разрезается на две части с помощью subфункций, а затем объединяется обратно в обратном порядке. Затем gsubиспользуется для замены пар символов.
Wolfram Language (Mathematica) , 64 51 байт
#[[#+UnitStep@#&@Array[#+(-1)^#&,L=Tr[1^#],-L/2]]]&
Попробуйте онлайн!
Порт решения Sisyphus Python
CJam , 13 байт
q2/::\_,2//:\
Попробуйте онлайн!
Перл 5 -pF , 40 байт
for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}
Попробуйте онлайн!
Поэтический , 472 байта
DECODING THINGS:A BRIEFING
o,o,hello!i am agent Q
nah,Q`s chosen by an infamous phoney
a misprint!oh,sorry!am i sorry
i am agent J.W,tech/A.I hacker
i see a piece o code,i am trying at a means on how i decode it
what i am doing:i am laying all A-Z clearly along a pathway
midway,put in zeros(O,O)cause J.W needs it to split em
i shift em in tandem,i get B,A
lastly,if it leaves you a letter,it is moved
o,then i am doing A-Z again,it is taken to a shift
ah ha!spying is EZ
Попробуйте онлайн!