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.


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!


¿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


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

¡Buen trabajo en tu primer programa Pyth!
HyperNeutrino

7

C, 55 43 bytes

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

ideona


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


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"

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

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"

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)

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



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.

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.



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

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

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

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.


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í


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

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}


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


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.






Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.