Codifica la cifra dell'alfabeto


24

Data una stringa che contiene solo lettere minuscole, codifica quella stringa con la cifra alfabetica.

Per codificare con la cifra dell'alfabeto (userò l'esempio hello):

  1. Innanzitutto, converti ogni lettera nella stringa in un numero a seconda della sua posizione nell'alfabeto ( a= 1, b= 2, ecc.) Esempio:8 5 12 12 15
  2. Riempi ogni numero con due caratteri con 0s. Esempio:08 05 12 12 15
  3. Aderire. Esempio:0805121215

Casi test

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

Ricorda, questo è , quindi vince il codice con il minor numero di byte.


Risposte:


23

05AB1E , 11 6 byte

Codice:

Ç4+€¦J

Spiegazione:

Innanzitutto, convertiamo la stringa nei loro valori ASCII. codegolfpotrebbe diventare:

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

Per arrivare agli indici dell'alfabeto, sottrai 96:

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

Per riempire con zeri, aggiungi 100a ciascun elemento e rimuovi il primo carattere di ciascun int. Per l'esempio sopra, +100sarebbe:

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

E rimuovere il primo carattere di ciascuno porterebbe a:

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

Possiamo unire entrambi i passaggi sopra (la -96e la +100) parte a just +4. Per il codice:

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

Provalo online!


Cosa fa di ¦nuovo?
Magic Octopus Urn,

@carusocomputing Rimuove il primo elemento di una stringa, un elenco, ecc.
Adnan,

Oltre il genio ...
Magic Octopus Urn,


8

Pyth, 11 10 byte

FNwpt`+4CN

Provalo! La mia prima volta a 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='')

Ottimo lavoro sul tuo primo programma Pyth!
HyperNeutrino,

7

C, 55 43 byte

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

Ideone


1
printf("%02d",*c++-96);}è più breve e valido se non sbaglio.
Dada,

6

Python, 46 byte

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

Abbastanza diretto. Provalo su repl.it!


1
Wow, due tentativi completamente diversi con lo stesso numero di byte;)
Kade,

6

Gelatina , 9 7 byte

O+4ṾḊ$€

TryItOnline

Come?

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"

Mi è venuto in mente O+4DḊ€FṾ€per lo stesso conteggio, forse golfable
ETHproductions

@ETHproductions O+4Ṿ€Ḋ€salva 2 byte.
Dennis,

@Dennis Ho appena fatto lo stesso (ish) ...
Jonathan Allan,

4

Haskell, quarantaquattro 30 28 byte

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

L'uso +4dell'approccio dalla risposta di Adnan consente di risparmiare 14 byte.

Provalo su Ideone. Uso:

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

Due byte liberi grazie a xnor . Vecchia versione:

f a=['0'|a<'k']++(show$fromEnum a-96)
(f=<<)

Non è necessario il secondo set di parentesi.
xnor

3

Perl, 29 byte

28 byte di codice + -nflag.

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

Corri con :

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

3

JavaScript (ES6), 52 49 byte

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

La ricorsione si è rivelata inferiore di 3 byte in meno di .replace:

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

parseInt(s,36)è leggermente più lungo per ogni approccio, perché devi cambiare 4in 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 byte

¡4+Xc)s s1

Probabilmente non si riduce di così ...

Provalo online!

Spiegazione

¡           // 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

Esagonia , 33 byte

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

Provalo online!

Mm ... ho avuto qualche no-op sull'Esagono, quindi ho inserito la data di oggi.

Modulo espanso con data sostituita da no-ops

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. Inizializza a 10e sposta l'indicatore di memoria da qualche parte ...
  2. $salta il mirror e ,legge un byte. <rami:
  3. Se la fine della stringa ( -1che non è positiva) va a @e termina il programma.
  4. Altrimenti sottrae 95(decrementato a), quindi stampiamo result / 10(divisione intera) result % 10e ripetiamo il ciclo.

2

Vim, 60 battute

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

Una soluzione quasi interamente basata su regex. Come al solito, l'uso del registro eval lo rende oscenamente lungo.



2

PowerShell v2 +, 44 byte

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

Prende input $args[0], lo lancia come un chararray, si inserisce in un loop. Ad ogni iterazione, prendiamo il $_modulo di carattere corrente 32, che viene implicitamente lanciato come valore ASCII. Convenientemente ;-), si allinea così a = 1, b = 2, ecc. Quello immesso -fnell'operatore ormat, che opera su stringa "{0:D2}", che specifica un minimo di due cifre (ovvero, se richiesto, anticipa uno zero iniziale). Quelle stringhe di cifre sono incapsulate in parentesi, -joinriunite in una stringa e lasciate sulla pipeline. L'output tramite implicito Write-Outputavviene alla conclusione del programma.

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 byte

Include +1 per -p

Dare input su STDIN:

encode.pl <<< hello

encode.pl

#!/usr/bin/perl -p
s/./substr 4+ord$&,1/eg

Ben fatto. Penso che probabilmente intendevi 4+ord$&invece invece 5+ord$&;-)
Dada,

@Dada Bene, ho incollato di nuovo la versione del mio buffer snippet invece della versione testata
Ton Hospel,

Succede! :) Potrei farti una domanda non correlata? Hai idea di quale sia la soluzione perl di 8 byte per questa domanda (invertire l'input) (sull'anarchia)?
Dada,

@Dada Direi che è impossibile in puro perl, quindi mi aspetto che sia un abuso del sistema automatizzato da quella parte. Ad esempio, se l'input provenisse da STDIN, potresti farloexec rev
Ton Hospel,

Bene, questo ha senso, grazie! Ho avuto difficoltà a capire questo dato che printè di 5 byte, <>è di 2 in più, quindi mi chiedevo quale fosse il byte 1 incorporato per invertire di cui non avevo sentito parlare!
Dada,

2

DASH , 27 byte

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

Esempio di utilizzo:

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

Spiegazione

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

Lotto, 256 239 237 byte

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

Accetta input su STDIN.


2

IBM PC DOS 8088 Assembly, 33 28 27 byte

Binario assemblato:

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

smontato:

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

Eseguibile DOS per PC autonomo. Stringa di input dalla riga di comando, output sulla console.

I / O:

inserisci qui la descrizione dell'immagine


1

MATL , 11 byte

96-OH&YA!1e

Provalo 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

Rubino, 53 46 byte

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

Risparmiato 20 byte grazie a Billywob. Porta input da stdin e output a stdout.

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

Esempi:

mondo -> 08051212152315181204

codegolf -> 0315040507151206

alfabeto: -> 0112160801020520030916080518

johncena -> 1015081403051401


Puoi usare al utf8toInt(scan(,"))-96posto dell'intera partita. Non pensare che ci sia un modo migliore per gestire l'imbottitura.
Billywob,

@Billywob Grazie! Per il padding, ho provato ad usare formatCprima, ma ha funzionato come se fosse necessario un byte in più rispetto all'approccio attuale.
rturnbull,

1

In realtà , 10 byte

Usando l'algoritmo pulito nella risposta 05AB1E di Adnan . Suggerimenti di golf benvenuti. Provalo 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.





0

Pyke, 7 byte

F.oOO`t

Provalo qui!

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.