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.


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!


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 .


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='')

Dobra robota w pierwszym programie Pyth!
HyperNeutrino,

7

C, 55 43 bajtów

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

ideone


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


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"

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

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"

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)

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



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.

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.



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

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

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

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.


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


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

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}


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


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.






Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.