Zakoduj szyfr alfabetyczny

24

Biorąc pod uwagę ciąg znaków, który zawiera tylko małe litery, należy go zakodować za pomocą szyfru alfabetu.

Aby zakodować za pomocą szyfru alfabetu (skorzystam z przykładu hello):

  1. Najpierw przekonwertuj każdą literę ciągu na liczbę w zależności od jej pozycji w alfabecie ( a= 1, b= 2itd.) Przykład:8 5 12 12 15
  2. Wpisz każdą cyfrę do dwóch znaków za pomocą 0s. Przykład:08 05 12 12 15
  3. Przystąpić. Przykład:0805121215

Przypadki testowe

helloworld -> 08051212152315181204
codegolf -> 0315040507151206
alphabetcipher -> 0112160801020520030916080518
johncena -> 1015081403051401

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
Związane z.
Oliver Ni

Odpowiedzi:

23

05AB1E , 11 6 bajtów

Kod:

Ç4+€¦J

Wyjaśnienie:

Najpierw konwertujemy ciąg na ich wartości ASCII. codegolfstanie się:

[99, 111, 100, 101, 103, 111, 108, 102]

Aby przejść do indeksów alfabetu, odejmij 96:

[3, 15, 4, 5, 7, 15, 12, 6]

Aby wstawić zera, dodaj 100do każdego elementu i usuń pierwszy znak z każdej int. W powyższym przykładzie +100byłoby:

[103, 115, 104, 105, 107, 115, 112, 106]

A usunięcie pierwszego znaku każdego z nich doprowadziłoby do:

[03, 15, 04, 05, 07, 15, 12, 06] 

Możemy połączyć oba kroki powyżej ( -96i i +100) do just +4. Dla kodu:

Ç       # Convert to an array of ASCII code points
 4+     # Add four to each element in the array
   €¦   # Remove the first character of each element
     J  # Join to a single string

Wypróbuj online!

Adnan
źródło
Co robi ¦ponownie?
Magic Octopus Urn
@carusocomputing Usuwa pierwszy element ciągu, listy itp.
Adnan
Ponad geniusz ...
Magiczna ośmiornica Urn
12

Python 2, 42 bajty

f=lambda s:s and`ord(s[0])+4`[1:]+f(s[1:])

Przetestuj na Ideone .

Dennis
źródło
5
Brak rekurencji, ta sama liczba bajtów:lambda s:''.join(`ord(x)+4`[1:]for x in s)
Jonathan Allan
8

Pyth, 11 10 bajtów

FNwpt`+4CN

Spróbuj! Mój pierwszy raz w Pyth.

FNwpt`+4CN
FNw         # For N in w (w is input, N will be single char)
   p        # Print without newline
        CN  # Int with code point `N`
      +4CN  # Add 4 to int with code point N
     `+4CN  # representation of above (basically to string)
    t`+4CN  # Tail (All but first character)

Odpowiednik w języku Python:

for N in input():
    print(repr(ord(N) + 4)[1:], end='')
Artyer
źródło
Dobra robota w pierwszym programie Pyth!
HyperNeutrino,
7

C, 55 43 bajtów

f(char*c){for(;*c;)printf("%02d",*c++-96);}

ideone

o79y
źródło
1
printf("%02d",*c++-96);}jest krótszy i ważny, jeśli się nie mylę.
Dada
6

Python, 46 bajtów

lambda x:"".join("%02i"%(ord(j)-96)for j in x)

Całkiem proste. Wypróbuj na repl.it!

Loovjo
źródło
1
Wow, dwie zupełnie różne próby z tą samą liczbą bajtów;)
Kade,
6

Galaretka , 9 7 bajtów

O+4ṾḊ$€

TryItOnline

W jaki sposób?

O+4ṾḊ$€ - Main link: s                                e.g. hello
O       - cast to ordinals                            e.g. [ 104,  101,  108,  108,  111]
 +4     - add 4                                       e.g. [  108,  109,  112,  112,  115]
     $€ - last two links as a monad for €ach
   Ṿ    -    uneval, effectively converts to strings  e.g. ["108","109","112","112","115"]
    Ḋ   -    dequeue, remove the leading '1'          e.g. [ "08", "09", "12", "12", "15"]
        - implicit print                              e.g. "0809121215"
Jonathan Allan
źródło
Wymyśliłem O+4DḊ€FṾ€dla tej samej liczby, być może golfa
ETHproductions
@ETHproductions O+4Ṿ€Ḋ€oszczędza 2 bajty.
Dennis
@Dennis Właśnie zrobiłem to samo (ish) ...
Jonathan Allan
4

Haskell, czterdzieści cztery 30 28 bajtów

(>>=tail.show.(+4).fromEnum)

Zastosowanie +4podejścia z odpowiedzi Adnana pozwala zaoszczędzić 14 bajtów.

Wypróbuj na Ideone. Stosowanie:

> (>>=tail.show.(+4).fromEnum)"codegolf"
"0315040507151206"

Dwa bajty wyłączone dzięki xnor . Stara wersja:

f a=['0'|a<'k']++(show$fromEnum a-96)
(f=<<)
Laikoni
źródło
Nie potrzebujesz drugiego zestawu parens.
xnor
3

Perl, 29 bajtów

28 bajtów kodu + -nflaga.

printf"%02s",-96+ord for/./g

Biegnij z :

perl -ne 'printf"%02s",-96+ord for/./g' <<< "helloworld"
Dada
źródło
3

JavaScript (ES6), 52 49 bajtów

f=s=>s&&(s.charCodeAt()+4+f(s.slice(1))).slice(1)

Rekurencja okazała się o 3 bajty krótsza niż .replace:

s=>s.replace(/./g,s=>(s.charCodeAt()+4+"").slice(1))

parseInt(s,36)jest nieco dłuższy dla każdego podejścia, ponieważ musisz zmienić 4na 91:

s=>s.replace(/./g,s=>(parseInt(s,36)+91+"").slice(1))
f=s=>s&&(parseInt(s[0],36)+91+f(s.slice(1))).slice(1)
ETHprodukcje
źródło
3

Japt, 10 bajtów

¡4+Xc)s s1

Prawdopodobnie nie jest krótszy niż ten ...

Przetestuj online!

Wyjaśnienie

¡           // Map each char X in the input by this function:
 4+Xc)      //   Take 4 + the char code of X.
      s s1  //   Convert to a string, then remove the first char.
            // Implicit: output last expression
ETHprodukcje
źródło
3

Java 7,60 bajtów

void f(char[]s){for(int i:s)System.out.printf("%02d",i-96);} 
Numberknot
źródło
Ta odpowiedź może być niepoprawna, ponieważ zajmuje char[]zamiast niej String.
HyperNeutrino,
@MartinEnder W porządku. Dziękuję za wyjaśnienie. Ta odpowiedź ma moje poparcie.
HyperNeutrino,
3

MATL, 12 11 bajtów

1 bajt zapisany dzięki @Luis

4+!V4LZ)!le

Wypróbuj online

Suever
źródło
3

Sześciokąt , 33 bajty

10}{'a({=!{{\.@29$\,<.-":!\>Oct\%

Wypróbuj online!

Mm .. dostałem kilka braków w Hexagonie, więc umieściłem dzisiejszą datę.

Rozszerzony formularz z datą zastąpioną przez brak operacji

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. Zainicjuj a 10i przenieś wskaźnik pamięci gdzieś ...
  2. $pomija lustro i ,czyta bajt. <gałęzie:
  3. Jeśli koniec łańcucha ( -1który nie jest dodatni), idzie do @i kończy program.
  4. W przeciwnym razie odejmuje 95(zmniejsza a), a następnie drukujemy result / 10(dzielenie liczb całkowitych) result % 10i zapętlamy ponownie.
Sunny Pun
źródło
2

Vim, 60 klawiszy

:s/./\=char2nr(submatch(0))-96."\r"/g
:%s/\<\d\n/0&
V{gJ

Prawie rozwiązanie oparte całkowicie regex. Jak zwykle użycie rejestru eval powoduje, że jest on nieprzyzwoicie długi.

DJMcMayhem
źródło
2

PHP, 58 bajtów

foreach(str_split($argv[1])as$c)printf("%02d",ord($c)%32);
Jörg Hülsermann
źródło
możesz -8 bajtów iterujących jako ciąg 50 bajtów TIO lub -11 bajtów wprowadzonych przez $argn 47 bajtów TIO .
640 KB
2

PowerShell v2 +, 44 bajty

-join([char[]]$args[0]|%{"{0:D2}"-f($_%32)})

Pobiera dane wejściowe $args[0], rzuca je jako chartablicę, przekazuje do pętli. Przy każdej iteracji bierzemy bieżący $_modulo znaku 32, który domyślnie rzutuje jako wartość ASCII. Dogodnie ;-), to ustawia się tak a = 1, b = 2, itd. To jest podawane do -foperatora ormat, działającego na sznurku "{0:D2}", który określa dwucyfrowe minimum (tj. Wstawia początkowe zero, jeśli jest wymagane). Te ciągi cyfr są zamknięte w pareny, -joinpołączone razem w jeden ciąg i pozostawione w potoku. Wyjście za pośrednictwem niejawnego Write-Outputnastępuje po zakończeniu programu.

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'hello'
0805121215

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'helloworld'
08051212152315181204

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'codegolf'
0315040507151206

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'johncena'
1015081403051401
AdmBorkBork
źródło
2

Perl, 24 bajty

Obejmuje +1 dla -p

Podaj dane na STDIN:

encode.pl <<< hello

encode.pl

#!/usr/bin/perl -p
s/./substr 4+ord$&,1/eg
Ton Hospel
źródło
Ładnie wykonane. Myślę, że prawdopodobnie miałeś na myśli 4+ord$&zamiast 5+ord$&;-)
Dada
@Dada Tak, wkleiłem ponownie wersję mojego bufora fragmentu zamiast testowanej wersji
Ton Hospel
Zdarza się! :) Czy mogę zadać ci niezwiązane pytanie? Czy masz pojęcie, jakie jest 8 bajtów perla na to pytanie (odwróć dane wejściowe) (w anarchii)?
Dada
@Dada Powiedziałbym, że jest to niemożliwe w czystym perlu, więc spodziewam się nadużycia zautomatyzowanego systemu po tej stronie. Np. Jeśli dane wejściowe pochodzą ze STDIN, możesz to zrobićexec rev
Ton Hospel
Racja, to ma sens, dzięki! Trudno mi było to rozgryźć, ponieważ printma 5 bajtów, <>jest jeszcze 2, więc zastanawiałem się, jaki był wbudowany 1-bajt do odwrócenia, o którym nie słyszałem!
Dada
2

DASH , 27 bajtów

@><""(->@rstr["."""]+4#0)#0

Przykładowe użycie:

(@><""(->@rstr["."""]+4#0)#0)"helloworld"

Wyjaśnienie

@ (                         #. take input through a lambda
  join "" (                 #. join with newlines the following:
    (map                    #. result of mapping
      @ (                   #. this lambda
        rstr ["." ; ""] (     #. replace first char w/ empty string:
          + 4 #0               #. mapped item's codepoint + 4
        )
      )
    ) #0                    #. over the argument
  )
)
Mama Fun Roll
źródło
2

Partia, 256 239 237 bajtów

@echo off
set/ps=
set r=
set a=abcdefghijklmnopqrstuvwxyz
:g
set c=%a%
for /l %%i in (101,1,126)do call:l %%i
set s=%s:~1%
if not "%s%"=="" goto g
echo %r%
exit/b
:l
set i=%1
if %c:~,1%==%s:~,1% set r=%r%%i:~1%
set c=%c:~1%

Pobiera dane wejściowe na STDIN.

Neil
źródło
2

IBM PC DOS 8088 Assembly, 33 28 27 bajtów

Zmontowany plik binarny:

00000000: be82 00ac 2c60 7812 d40a 0530 3092 86f2  ....,`x....00...
00000010: b402 cd21 86f2 cd21 ebe9 c3              ...!...!...

Niezmontowane:

BE 0082     MOV  SI, 82H        ; point SI to command line string 
        CH_LOOP: 
AC          LODSB               ; load next char into AL
2C 60       SUB  AL, 'a'-1      ; convert ASCII to a=1,b=2...z=26 
78 12       JS   DONE           ; if char is terminator or not valid, exit
D4 0A       AAM                 ; convert binary to BCD 
05 3030     ADD  AX, '00'       ; convert BCD to ASCII 
92          XCHG DX, AX         ; save AX to DX for display 
86 F2       XCHG DH, DL         ; reverse bytes 
B4 02       MOV  AH, 2          ; DOS display char function 
CD 21       INT  21H            ; write first digit 
86 F2       XCHG DH, DL         ; reverse bytes back 
CD 21       INT  21H            ; write second digit 
EB E9       JMP  CH_LOOP        ; restart loop 
        DONE: 
C3          RET                 ; return to DOS

Samodzielny plik wykonywalny DOS dla komputera PC. Wprowadź ciąg znaków z wiersza poleceń, dane wyjściowe do konsoli.

I / O:

wprowadź opis zdjęcia tutaj

640 KB
źródło
1

MATL , 11 bajtów

96-OH&YA!1e

Wypróbuj online!

         % Implicit input
96-      % Subtract 96. So 'a' becomes 1, 'b' becomes 2 etc
OH&YA    % Convert each number to 2 decimal digits. Gives a 2-column matrix
!1e      % Transpose and linearize into a row
         % Implicit display
Luis Mendo
źródło
1

Rubin, 53 46 bajtów

->s{s.chars.map{|c|(c.ord-96).to_s.rjust(2,?0)}.join}

->s{s.chars.map{|c|(c.ord+4).to_s[1..2]}.join}

dkudriavtsev
źródło
1

R, 71 51 bajtów

Zaoszczędź 20 bajtów dzięki Billywob. Pobiera dane wejściowe ze standardowego wejścia i wyjścia na standardowe wyjście.

cat(sprintf("%02d",utf8ToInt(scan(,""))-96),sep="")

Przykłady:

helloworld -> 08051212152315181204

codegolf -> 0315040507151206

alfabetcipher -> 0112160801020520030916080518

johncena -> 1015081403051401

rturnbull
źródło
Możesz użyć utf8toInt(scan(,"))-96zamiast całego dopasowania. Nie sądzę jednak, że istnieje lepszy sposób radzenia sobie z wypełnieniem.
Billywob
@Billywob Thanks! Do wypełniania próbowałem użyć formatCwcześniej, ale okazało się, że potrzebuję o jeden bajt więcej niż obecne podejście.
rturnbull
1

Właściwie 10 bajtów

Wykorzystanie zgrabnego algorytmu w odpowiedzi 05AB1E Adnana . Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

O4+`$pX`MΣ

Ungolfing

         Implicit input s.
O        ord() every char in s.
4+       Add 4 to every ord in s.
`...`M   Map the following function over s. Variable m.
  $        Push str(m).
  pX       Discard the first char of str(m).
           Invariably this is a `1` and we get our ciphered m.
Σ        sum() everything to get one string.
         Implicit return.
Sherlock9
źródło
0

Groovy, 51 bajtów

{it.collect{(((int)it-96)+"").padLeft(2,"0")}.join()}
Urna Magicznej Ośmiornicy
źródło
0

Labirynt, 40 bajtów

      ,")@
!{_10%! (
/       _
01_}:-69"
ninjalj
źródło
0

Befunge-98, 19 bajtów

#@~'`-:a/'0+,a%'0+,
ninjalj
źródło
0

Groovy - 31 bajtów

Groovy konwersja rozwiązania NumberKnot w java:

{it.each {printf ("% 02d", it-96)}}

Przykład tutaj, używając różnych opcji:

http://ideone.com/vd0dTX

GolfIsAGoodWalkSpoilt
źródło
0

Pyke, 7 bajtów

F.oOO`t

Wypróbuj tutaj!

F       -  for i in input:
 .o     -       ord(i)
   OO   -      ^ + 4
     `  -     str(^)
      t -    ^[1:]
        - sum(^)
niebieski
źródło
0

C #, 54 bajty

s=>String.Join("",s.Select(n=>(n<106?"0":"")+(n-96)));
downrep_nation
źródło