La fonction de décryptage
Vous devez écrire un programme qui prend une chaîne cryptée et la décrypter selon des règles spécifiques, puis l'imprimer. Le décryptage se fera en effectuant deux opérations.
Exemple d'argument d'entrée 1 (la chaîne chiffrée)
HGJILKBADCFE
Opération 1:
Échangez la première moitié de la chaîne avec la seconde moitié, ce qui devrait vous laisser avec:
BADCFEHGJILK
Opération 2:
Échangez tous les deux caractères entre eux, par exemple en échangeant le caractère 1 avec 2, 3 avec 4, etc., ce qui devrait vous laisser avec la chaîne déchiffrée:
ABCDEFGHIJKL
Des lignes directrices:
L'argument d'entrée 1 ne contiendra que des lettres majuscules
La longueur de l'argument d'entrée 1 sera comprise entre 2 et 100 caractères
La longueur de l'argument d'entrée 1 sera toujours un nombre pair
De préférence, l'entrée sera prise à partir de la ligne de commande (comme ci-dessous).
Un autre cas de test
MPORQTSVUXWZYBADCFEHGJILKNest l'entrée, la sortie estABCDEFGHIJKLMNOPQRSTUVWXYZ
Ma tentative
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])))
Réponses
J , 15 octets
[:,_2|.\-:@#|.]
Essayez-le en ligne!
Mise en œuvre simple de la formule.
Un peu plus intéressant (pas utile pour le J golf, mais peut-être pour un autre langage) est que l'algorithme peut être résolu avec une somme de balayage:
- Prenez d'abord un
1suivi de-1 3, avec-1 3répété jusqu'à la longueur de la liste. - Scannez la somme de cette liste.
- Faites pivoter les nombres de moitié sur la longueur de la liste.
- Triez l'original en fonction de ces nombres.
Voir le TIO pour une démo dans J.
Rubis -p , 48 47 octets
$_=$_[l= ~/$//2,l]+$_[0,l];gsub /(.)(.)/,'\2\1'
Essayez-le en ligne!
L'opération 1 est gérée en divisant $_(la variable globale prédéfinie qui contient l'entrée) en deux sous-chaînes de longueur égale; ~/$/donne la longueur de l'entrée. Termine ensuite l' gsub /(.)(.)/,'\2\1'opération 2 en échangeant chaque paire de caractères. (Avec le -pdrapeau, gsubsans récepteur agit implicitement $_.)
05AB1E , 13 12 octets
D2äRJ2ι`s.ιJ
Essayez-le en ligne!
-1 grâce à un conseil de golf de @Kevin que j'ai vu sur une autre réponse
Expliqué
D2äRJ2ι`s.ιJ
- Dupliquer l'entrée (
D) - Divisez-le en 2 morceaux (
2ä) - Inversez la liste et joignez-la en une seule chaîne (
RJ) - Désentrelacer cette chaîne à chaque deuxième caractère (
2ι) - Poussez tous les éléments de la chaîne non entrelacée sur la pile (`` '')
- Entrelacez ces éléments (
.ι) - Et rejoignez la liste résultante (
J)
APL + WIN, 24 22 octets
-2 octets grâce à Jo King
Invite à saisir une chaîne:
,⌽n⍴⊖(⌽n←⌽2,.5×⍴s)⍴s←⎕
Essayez-le en ligne! Gracieuseté de Dyalog Classic
R , 78 80 79 octets
Edit: +2 octets grâce à Dingus pour la détection des bogues, et -1 octet grâce à pajonk
n=nchar(s<-scan(,''));o=1:n;cat(substring(s,p<-(o+n/2-2+2*o%%2)%%n+1,p),sep='')
Essayez-le en ligne!
Entrée fournie via la console R (qui pourrait être considérée comme la «ligne de commande» pour l'espace de travail R).
R peut également être appelé à partir d'un shell (non-R), en utilisant le Rscriptfrontal d'assistance, ce qui permettrait aux arguments de ligne de commande de suivre directement l'appel, auquel cas un programme modifié pourrait faire 87 octets et appelé en utilisant Rscript decrypt.r HGJILKBADCFE.
Calcule les positions des lettres décodées, puis génère une chaîne réorganisée.
Commenté:
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
Gelée , 7 octets
ŒHṚFs2U
Essayez-le en ligne!
7 octets équivalente, ṙLH$s2U.
Explication
Œ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
L'autre le ṙnote par $( Half du Lpoids de la corde ) puis fait la même chose pour la deuxième partie du défi.
Python 3 , 75 octets
Exactement comme demandé: entrée depuis la ligne de commande, sortie vers STDOUT.
import sys
_,s=sys.argv
i=1
while s[i:]:print(end=s[i-len(s)//2]);i+=3|i%-2
Essayez-le en ligne!
Python 2 , 52 octets
Si nous pouvons utiliser une fonction:
f=lambda s,i=1:s[i:]and s[i-len(s)/2]+f(s,i+3-i%2*4)
Essayez-le en ligne!
L'idée de tout cela est que l'index du \$i\$'ème caractère de sortie dans une chaîne de longueur \$n\$ est:
$$ i - \frac{n}{2} + (-1)^i $$
Soumis à la sémantique d'indexation Python habituelle. Si nous réécrivons ceci de manière itérative, alors le \$i\$Le caractère de sortie est:
$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3 - 4(i\%2) $$
Plus court avec une certaine priorité est:
$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3|(i\%-2) $$
Python 2 , 50 octets
f=lambda s,i=0:s[i:]and s[(i^1)-len(s)/2]+f(s,i+1)
Essayez-le en ligne!
Empruntant des idées à Sisyphe , le i«ième caractère de la sortie est le caractère à l'index (i^1)-len(s)/2de l'entrée. Ici, i^1est XOR avec 1, qui fait osciller le dernier bit et donc swaps même / paires impaires 0<->1, 2<->3, 4<->5, ...
Voici une alternative non récursive pour la même longueur, bien qu'elle génère une liste de caractères dont je ne suis pas sûr qu'elle soit autorisée.
lambda s:[s[(i^1)-len(s)/2]for i in range(len(s))]
Essayez-le en ligne!
C (gcc) , 73 72 70 octets
Sauvé 2 octets grâce à Dominic van Essen !!!
i;l;f(char*s){for(i=1;(l=strlen(s))/i;)putchar(s[(i+l/2-++i%2*2)%l]);}
Essayez-le en ligne!
Entre une chaîne et sort le décryptage.
Explication
Mappe l'index (à partir de \$0\$à la fin), de la chaîne d'entrée, \$s\$de longueur \$l\$, au bon endroit en le déplaçant sur \$\frac{l}{2}+1\$lieux puis retour \$2\$pour les indices impairs. En utilisant ceci \$\mod{l}\$donne l'indice correct de \$s\$ pour le prochain caractère de sortie.
JavaScript (Node.js) ,
71
65 octets
s=>(s.slice(l=s.length/2)+s.slice(0,l)).replace(/(.)(.)/g,'$2$1')
Essayez-le en ligne!
Sauvegardé 6 octets grâce à @Shaggy.
Solution originale de 71 octets:
s=>(l=>s.slice(l)+s.slice(0,l))(s.length/2).replace(/(\w)(\w)/g,'$2$1')
Des trucs assez simples ici - j'ai utilisé une fonction interne parce que je devais de slicetoute façon entourer les appels - cela économise 4 octets.
Brachylog , 8 octets
ḍ↔cġ₂↔ᵐc
Essayez-le en ligne!
Comment ça fonctionne
ḍ↔cġ₂↔ᵐc
ḍ split in two halves
↔ reverse
c join
ġ₂ group with length two
↔ᵐ reverse each
c join
Python 3 , 91 octets
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)
Essayez-le en ligne!
Pip , 21 octets
RV_M(JRV(a<>#a/2)<>2)
Essayez-le en ligne!
Explication
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 octets
Merci à plafonnier pour le -4!
Edit: rétabli pour utiliser l'addition au lieu de OR pour éviter les problèmes de priorité des opérateurs.
Plutôt que de diviser la chaîne, la fonction commence au milieu de la chaîne et s'enroule autour de la chaîne entière a été traitée. Pour inverser tous les autres caractères, l'index inverse la position 1 du compteur.
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););}
Essayez-le en ligne!
Si le programme doit absolument prendre de la ligne de commande: 82 octets
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););}
Essayez-le en ligne!
Stax , 10 octets
ü♠yαæ♠╟«ºñ
Exécutez et déboguez-le
Quel merveilleux interprète en ligne.
Le lien est vers la version décompressée du code.
Explication
;%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 octets
,/|'0N 2#,/|2 0N#
Essayez-le en ligne!
Facteur , 89 octets
: d ( s -- s ) halves swap [ >array ] bi@ append 2 group [ reverse ] map concat >string ;
Essayez-le en ligne!
R , 64 63 octets
m=matrix;intToUtf8(m(m(utf8ToInt(scan(,"")),,2)[,2:1],2)[2:1,])
Essayez-le en ligne!
A pris une approche différente de celle de Dominic van Essen , qui a joué au golf d'un octet. Utilise le remodelage / indexation de la matrice pour effectuer l'inversion.
Non golfé:
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 octets
Prend l'entrée comme argument de ligne de commande.
<<<"${1:${#1}/2}${1:0:${#1}/2}" sed 's/\(.\)\(.\)/\2\1/g'
Essayez-le en ligne!
Burlesque , 17 octets
iRsa2./!!2co)<-++
Essayez-le en ligne!
La description:
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
Japt -P , 9 octets
éUÊz)ò mw
Essayez-le
é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
Charbon , 13 octets
⭆⪪⪫⮌⪪θ⊘Lθω²⮌ι
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
θ 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
Retina 0.8.2 , 36 octets
((.)+?)((?<-2>.)+)$ $3$1 (.)(.) $2$1
Essayez-le en ligne! Explication: La première étape utilise un groupe d'équilibrage .NET pour faire correspondre le moins de caractères possible $1tout en faisant correspondre le même nombre de caractères en $3. $#2incrémente pour chaque caractère correspondant à $1et décrémente pour chaque caractère correspondant à $3mais il ne peut pas décrémenter en dessous de zéro, il $1est donc forcé de consommer la première moitié de la chaîne pour permettre d'atteindre la fin de la chaîne. La deuxième étape retourne ensuite des paires de caractères adjacents. (Aussi l'art ASCII bewbs.)
MathGolf , 10 octets
h½/xy2/mx~
Essayez-le en ligne.
Explication:
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"
Rouge , 89 octets
func[s][move/part s tail s(length? s)/ 2
rejoin collect[foreach[b a]s[keep rejoin[a b]]]]
Essayez-le en ligne!
Lua , 67 octets
a=...b=#a//2print(((a:sub(b+1)..a:sub(1,b)):gsub('(.)(.)','%2%1')))
Essayez-le en ligne!
Tout d'abord, la chaîne est coupée en deux à l'aide de subfonctions, puis concaténée dans l'ordre inverse. Ensuite, gsubest utilisé pour permuter les paires de caractères.
Wolfram Language (Mathematica) , 64 51 octets
#[[#+UnitStep@#&@Array[#+(-1)^#&,L=Tr[1^#],-L/2]]]&
Essayez-le en ligne!
La solution Python de Port of Sisyphus
CJam , 13 octets
q2/::\_,2//:\
Essayez-le en ligne!
Perl 5 -pF , 40 octets
for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}
Essayez-le en ligne!
Poétique , 472 octets
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
Essayez-le en ligne!