编码字母密码


24

给定一个仅包含小写字母的字符串,请使用字母密码对该字符串进行编码。

要使用字母密码进行编码(我将使用示例hello):

  1. 首先,根据字符串中的每个字母在字母表中的位置将它们转换为数字(a= 1b= 2等)。示例:8 5 12 12 15
  2. 将每个数字用0s 填充到两个字符。例:08 05 12 12 15
  3. 加入。例:0805121215

测试用例

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

请记住,这是,所以字节数最少的代码将获胜。


Answers:


23

05AB1E11 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] 

我们可以将(the -96和the +100)部分的两个步骤合并为just +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删除字符串,列表等的第一个元素。–
Adnan

超越天才……
魔术章鱼缸


8

Pyth,11个10字节

FNwpt`+4CN

试试吧!我第一次去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:

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

异丁酮


1
printf("%02d",*c++-96);}如果我没记错的话,它更短且有效。
达达

6

Python,46个字节

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

非常简单。试试repl.it!


1
哇,两个完全不同的尝试,并且字节数相同;)
Kade

6

果冻9 7 个字节

O+4ṾḊ$€

在线试用

怎么样?

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 16-10-28

@ETHproductions O+4Ṿ€Ḋ€保存2个字节。
丹尼斯

@丹尼斯,我也做了同样的事情(ish)...
乔纳森·艾伦,

4

Haskell,四十四30 28字节

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

使用+4来自Adnan答案的方法可节省14个字节。

在Ideone上尝试。用法:

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

多亏xnor减少了两个字节。旧版:

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

您不需要第二套Parens。
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)

递归结果比.replace以下内容短3个字节:

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

parseInt(s,36)每种方法的时间略长,因为您必须更改491

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

六边形,33字节

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

在线尝试!

Mm ..在Hexagon停了几步,所以我记下了今天的日期。

展开表格,日期替换为无操作

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. 初始化a 10并将Memory Pointer移到某处...
  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,馈入循环。每次迭代时,我们都将当前字符$_modulo 32隐式转换为ASCII值。方便地;;)如此排列,以此类推a = 1, b = 2。送入-format运算符的操作符是对string进行操作,该操作符"{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对,再次粘贴我的摘要缓冲区的版本而不是经过测试的版本
Ton Hospel

它发生了!:)我可以问一个无关的问题吗?您是否知道这个问题的8字节perl解决方案(反向输入)(在无政府状态下)是什么?
达达

@Dada我想说在纯Perl中是不可能的,所以我希望那是对自动化系统的某种滥用。例如,如果输入从标准输入进来,你可以做exec rev
吨Hospel

是的,这很有意义,谢谢!我很难解决这个问题,因为它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

独立PC DOS可执行文件。从命令行输入字符串,然后输出到控制台。

输入/输出:

在此处输入图片说明


1

MATL,11个字节

96-OH&YA!1e

在线尝试!

         % 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

R,71 51字节

由于Billywob,节省了20个字节。从stdin接受输入,然后输出到stdout。

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

例子:

helloworld-> 08051212152315181204

高尔夫-> 0315040507151206

字母密码-> 0112160801020520030916080518

johncena-> 1015081403051401


您可以使用utf8toInt(scan(,"))-96而不是整个匹配项。不过,不要认为有更好的方法来处理填充。
Billywob

@Billywob谢谢!对于填充,我尝试过使用formatC较早的方法,但结果是需要比当前方法多一个字节。
rturnbull

1

实际上,10个字节

Adnan的05AB1E答案中使用整洁的算法。欢迎打高尔夫球。在线尝试!

O4+`$pX`MΣ

开球

         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.






By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.