เข้ารหัสรหัสตัวเลข


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

ลองออนไลน์!


สิ่งที่ไม่¦ทำอีกครั้งหรือไม่
Magic Octopus Urn

@carusocomputing ลบองค์ประกอบแรกของสตริงรายการ ฯลฯ
Adnan

เกินกว่าอัจฉริยะ ...
Magic Octopus Urn


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)

หลามเทียบเท่า:

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);}สั้นลงและใช้ได้ถ้าฉันไม่เข้าใจผิด
Dada

6

Python ขนาด 46 ไบต์

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

ตรงไปตรงมาสวย ลองใช้กับ repl.it!


1
ว้าวความพยายามสองอย่างที่ต่างกันอย่างสิ้นเชิงโดยนับเป็นจำนวนเดียวกัน;)
Kade

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 ไบต์
Dennis

@Dennis ฉันเพิ่งทำแบบเดียวกัน (ish) ...
Jonathan Allan

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)

การเรียกซ้ำกลายเป็น 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

Java 7,60 ไบต์

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

คำตอบนี้อาจจะไม่ถูกต้องเพราะมันใช้แทนchar[] String
HyperNeutrino


@MartinEnder โอเค ขอบคุณสำหรับการชี้แจง คำตอบนี้มี upvote ของฉัน
HyperNeutrino


3

Hexagony , 33 ไบต์

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

ลองออนไลน์!

อืมมมมมไม่มี ops ใน Hexagon สักสองสามดังนั้นฉันจึงใส่วันที่วันนี้

แบบฟอร์มที่ขยายพร้อมกับวันที่ถูกแทนที่โดยไม่มีตัวเลือก

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. เริ่มต้น10และย้ายตัวชี้หน่วยความจำไปที่อื่น ...
  2. $ข้ามมิเรอร์และ,อ่านไบต์ <สาขา:
  3. หากจุดสิ้นสุดของสตริง ( -1ซึ่งไม่ใช่ค่าบวก) จะไป@และยกเลิกโปรแกรม
  4. มิฉะนั้นจะลบ95(ลดค่าa) แล้วเราพิมพ์result / 10(การหารจำนวนเต็ม) และresult % 10และวนรอบอีกครั้ง

2

เป็นกลุ่ม 60 การกดแป้น

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

เกือบวิธีการแก้ปัญหาทั้งหมดตาม regex ตามปกติการใช้การลงทะเบียน 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}", ซึ่งระบุตัวเลขขั้นต่ำสองหลัก สตริงของตัวเลขเหล่านั้นถูกห่อหุ้มด้วย parensed -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

@ Dada ถูกต้องวางเวอร์ชันย่อยของบัฟเฟอร์ของฉันแทนรุ่นที่ทดสอบอีกครั้ง
Ton Hospel

มันเกิดขึ้น! :) ฉันจะถามคำถามที่ไม่เกี่ยวข้องกับคุณได้ไหม? คุณมีความคิดใด ๆ วิธีแก้ปัญหา 8 ไบต์ perl สำหรับคำถามนี้(ย้อนกลับอินพุต) (ในความโกลาหล) คืออะไร?
Dada

@ ดาด้าฉันว่ามันเป็นไปไม่ได้ในเพียวบริสุทธิ์ดังนั้นฉันคาดหวังว่ามันเป็นการละเมิดระบบอัตโนมัติในด้านนั้น เช่นถ้าข้อมูลมาจาก STDIN คุณสามารถทำได้exec rev
Ton Hospel

ถูกต้องแล้วที่เหมาะสมขอบคุณ! ฉันมีปัญหาในการหาสิ่งนี้เนื่องจากprintมีขนาด 5 ไบต์<>เพิ่มขึ้นอีก 2 ดังนั้นฉันจึงสงสัยว่า 1 ไบต์ในตัวจะกลับด้านที่ฉันไม่เคยได้ยิน!
Dada

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 แบบสแตนด์อโลน สตริงอินพุตจากบรรทัดรับคำสั่งเอาต์พุตไปยังคอนโซล

I / O:

ป้อนคำอธิบายรูปภาพที่นี่




1

R, 71 51 ไบต์

บันทึกแล้ว 20 ไบต์ขอบคุณ Billywob รับอินพุตจาก stdin และเอาต์พุตไปยัง stdout

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

ตัวอย่าง:

helloworld -> 08051212152315181204

codegolf -> 0315040507151206

ตัวอักษร -> 0112160801020520030916080518

johncena -> 1015081403051401


คุณสามารถใช้utf8toInt(scan(,"))-96แทนสิ่งที่ตรงกันทั้งหมด อย่าคิดว่าจะมีวิธีที่ดีกว่าในการจัดการกับช่องว่างภายใน
Billywob

@Billywob ขอบคุณ! สำหรับช่องว่างภายในฉันลองใช้formatCก่อนหน้านี้ แต่ใช้งานได้ว่าต้องการไบต์มากกว่าหนึ่งวิธี
rturnbull

1

ที่จริงแล้ว 10 ไบต์

การใช้อัลกอริทึมเรียบร้อยในคำตอบของ 05AB1E Adnan ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

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.






โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.