Codificar el cifrado del alfabeto

24

Dada una cadena que contiene solo letras minúsculas, codifique esa cadena con el cifrado del alfabeto.

Para codificar con el cifrado del alfabeto (usaré el ejemplo hello):

  1. Primero, convierta cada letra de la cadena en un número dependiendo de su posición en el alfabeto ( a= 1, b= 2, etc.) Ejemplo:8 5 12 12 15
  2. Rellene cada número con dos caracteres con 0s. Ejemplo:08 05 12 12 15
  3. Unirse. Ejemplo:0805121215

Casos de prueba

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

Recuerde, este es el , por lo que gana el código con el menor número de bytes.

Oliver Ni
fuente
Relacionado.
Oliver Ni

Respuestas:

23

05AB1E , 11 6 bytes

Código:

Ç4+€¦J

Explicación:

Primero, convertimos la cadena a sus valores ASCII. codegolfse convertiría:

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

Para llegar a los índices del alfabeto, resta 96:

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

Para rellenar con ceros, agregue 100a cada elemento y elimine el primer carácter de cada int. Para el ejemplo anterior, +100sería:

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

Y eliminar el primer carácter de cada uno conduciría a:

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

Podemos fusionar ambos pasos anteriores (la -96y la +100parte) a solo +4. Para el código:

Ç       # 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

Pruébalo en línea!

Adnan
fuente
¿Qué hace de ¦nuevo?
Urna de pulpo mágico
@carusocomputing Elimina el primer elemento de una cadena, lista, etc.
Adnan
Más allá del genio ...
Magic Octopus Urn
12

Python 2, 42 bytes

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

Pruébalo en Ideone .

Dennis
fuente
55
No recursivo, mismo recuento de bytes:lambda s:''.join(`ord(x)+4`[1:]for x in s)
Jonathan Allan
8

Pyth, 11 10 bytes

FNwpt`+4CN

¡Intentalo! Mi primera vez en 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)

Python equivalente:

for N in input():
    print(repr(ord(N) + 4)[1:], end='')
Artyer
fuente
¡Buen trabajo en tu primer programa Pyth!
HyperNeutrino
7

C, 55 43 bytes

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

ideona

o79y
fuente
1
printf("%02d",*c++-96);}es más corto y válido si no me equivoco.
Dada
6

Python, 46 bytes

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

Muy claro. Pruébalo en repl.it!

Loovjo
fuente
1
Wow, dos intentos completamente diferentes con el mismo conteo de bytes;)
Kade
6

Jalea , 9 7 bytes

O+4ṾḊ$€

TryItOnline

¿Cómo?

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
fuente
Se me ocurrió O+4DḊ€FṾ€el mismo recuento, quizás golfable
ETHproductions
@ETHproductions O+4Ṿ€Ḋ€ahorra 2 bytes.
Dennis
@ Dennis, acabo de hacer lo mismo (ish) ...
Jonathan Allan
4

Haskell, cuarenta y cuatro 30 28 bytes

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

Usar el +4enfoque de la respuesta de Adnan ahorra 14 bytes.

Pruébalo en Ideone. Uso:

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

Dos bytes de descuento gracias a xnor . Versión antigua:

f a=['0'|a<'k']++(show$fromEnum a-96)
(f=<<)
Laikoni
fuente
No necesitas el segundo grupo de padres.
xnor
3

Perl, 29 bytes

28 bytes de código + -nbandera.

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

Corre con :

perl -ne 'printf"%02s",-96+ord for/./g' <<< "helloworld"
Dada
fuente
3

JavaScript (ES6), 52 49 bytes

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

La recursión resultó ser 3 bytes más corta que .replace:

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

parseInt(s,36)es un poco más largo para cada enfoque, porque debe cambiar 4a 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)
ETHproducciones
fuente
3

Japt, 10 bytes

¡4+Xc)s s1

Probablemente no se acorte más que esto ...

¡Pruébalo en línea!

Explicación

¡           // 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
ETHproducciones
fuente
3

Java 7,60 bytes

void f(char[]s){for(int i:s)System.out.printf("%02d",i-96);} 
Nudo numérico
fuente
Es posible que esta respuesta no sea válida porque toma una en char[]lugar de una String.
HyperNeutrino
@MartinEnder Está bien. Gracias por la aclaración. Esta respuesta tiene mi voto a favor.
HyperNeutrino
3

Hexagonía , 33 bytes.

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

Pruébalo en línea!

Mm ... conseguí algunas no-operaciones en el Hexágono, así que puse la fecha de hoy.

Formulario ampliado con fecha reemplazada por no-ops

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. Inicialice ay 10mueva el puntero de memoria a algún lugar ...
  2. $salta el espejo y ,lee un byte. <ramas:
  3. Si el final de la cadena ( -1que no es positivo) va @y termina el programa.
  4. De lo contrario, se resta 95(disminuye a), y luego imprimimos result / 10(división entera) y volvemos a result % 10repetir.
Sunny Pun
fuente
2

Vim, 60 pulsaciones de teclas

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

Una solución casi completamente basada en expresiones regulares. Como de costumbre, el uso del registro eval lo hace obscenamente largo.

DJMcMayhem
fuente
2

PHP, 58 bytes

foreach(str_split($argv[1])as$c)printf("%02d",ord($c)%32);
Jörg Hülsermann
fuente
puede -8 bytes iterando como una cadena de 50 bytes TIO , o -11 bytes de entrada a través de $argn 47 bytes TIO .
640 KB el
2

PowerShell v2 +, 44 bytes

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

Toma datos $args[0], los charconvierte como una matriz, se alimenta en un bucle. En cada iteración, tomamos el $_módulo de caracteres actual 32, que se convierte implícitamente como el valor ASCII. Convenientemente ;-), esto se alinea así a = 1, b = 2, etc. Eso alimenta al -foperador ormat, operando en cadena "{0:D2}", que especifica un mínimo de dos dígitos (es decir, antepone un cero a la izquierda si es necesario). Esas cadenas de dígitos se encapsulan en parens, se -joinjuntan en una sola cadena y se dejan en la tubería. La salida a través de lo implícito Write-Outputocurre al final del programa.

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
fuente
2

Perl, 24 bytes

Incluye +1 para -p

Dar entrada en STDIN:

encode.pl <<< hello

encode.pl

#!/usr/bin/perl -p
s/./substr 4+ord$&,1/eg
Ton Hospel
fuente
Bien hecho. Creo que probablemente quisiste decir en 4+ord$&lugar de 5+ord$&aunque ;-)
Dada
@Dada Right, pegué la versión de mi buffer de fragmentos en lugar de la versión probada nuevamente
Ton Hospel
¡Sucede! :) ¿Puedo hacerte una pregunta no relacionada? ¿Tienes alguna idea de cuál es la solución perl de 8 bytes para esta pregunta (invertir la entrada) (en anarquía)?
Dada
@Dada Diría que es imposible en perl puro, así que espero que sea un abuso del sistema automatizado de ese lado. Por ejemplo, si la información vino de STDIN, podría hacerloexec rev
Ton Hospel
Bien, eso tiene sentido, ¡gracias! Estaba teniendo dificultades para resolver esto, ya que printson 5 bytes, <>son 2 más, así que me preguntaba cuál era el 1 byte incorporado para revertir, ¡no había oído hablar!
Dada
2

DASH , 27 bytes

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

Ejemplo de uso:

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

Explicación

@ (                         #. 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
fuente
2

Lote, 256 239 237 bytes

@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%

Toma entrada en STDIN.

Neil
fuente
2

Ensamblaje IBM PC DOS 8088, 33 28 27 bytes

Binario ensamblado:

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

Desmontado:

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

PC independiente ejecutable de DOS. Cadena de entrada desde la línea de comando, salida a la consola.

E / S:

ingrese la descripción de la imagen aquí

640 KB
fuente
1

MATL , 11 bytes

96-OH&YA!1e

Pruébalo en línea!

         % 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
fuente
1

Ruby, 53 46 bytes

->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
fuente
1

R, 71 51 bytes

Ahorró 20 bytes gracias a Billywob. Toma entradas de stdin y salidas a stdout.

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

Ejemplos:

helloworld -> 08051212152315181204

codegolf -> 0315040507151206

alphabetcipher -> 0112160801020520030916080518

johncena -> 1015081403051401

rturnbull
fuente
Puedes usarlo en utf8toInt(scan(,"))-96lugar de todo el partido. Sin embargo, no creo que haya una mejor manera de manejar el relleno.
Billywob
@Billywob ¡Gracias! Para el relleno, intenté usarlo formatCantes, pero resultó que necesitaba un byte más que el enfoque actual.
rturnbull
1

En realidad , 10 bytes

Usando el algoritmo ordenado en la respuesta 05AB1E de Adnan . Sugerencias de golf bienvenidas. Pruébalo en línea!

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
fuente
0

Groovy, 51 Bytes

{it.collect{(((int)it-96)+"").padLeft(2,"0")}.join()}
Urna de pulpo mágico
fuente
0

Laberinto, 40 bytes

      ,")@
!{_10%! (
/       _
01_}:-69"
ninjalj
fuente
0

Befunge-98, 19 bytes

#@~'`-:a/'0+,a%'0+,
ninjalj
fuente
0

Groovy - 31 bytes

Conversión maravillosa de la solución de NumberKnot en Java:

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

Ejemplo aquí usando varias opciones:

http://ideone.com/vd0dTX

GolfIsAGoodWalkSpoilt
fuente
0

Pyke, 7 bytes

F.oOO`t

Pruébalo aquí!

F       -  for i in input:
 .o     -       ord(i)
   OO   -      ^ + 4
     `  -     str(^)
      t -    ^[1:]
        - sum(^)
Azul
fuente
0

C #, 54 bytes

s=>String.Join("",s.Select(n=>(n<106?"0":"")+(n-96)));
downrep_nation
fuente