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.


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!


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 .


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

Kerja bagus di program Pyth pertama Anda!
HyperNeutrino

7

C, 55 43 byte

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

ideone


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!


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"

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

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"

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)

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



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.

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.



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

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

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

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.


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


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

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}


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


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.





0

Pyke, 7 byte

F.oOO`t

Coba di sini!

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.