La fonction de décryptage

Sep 21 2020

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

5 Jonah Sep 21 2020 at 10:59

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:

  1. Prenez d'abord un 1suivi de -1 3, avec -1 3répété jusqu'à la longueur de la liste.
  2. Scannez la somme de cette liste.
  3. Faites pivoter les nombres de moitié sur la longueur de la liste.
  4. Triez l'original en fonction de ces nombres.

Voir le TIO pour une démo dans J.

5 Dingus Sep 21 2020 at 10:26

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 $_.)

5 Lyxal Sep 21 2020 at 11:36

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)
5 Graham Sep 21 2020 at 14:15

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

5 DominicvanEssen Sep 21 2020 at 14:48

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
3 HyperNeutrino Sep 21 2020 at 09:44

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.

3 Sisyphus Sep 21 2020 at 12:10

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) $$

3 xnor Sep 21 2020 at 17:11

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!

3 Noodle9 Sep 21 2020 at 19:57

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.

3 nununoisy Sep 21 2020 at 23:39

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.

2 xash Sep 21 2020 at 16:34

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 
1 aidan0626 Sep 21 2020 at 10:08

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!

1 Razetime Sep 21 2020 at 11:05

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
1 ErikF Sep 21 2020 at 13:45

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!

1 Razetime Sep 21 2020 at 17:16

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.
1 GalenIvanov Sep 21 2020 at 17:48

K (ngn / k) , 17 octets

,/|'0N 2#,/|2 0N#

Essayez-le en ligne!

1 GalenIvanov Sep 21 2020 at 18:41

Facteur , 89 octets

: d ( s -- s ) halves swap [ >array ] bi@ append 2 group [ reverse ] map concat >string ;

Essayez-le en ligne!

1 Giuseppe Sep 21 2020 at 21:50

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
1 nununoisy Sep 23 2020 at 03:28

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!

Mintable Sep 21 2020 at 15:44

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
Shaggy Sep 21 2020 at 15:48

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
Neil Sep 21 2020 at 16:49

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
Neil Sep 21 2020 at 17:00

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.)

KevinCruijssen Sep 21 2020 at 17:08

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"
GalenIvanov Sep 21 2020 at 17:29

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!

valsaysReinstateMonica Sep 21 2020 at 22:52

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.

att Sep 22 2020 at 05:54

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

EsolangingFruit Sep 22 2020 at 14:26

CJam , 13 octets

q2/::\_,2//:\

Essayez-le en ligne!

NahuelFouilleul Sep 22 2020 at 17:07

Perl 5 -pF , 40 octets

for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}

Essayez-le en ligne!

JosiahRyanW Sep 30 2020 at 18:31

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!