Enkode sandi alfabet

24

Diberi string yang hanya berisi huruf kecil, enkode string itu dengan abjad cipher.

Untuk menyandikan dengan abjad cipher (saya akan menggunakan contoh hello):

  1. Pertama, konversi setiap huruf dalam string ke angka tergantung pada posisinya dalam alfabet ( a= 1, b= 2, dll.) Contoh:8 5 12 12 15
  2. Pad setiap angka hingga dua karakter dengan 0s. Contoh:08 05 12 12 15
  3. Ikut. Contoh:0805121215

Uji kasus

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

Ingat, ini adalah , jadi kode dengan jumlah byte paling sedikit menang.

Oliver Ni
sumber
Terkait
Oliver Ni

Jawaban:

23

05AB1E , 11 6 byte

Kode:

Ç4+€¦J

Penjelasan:

Pertama, kami mengonversi string ke nilai ASCII mereka. codegolfakan menjadi:

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

Untuk sampai ke indeks alfabet, Anda kurangi 96:

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

Untuk mengisi dengan nol, tambahkan 100ke setiap elemen dan hapus karakter pertama dari setiap int. Untuk contoh di atas, +100akan menjadi:

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

Dan menghapus karakter pertama masing-masing akan mengarah ke:

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

Kita dapat menggabungkan kedua langkah di atas (bagian -96dan +100) bagian menjadi adil +4. Untuk kode:

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

Cobalah online!

Adnan
sumber
Apa yang ¦harus dilakukan lagi?
Magic Gurita Guci
@carusocomputing Menghapus elemen pertama dari string, daftar, dll.
Adnan
Di luar kejeniusan ...
Magic Octopus Mm
12

Python 2, 42 byte

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

Uji di Ideone .

Dennis
sumber
5
Non-rekursif, jumlah byte yang sama:lambda s:''.join(`ord(x)+4`[1:]for x in s)
Jonathan Allan
8

Pyth, 11 10 byte

FNwpt`+4CN

Cobalah! Go pertama saya di 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)

Setara python:

for N in input():
    print(repr(ord(N) + 4)[1:], end='')
Artyer
sumber
Kerja bagus di program Pyth pertama Anda!
HyperNeutrino
7

C, 55 43 byte

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

ideone

o79y
sumber
1
printf("%02d",*c++-96);}lebih pendek dan valid jika saya tidak salah.
Dada
6

Python, 46 byte

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

Cukup mudah. Cobalah di repl.it!

Loovjo
sumber
1
Wow, dua upaya yang sama sekali berbeda dengan jumlah byte yang sama;)
Kade
6

Jelly , 9 7 byte

O+4ṾḊ$€

TryItOnline

Bagaimana?

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
sumber
Saya datang dengan O+4DḊ€FṾ€hitungan yang sama, mungkin golf
ETHproduk
@ EHProduk O+4Ṿ€Ḋ€menyimpan 2 byte.
Dennis
@ Dennis Saya baru saja melakukan hal yang sama (ish) ...
Jonathan Allan
4

Haskell, fortyfour 30 28 byte

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

Menggunakan +4pendekatan dari jawaban Adnan menghemat 14 byte.

Cobalah di Ideone. Pemakaian:

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

Dua byte mati berkat xnor . Versi lama:

f a=['0'|a<'k']++(show$fromEnum a-96)
(f=<<)
Laikoni
sumber
Anda tidak perlu set parent kedua.
xnor
3

Perl, 29 byte

28 byte kode + -nbendera.

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

Jalankan dengan:

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

JavaScript (ES6), 52 49 byte

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

Rekursi ternyata lebih pendek 3 byte dari .replace:

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

parseInt(s,36)sedikit lebih lama untuk setiap pendekatan, karena Anda harus mengubah 4ke 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)
Produksi ETH
sumber
3

Japt, 10 byte

¡4+Xc)s s1

Mungkin tidak lebih pendek dari ini ...

Uji secara online!

Penjelasan

¡           // 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
Produksi ETH
sumber
3

Java 7,60 byte

void f(char[]s){for(int i:s)System.out.printf("%02d",i-96);} 
Numberknot
sumber
Jawaban ini mungkin tidak valid karena butuh char[]a String.
HyperNeutrino
1
@AlexL. Daftar karakter dianggap string.
Martin Ender
@ MartinEnder Oke. Terimakasih atas klarifikasinya. Jawaban ini sudah saya pilih.
HyperNeutrino
3

MATL, 12 11 byte

1 byte disimpan berkat @Luis

4+!V4LZ)!le

Cobalah secara Online

Suever
sumber
3

Hexagony , 33 byte

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

Cobalah secara Online!

Mm .. mendapat beberapa no-ops di Hexagon jadi saya masukkan tanggal hari ini.

Formulir yang Diperluas dengan tanggal digantikan oleh no-ops

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. Menginisialisasi 10dan memindahkan Memory Pointer ke suatu tempat ...
  2. $melompati cermin dan ,membaca satu byte. <ranting:
  3. Jika ujung string (-1 yang tidak positif) masuk ke @dan mengakhiri program.
  4. Kalau tidak, ia mengurangi 95(dikurangi a), lalu kami mencetak result / 10(pembagian bilangan bulat) dan result % 10dan mengulang kembali.
Sunny Pun
sumber
2

Vim, 60 penekanan tombol

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

Sebuah hampir solusi seluruhnya regex berbasis. Seperti biasa, menggunakan register eval membuatnya sangat panjang.

DJMcMayhem
sumber
2

PHP, 58 Bytes

foreach(str_split($argv[1])as$c)printf("%02d",ord($c)%32);
Jörg Hülsermann
sumber
Anda dapat -8 byte pengulangan sebagai string 50 byte TIO , atau -11 byte input melalui $argn 47 byte TIO .
640KB
2

PowerShell v2 +, 44 byte

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

Mengambil input $args[0], melemparkannya sebagai char-array, diumpankan ke dalam sebuah loop. Setiap iterasi, kita mengambil $_modulo karakter saat ini 32, yang secara implisit dilemparkan sebagai nilai ASCII. Mudah ;-), ini berbaris begitu a = 1, b = 2, dll. Itu dimasukkan ke dalam -foperator ormat, beroperasi pada string "{0:D2}", yang menentukan minimum dua digit (yaitu, ini menambahkan nol terkemuka jika diperlukan). Digit-digit itu dienkapsulasi dalam parens, -joindisatukan menjadi satu string, dan dibiarkan di atas pipa. Output melalui implisit Write-Outputterjadi pada kesimpulan program.

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

Perl, 24 byte

Termasuk +1 untuk -p

Berikan masukan pada STDIN:

encode.pl <<< hello

encode.pl

#!/usr/bin/perl -p
s/./substr 4+ord$&,1/eg
Ton Hospel
sumber
Bagus sekali. Saya pikir Anda mungkin maksudnya 4+ord$&bukannya 5+ord$&;-)
Dada
@ Benar, menyisipkan versi buffer snippet saya alih-alih versi yang diuji lagi
Ton Hospel
Itu terjadi! :) Bisakah saya mengajukan pertanyaan yang tidak berhubungan? Apakah Anda tahu apa solusi perl 8 byte untuk pertanyaan ini (membalikkan input) (pada anarki)?
Dada
@Dada saya akan mengatakan itu tidak mungkin di perl murni, jadi saya berharap itu beberapa penyalahgunaan sistem otomatis di sisi itu. Misalnya, jika masukan datang dari STDIN yang dapat Anda lakukanexec rev
Ton Hospel
Benar, itu masuk akal, terima kasih! Saya mengalami kesulitan mencari tahu ini karena print5 byte, <>adalah 2 lebih, jadi saya bertanya-tanya apa yang 1 byte builtin untuk membalikkan saya belum pernah dengar!
Dada
2

DASH , 27 byte

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

Contoh penggunaan:

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

Penjelasan

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

Batch, 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%

Mengambil input pada STDIN.

Neil
sumber
2

IBM PC DOS 8088 Assembly, 33 28 27 byte

Biner dirakit:

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

Belum dirakit:

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

Standalone PC DOS dapat dieksekusi. Input string dari baris perintah, output ke konsol.

I / O:

masukkan deskripsi gambar di sini

640KB
sumber
1

MATL , 11 byte

96-OH&YA!1e

Cobalah 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
Luis Mendo
sumber
1

Ruby, 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}

dkudriavtsev
sumber
1

R, 71 51 byte

Disimpan 20 byte berkat Billywob. Membawa input dari stdin dan output ke stdout.

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

Contoh:

helloworld -> 08051212152315181204

codegolf -> 0315040507151206

alphabetcipher -> 0112160801020520030916080518

johncena -> 1015081403051401

rturnbull
sumber
Anda dapat menggunakan utf8toInt(scan(,"))-96alih-alih seluruh pertandingan. Jangan berpikir ada cara yang lebih baik untuk menangani bantalan.
Billywob
@Billywob Terima kasih! Untuk padding, saya mencoba menggunakan formatCsebelumnya tetapi itu ternyata membutuhkan satu byte lebih dari pendekatan saat ini.
rturnbull
1

Sebenarnya 10 byte

Menggunakan algoritma yang rapi dalam jawaban Adab's 05AB1E . Saran bermain golf diterima. Cobalah online!

O4+`$pX`MΣ

Tidak melakukanolf

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

Groovy, 51 Bytes

{it.collect{(((int)it-96)+"").padLeft(2,"0")}.join()}
Guci Gurita Ajaib
sumber
0

Labirin, 40 byte

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

Befunge-98, 19 byte

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

Groovy - 31 byte

Konversi Groovy dari solusi NumberKnot di java:

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

Contoh di sini menggunakan berbagai opsi:

http://ideone.com/vd0dTX

GolfIsAGoodWalkSpoilt
sumber
0

Pyke, 7 byte

F.oOO`t

Coba di sini!

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

C #, 54 byte

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