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


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.