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.