Funkcja deszyfrowania
Musisz napisać program, który pobiera zaszyfrowany ciąg i odszyfrowuje go zgodnie z określonymi regułami, a następnie wydrukuje. Odszyfrowanie nastąpi poprzez wykonanie dwóch operacji.
Przykładowy argument wejściowy 1 (zaszyfrowany ciąg)
HGJILKBADCFE
Operacja 1:
Zamień pierwszą połowę struny na drugą, co powinno dać ci:
BADCFEHGJILK
Operacja 2:
Zamień ze sobą co dwa znaki, na przykład zamieniając znak 1 na 2, 3 na 4 itp., Co powinno pozostawić ci odszyfrowany ciąg:
ABCDEFGHIJKL
Wytyczne:
Argument wejściowy 1 będzie zawierał tylko wielkie litery
Długość argumentu wejściowego 1 będzie wynosić od 2 do 100 znaków
Długość argumentu wejściowego 1 zawsze będzie liczbą parzystą
Najlepiej, aby dane wejściowe były pobierane z wiersza poleceń (jak poniżej).
Innym przypadkiem testowym
MPORQTSVUXWZYBADCFEHGJILKNjest wejście, wyjście toABCDEFGHIJKLMNOPQRSTUVWXYZ
Moja próba
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])))
Odpowiedzi
J , 15 bajtów
[:,_2|.\-:@#|.]
Wypróbuj online!
Prosta implementacja wzoru.
Nieco bardziej interesujący (nie pomocny w grze w golfa J, ale może w innym języku) jest to, że algorytm można rozwiązać za pomocą sumy skanów:
- Pierwszy wziąć
1następuje-1 3z-1 3powtarzany aż do długości listy. - Zeskanuj podsumowanie tej listy.
- Obróć liczby o połowę długości listy.
- Posortuj oryginał według tych numerów.
Zobacz TIO, aby zobaczyć demo w J.
Ruby -p , 48 47 bajtów
$_=$_[l= ~/$//2,l]+$_[0,l];gsub /(.)(.)/,'\2\1'
Wypróbuj online!
Operacja 1 jest obsługiwana przez podzielenie $_(wstępnie zdefiniowanej zmiennej globalnej, która zawiera dane wejściowe) na dwa podciągi o równej długości; ~/$/podaje długość wejścia. Następnie gsub /(.)(.)/,'\2\1'kończy Operację 2, zamieniając każdą parę znaków. (Z -pflagą, gsubbez odbiorcy niejawnie działa na $_.)
05AB1E , 13 12 bajtów
D2äRJ2ι`s.ιJ
Wypróbuj online!
-1 dzięki wskazówce dotyczącej golfa od @Kevin Widziałem w innej odpowiedzi
Wyjaśniono
D2äRJ2ι`s.ιJ
- Powiel dane wejściowe (
D) - Podziel na 2 części (
2ä) - Odwróć listę i połącz ją w jeden ciąg (
RJ) - Usuń przeplot z tego ciągu co drugi znak (
2ι) - Wepchnij wszystkie elementy z nieprzetworzonego ciągu na stos (`` '')
- Przeplot te elementy (
.ι) - I dołącz do wynikowej listy (
J)
APL + WIN, 24 22 bajty
-2 bajty dzięki Jo Kingowi
Monity o wprowadzenie ciągu:
,⌽n⍴⊖(⌽n←⌽2,.5×⍴s)⍴s←⎕
Wypróbuj online! Dzięki uprzejmości Dyalog Classic
R , 78 80 79 bajtów
Edycja: +2 bajty dzięki Dingusowi za wykrywanie błędów i -1 bajt dzięki pajonk
n=nchar(s<-scan(,''));o=1:n;cat(substring(s,p<-(o+n/2-2+2*o%%2)%%n+1,p),sep='')
Wypróbuj online!
Dane wejściowe podawane przez konsolę R (którą można uznać za „wiersz poleceń” dla obszaru roboczego języka R).
R można również wywołać z powłoki (innej niż R), używając Rscriptinterfejsu pomocniczego, który pozwoliłby argumentom wiersza poleceń na bezpośrednie śledzenie wywołania, w którym to przypadku zmodyfikowany program mógłby mieć 87 bajtów i zostać wywołany using Rscript decrypt.r HGJILKBADCFE.
Oblicza pozycje zdekodowanych liter, a następnie wyświetla zmieniony ciąg.
Skomentował:
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
Galaretka , 7 bajtów
ŒHṚFs2U
Wypróbuj online!
Równoważnie 7 bajtów ṙLH$s2U.
Wyjaśnienie
Œ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
Drugi ṙoznacza to przez $( Half z ength struny L), a następnie robi to samo dla drugiej części wyzwania.
Python 3 , 75 bajtów
Dokładnie tak, jak pytano: wejście z wiersza poleceń, wyjście do STDOUT.
import sys
_,s=sys.argv
i=1
while s[i:]:print(end=s[i-len(s)//2]);i+=3|i%-2
Wypróbuj online!
Python 2 , 52 bajty
Jeśli możemy użyć funkcji:
f=lambda s,i=1:s[i:]and s[i-len(s)/2]+f(s,i+3-i%2*4)
Wypróbuj online!
Idea tego wszystkiego polega na tym, że indeks \$i\$'ten znak wyjściowy w ciągu długości \$n\$ jest:
$$ i - \frac{n}{2} + (-1)^i $$
Z zastrzeżeniem zwykłej semantyki indeksowania Pythona. Jeśli przepisamy to w sposób iteracyjny, to \$i\$'ten znak wyjściowy to:
$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3 - 4(i\%2) $$
Krótszy z pewnym priorytetem to:
$$ a_i - \frac{n}{2} \text{ where } a_0 = 1 \text{ and } a_i = a_{i-1} + 3|(i\%-2) $$
Python 2 , 50 bajtów
f=lambda s,i=0:s[i:]and s[(i^1)-len(s)/2]+f(s,i+1)
Wypróbuj online!
Zapożyczając pomysły od Syzyfa , iczwartym charakterem wyjścia jest znak w indeksie (i^1)-len(s)/2wejścia. Tutaj i^1jest z XOR 1, która odwraca ostatni kawałek i tak swapów parzyste / nieparzyste pary 0<->1, 2<->3, 4<->5, ...
Oto nierekurencyjna alternatywa dla tej samej długości, chociaż generuje listę znaków, co do których nie jestem pewien, jest dozwolone.
lambda s:[s[(i^1)-len(s)/2]for i in range(len(s))]
Wypróbuj online!
C (gcc) , 73 72 70 bajtów
Zapisano 2 bajty dzięki Dominicowi van Essenowi !!!
i;l;f(char*s){for(i=1;(l=strlen(s))/i;)putchar(s[(i+l/2-++i%2*2)%l]);}
Wypróbuj online!
Wprowadza ciąg i wyprowadza deszyfrację.
Wyjaśnienie
Mapuje indeks (zaczynając od \$0\$do końca) ciągu wejściowego, \$s\$długości \$l\$, we właściwe miejsce, przesuwając go nad \$\frac{l}{2}+1\$miejsc, a potem z powrotem \$2\$dla nieparzystych indeksów. Korzystanie z tego \$\mod{l}\$podaje poprawny indeks \$s\$ dla następnego znaku wyjściowego.
JavaScript (Node.js) ,
71
65 bajtów
s=>(s.slice(l=s.length/2)+s.slice(0,l)).replace(/(.)(.)/g,'$2$1')
Wypróbuj online!
Zapisano 6 bajtów dzięki @Shaggy.
Oryginalne rozwiązanie 71-bajtowe:
s=>(l=>s.slice(l)+s.slice(0,l))(s.length/2).replace(/(\w)(\w)/g,'$2$1')
Dość proste rzeczy - użyłem funkcji wewnętrznej, ponieważ i tak musiałem otoczyć slicewywołania - oszczędza to 4 bajty.
Brachylog , 8 bajtów
ḍ↔cġ₂↔ᵐc
Wypróbuj online!
Jak to działa
ḍ↔cġ₂↔ᵐc
ḍ split in two halves
↔ reverse
c join
ġ₂ group with length two
↔ᵐ reverse each
c join
Python 3 , 91 bajtów
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)
Wypróbuj online!
Pip , 21 bajtów
RV_M(JRV(a<>#a/2)<>2)
Wypróbuj online!
Wyjaśnienie
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 bajty
Dzięki Sufitcat za -4!
Edycja: przywrócono używanie dodawania zamiast OR, aby uniknąć problemów z pierwszeństwem operatorów.
Zamiast rozdzielać ciąg, funkcja rozpoczyna się w środku ciągu i zawija się wokół całego ciągu. Aby odwrócić co drugi znak, indeks odwraca pozycję 1s licznika.
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););}
Wypróbuj online!
Jeśli program bezwzględnie musi pobierać z wiersza poleceń: 82 bajty
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););}
Wypróbuj online!
Stax , 10 bajtów
ü♠yαæ♠╟«ºñ
Uruchom i debuguj
Co za wspaniały tłumacz online.
Link prowadzi do rozpakowanej wersji kodu.
Wyjaśnienie
;%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 bajtów
,/|'0N 2#,/|2 0N#
Wypróbuj online!
Czynnik , 89 bajtów
: d ( s -- s ) halves swap [ >array ] bi@ append 2 group [ reverse ] map concat >string ;
Wypróbuj online!
R , 64 63 bajty
m=matrix;intToUtf8(m(m(utf8ToInt(scan(,"")),,2)[,2:1],2)[2:1,])
Wypróbuj online!
Przyjął inne podejście niż Dominic van Essen , który zagrał o bajt. Używa przekształcania / indeksowania macierzy, aby wykonać odwrócenie.
Ungolfed:
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 bajtów
Pobiera dane wejściowe jako argument wiersza poleceń.
<<<"${1:${#1}/2}${1:0:${#1}/2}" sed 's/\(.\)\(.\)/\2\1/g'
Wypróbuj online!
Burlesque , 17 bajtów
iRsa2./!!2co)<-++
Wypróbuj online!
Opis:
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 bajtów
éUÊz)ò mw
Spróbuj
é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
Węgiel , 13 bajtów
⭆⪪⪫⮌⪪θ⊘Lθω²⮌ι
Wypróbuj online! Link prowadzi do pełnej wersji kodu. Wyjaśnienie:
θ 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 bajtów
((.)+?)((?<-2>.)+)$ $3$1 (.)(.) $2$1
Wypróbuj online! Objaśnienie: Pierwszy etap wykorzystuje grupę równoważenia .NET do dopasowania jak najmniejszej $1liczby znaków do, przy jednoczesnym dopasowaniu tej samej liczby znaków do $3. $#2przyrosty dla każdego dopasowanego znaku do $1i ubytki dla każdego dopasowanego znaku do, $3ale nie mogą one spaść poniżej zera, więc $1jest zmuszony zużywać pierwszą połowę ciągu, aby umożliwić dotarcie do końca ciągu. W drugim etapie następuje odwrócenie par sąsiadujących znaków. (Również grafika ASCII).
MathGolf , 10 bajtów
h½/xy2/mx~
Wypróbuj online.
Wyjaśnienie:
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"
Czerwony , 89 bajtów
func[s][move/part s tail s(length? s)/ 2
rejoin collect[foreach[b a]s[keep rejoin[a b]]]]
Wypróbuj online!
Lua , 67 bajtów
a=...b=#a//2print(((a:sub(b+1)..a:sub(1,b)):gsub('(.)(.)','%2%1')))
Wypróbuj online!
Najpierw ciąg jest dzielony na dwie części za pomocą subfunkcji, a następnie łączony z powrotem w odwrotnej kolejności. Następnie gsubsłuży do zamiany par znaków.
Język Wolfram (Mathematica) , 64 51 bajtów
#[[#+UnitStep@#&@Array[#+(-1)^#&,L=Tr[1^#],-L/2]]]&
Wypróbuj online!
Rozwiązanie Port of Sisyphus w Pythonie
CJam , 13 bajtów
q2/::\_,2//:\
Wypróbuj online!
Perl 5 -pF , 40 bajtów
for$p("."x(@F/2),"."){s/($p)($p)/$2$1/g}
Wypróbuj online!
Poetic , 472 bajty
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
Wypróbuj online!