Кодировать алфавитный шифр


24

Если задана строка, содержащая только строчные буквы, закодируйте эту строку с помощью алфавитного шифра.

Для кодирования с помощью алфавитного шифра (я буду использовать пример hello):

  1. Сначала преобразуйте каждую букву в строке в число в зависимости от ее положения в алфавите ( a= 1, b= 2и т. Д.). Пример:8 5 12 12 15
  2. Дополните каждое число двумя символами с помощью 0s. Пример:08 05 12 12 15
  3. Присоединиться. Пример:0805121215

Контрольные примеры

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

Помните, это , поэтому выигрывает код с наименьшим количеством байтов.


Ответы:


23

05AB1E , 11 6 байтов

Код:

Ç4+€¦J

Объяснение:

Сначала мы конвертируем строку в их значения ASCII. codegolfстанет:

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

Чтобы добраться до индексов алфавита, вычтите 96:

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

Чтобы заполнить нулями, добавьте 100к каждому элементу и удалите первый символ каждого int. Для приведенного выше примера +100будет:

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

И удаление первого символа каждого приведет к:

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

Мы можем объединить оба шага над ( -96и и +100) частью просто +4. Для кода:

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

Попробуйте онлайн!


Что ¦опять делает?
— Волшебная Осьминога Урна

@carusocomputing Удаляет первый элемент строки, списка и т. д.
— Аднан

Вне гениальности ...
— Волшебная Осьминога Урна


8

Pyth, 11 10 байт

FNwpt`+4CN

Попытайся! Моя первая поездка в Пиф.

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:

for N in input():
    print(repr(ord(N) + 4)[1:], end='')

Хорошая работа на вашей первой программе Pyth!
— HyperNeutrino

7

C, 55 43 байта

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

ideone


1
printf("%02d",*c++-96);}Короче и действителен, если я не ошибаюсь.
— Дада


6

Желе , 9 7 байт

O+4ṾḊ$€

TryItOnline

Как?

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"

Я придумал O+4DḊ€FṾ€для того же счета, возможно, для игры в гольф
— ETHproductions

@ETHproductions O+4Ṿ€Ḋ€экономит 2 байта.
— Деннис

@ Денис Я только что сделал то же самое (иш) ...
— Джонатан Аллан

4

Haskell, сорок четыре 30 28 байтов

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

Использование +4подхода из ответа Аднана экономит 14 байтов.

Попробуйте это на Ideone. Использование:

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

Два байта отключены благодаря xnor . Старая версия:

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

Вам не нужен второй набор паренов.
— xnor

3

Perl, 29 байт

28 байт кода + -nфлаг.

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

Бежать с :

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

3

JavaScript (ES6), 52 49 байт

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

Рекурсия оказалась на 3 байта короче, чем .replace:

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

parseInt(s,36)немного дольше для каждого подхода, потому что вы должны изменить 4на 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 байт

¡4+Xc)s s1

Вероятно, не становится короче этого ...

Проверьте это онлайн!

объяснение

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

Java 7,60 байт

void f(char[]s){for(int i:s)System.out.printf("%02d",i-96);} 

Этот ответ может быть недействительным, потому что он принимает char[]вместо String.
— HyperNeutrino


@MartinEnder Хорошо. Спасибо тебе за пояснение. У этого ответа есть мой ответ.
— HyperNeutrino


3

Гексагония , 33 байта

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

Попробуйте онлайн!

Мм .. получил несколько неактивных операций в шестиугольнике, поэтому я вставил сегодняшнюю дату.

Расширенная форма с заменой даты на no-ops

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. Инициализируйте 10и переместите указатель памяти куда-нибудь ...
  2. $пропускает зеркало и ,читает байт. <ветви:
  3. Если конец строки (-1 который не является положительным), он идет @и завершает программу.
  4. В противном случае он вычитает 95(уменьшается a), а затем мы печатаем result / 10(целочисленное деление) и result % 10и снова зацикливаемся.

2

Vim, 60 нажатий клавиш

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

Почти полностью регулярное выражение основано решение. Как обычно, использование регистра eval делает его неприлично длинным.



2

PowerShell v2 +, 44 байта

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

Принимает ввод $args[0], charпреобразует его как -array, передает в цикл. В каждой итерации мы берем текущий символ $_по модулю 32, который неявно приводится к значению ASCII. Удобно ;-), это выстраивается так a = 1, b = 2и т. Д. Это подается в -fоператор ormat, работающий со строкой "{0:D2}", которая задает минимум из двух цифр (т. Е. При необходимости он добавляет начальный ноль). Эти строки цифр заключены в скобки, -joinобъединены в одну строку и оставлены на конвейере. Вывод через неявный Write-Outputпроисходит при завершении программы.

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 байта

Включает +1 для -p

Внесите свой вклад в STDIN:

encode.pl <<< hello

encode.pl

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

Красиво сделано. Я думаю, что вы, вероятно, имели в виду, 4+ord$&а 5+ord$&не ;-)
— Дада

@Dada Правильно, снова вставил версию моего буфера фрагментов вместо протестированной версии
— Тон Хоспел

Бывает! :) Могу я задать вам не связанный вопрос? Есть ли у вас какие-либо идеи, как Perl-решение 8 байт на этот вопрос (обратный ввод) (анархия)?
— Дада

@ Дада, я бы сказал, что это невозможно в чистом Perl, поэтому я ожидаю, что это злоупотребление автоматизированной системой на этой стороне. Например, если бы вход поступил от STDIN, вы могли бы сделатьexec rev
— Тон Хоспел

Хорошо, это имеет смысл, спасибо! Мне было трудно понять это, потому что printэто 5 байтов, <>еще 2, так что мне было интересно, что за 1 байт был встроен для реверса, о котором я не слышал!
— Дада

2

DASH , 27 байт

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

Пример использования:

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

объяснение

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

Пакетный, 256 239 237 байт

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

Принимает участие в STDIN.


2

IBM PC DOS 8088 в сборе, 33 28 27 байт

Собранный бинарный файл:

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

разобранное:

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

Автономный исполняемый файл DOS для ПК. Ввод строки из командной строки, вывод в консоль.

I / O:

введите описание изображения здесь



1

Рубин, 53 46 байт

->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 байт

Сохранено 20 байтов благодаря Billywob. Принимает ввод из stdin и выводит в stdout.

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

Примеры:

helloworld -> 08051212152315181204

Codegolf -> 0315040507151206

алфавитный шифр -> 0112160801020520030916080518

Джонна -> 1015081403051401


Вы можете использовать utf8toInt(scan(,"))-96вместо всего совпадения. Не думайте, что есть лучший способ справиться с заполнением.
— Billywob

@Billywob Спасибо! Для заполнения я попытался использовать formatCранее, но это сработало, поскольку требовалось на один байт больше, чем текущий подход.
— rturnbull

1

На самом деле , 10 байтов

Использование аккуратного алгоритма в ответе Аднана 05AB1E . Предложения по игре в гольф приветствуются. Попробуйте онлайн!

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.






Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.