ใช้รหัสลับนี้


13

ใช้รหัสลับนี้

เป้าหมาย

ใช้อัลกอริทึม (อธิบายไว้ในส่วนอัลกอริทึม) เพื่อใช้ตัวเลขที่แน่นอน

โปรแกรมจะต้องอ่านอินพุตจาก STDIN หรือเทียบเท่าที่ใกล้เคียงที่สุดใช้อัลกอริทึมเพื่อสร้าง ciphertext และคีย์

ciphertext และคีย์จะถูกเขียนไปยัง STDOUT หรือเทียบเท่าที่ใกล้เคียงที่สุด อนุญาตให้ฟอร์แมตใดก็ได้ตราบใดที่มันยังออก ciphertext และกุญแจ

ขั้นตอนวิธี

แปลงอักขระในสตริงให้เป็นค่า ASCII ที่เกี่ยวข้อง ตัวอย่างเช่น:

Hello -> 72 101 108 108 111

ถัดไปคุณจะต้องสร้างคีย์ตราบเท่าที่สตริงที่มีตัวเลขสุ่มในช่วง 0-9

Hello -> 62841

เพิ่มจำนวนเต็มในลำดับตัวเลขสุ่มให้เป็นค่า ASCII ของสตริง ในตัวอย่างข้างต้น 72 จะกลายเป็น 78 และ 101 จะกลายเป็น 104

72 + 6 = 78, 101 + 2 = 103, 108 + 8 = 116, etc

ถัดไปแปลงค่าใหม่กลับเป็นอักขระ ในตัวอย่างข้างต้นข้อความได้กลายเป็นHelloNgtpp

ตัวอย่าง

(นี่เป็นเพียงตัวอย่างของสิ่งที่เอาท์พุตอาจมีลักษณะเอาท์พุทสามารถและจะแตกต่างกันไป)

Hello World

Lfrlu)_supg
41606984343

This will be encoded

Zhjs$~koo gj$iuhofgj
60104723305544750226

กฎระเบียบ

  • คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะประกอบด้วยตัวอักษรในช่วง az, AZ และช่องว่างเท่านั้น
  • ส่งจะต้องเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • ส่งจะได้คะแนนเป็นไบต์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

(นี่คือหนึ่งในความท้าทายครั้งแรกของฉันหากมีสิ่งผิดปกติเกิดขึ้นรู้สึกฟรีที่จะบอกฉันว่าฉันจะปรับปรุงมันได้อย่างไร)


5
ความท้าทายนี้ดูดีสำหรับฉันยกเว้นความคิดสองสามข้อ 1. อนุญาตให้ใช้ฟังก์ชั่นแทนโปรแกรมเต็มรูปแบบได้หรือไม่ คำถามที่เกี่ยวข้องสามารถส่งคืนค่าแทนที่จะพิมพ์ได้หรือไม่ 2. คุณพูดว่าpreferably with the format (ciphertext)\n(key)."คุณสมบัติที่ต้องการ" และโค้ดกอล์ฟไม่ค่อยเข้ากัน คุณควรกำหนดให้เป็นข้อบังคับหรืออนุญาตรูปแบบผลลัพธ์อื่น ๆ 3. ต้องพิมพ์รหัสโดยไม่มีช่องว่างหรือไม่ สิ่งที่เกี่ยวกับการพิมพ์ในรูปแบบรายการเช่น[0, 5, 2, ...]?
James

กุญแจสามารถมีเลขศูนย์นำหน้าได้หรือไม่
TheBikingViking

1
ความท้าทายแรกที่ดี แต่ฉันไม่แน่ใจในรูปแบบ IO ที่เข้มงวด โดยปกติแล้วฟังก์ชั่นจะได้รับอนุญาตและโดยปกติคำตอบสามารถอ่านได้จากหนึ่งในวิธีการ IO ที่ยอมรับ ซึ่งรวมถึงการส่งออกอาร์เรย์ด้วยรายการ
Downgoat

1
ต้องสร้างตัวเลขของคีย์ด้วยการแจกแจงแบบสม่ำเสมอหรือไม่?
เดนนิส

1
เอ่อ ... 101 + 2 คือ 103 ไม่ใช่ 104 :-)
YetiCGN

คำตอบ:


5

เจลลี่ , 12 9 ไบต์

⁵ṁX€’Ṅ+OỌ

ลองออนไลน์!

มันทำงานอย่างไร

⁵ṁX€’Ṅ+OỌ  Main link. Argument: s (string)

⁵             Set the return value to 10.
 ṁ            Mold; create an array of 10's with the length of s.
  X€          Pseudo-randomly pick a integer between 1 and 10, for each 10.
    ’         Decrement, so the integers fall in the range [0, ..., 9].
     Ṅ        Print the key, as an array, followed by a linefeed.
      +O      Add the integers to the ordinals (code points) of s.
        Ọ     Unordinal; convert back to characters.

5

Python 3, 130 ไบต์

ขอบคุณ @Rod สำหรับการชี้จุดบกพร่อง

from random import*
def f(x):l=10**len(x);k=str(randint(0,l-1)+l)[1:];print(''.join(chr(ord(i)+int(j))for i,j in zip(x,k))+'\n'+k)

ฟังก์ชันที่รับอินพุตผ่านอาร์กิวเมนต์เป็นสตริงและพิมพ์ไปยัง STDOUT

มันทำงานอย่างไร

from random import*  Import everything from the random module
def f(x):            Function with input string x
l=10**len(x)         Define l for later use as 10^length(x)
randint(0,l-1)+l     Generate a random integer in the range [0, l-1] and add l, giving a
                     number with l+1 digits...
k=str(...)[1:]       ...convert to a string and remove the first character, giving a key of
                     length l that can include leading zeroes, and store in k
for i,j in zip(x,k)  For each character pair i,j in x and k:
chr(ord(i)+int(j))    Find the UTF-8 code-point (same as ASCII for the ASCII characters),
                      add the relevant key digit and convert back to character
''.join(...)         Concatenate the characters of the ciphertext
print(...+'\n'+k)    Add newline and key, then print to STDOUT

ลองใช้กับ Ideone


เครื่องมือสร้างคีย์ของคุณไม่สร้างคีย์ที่เริ่มต้นด้วย 0 การเพิ่มขอบเขตโดยปัจจัย 10 และการลบตัวเลขที่ 1 ควรแก้ไข: m=10**len(x);k=str(randint(m,m*10))[1:];และคุณยังบันทึกไบต์ในกระบวนการ c:
Rod

@Rod ขอบคุณสำหรับการชี้จุดบกพร่อง ว่าจะไม่บันทึกไบต์ใด ๆ แต่เนื่องจากได้รวมซึ่งหมายความว่าคุณจะต้องทำrandint m*10-1ฉันแค่คิดหาวิธีแก้ไขมันสำหรับจำนวนไบต์เดียวกัน
TheBikingViking

3

Pyth - 16 ไบต์

รอการตัดสินใจจาก OP ในรูปแบบเอาต์พุต

sCM+VCMQKmOTQjkK

Test Suite


ฉันตัดสินใจเลือกรูปแบบ
m654

3

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

;`X9J`M;(O¥♂cΣ@εj

ลองออนไลน์!

คำอธิบาย:

;`X9J`M;(O¥♂cΣ@εj
;                  dupe input
 `X9J`M            for each character in input copy:
  X9J                discard the character, push a random integer in [0, 9]
       ;           duplicate the offset array
        (O         bring input to top of stack, ordinal array
          ¥♂c      pairwise addition with offset array, turn each ordinal into a character
             Σ     concatenate
              @εj  concatenate the copy of the offset array

2

CJam - 14 ไบต์

เมื่อฉันเห็นคณิตศาสตร์รหัส ASCII ฉันรู้ว่าฉันต้องเขียนคำตอบ CJam

q_{;Amr}%_@.+p

ลองมันออนไลน์ได้ที่นี่


2

MATL, 13 ไบต์

"10r*]v!kGy+c

ผลลัพธ์มีลักษณะดังนี้:

9 5 8 2 1
Qjtnp

ลองออนไลน์!

คำอธิบาย:

"    ]          % For each character:
 10             % Push a 10 onto the stack
   r            % Push a random float in [O, 1)
    *           % Multiply. This essentially the same thing as pushing a number in [0, 10)
      v!k       % Join all of these together, and take the floor
         G      % Push the input again
          y     % Duplicate the array of random numbers
           +    % And add these together. Since MATL treats strings as an array of chars, we don't need to explicitly convert types
            c   % Display as string

ฉันไม่แน่ใจว่ารูปแบบที่เหมาะสม ...
รั่วนูน

@Leaky Nun ฉันเปลี่ยนกฏเล็กน้อย
m654

@ m654 คุณพูดว่ามีช่องว่างระหว่างค่าที่ไหน?
Leun Nun

@LeakyNun ในขั้นต้นมีกฎกับพวกเขา แต่ฉันลบมันออกไป
m654

1
ความคิดที่ดีที่จะใช้วง จริง ๆ แล้วมันสั้นกว่ารุ่นrหรืออินพุตหลายตัวYr
Luis Mendo

2

PowerShell v2 +, 79 77 ไบต์

param($n)-join(($x=[char[]]$n|%{0..9|Random})|%{[char]($_+$n[$i++])});-join$x

รับอินพุต$nวนรอบตัวละครทุกตัวและรับRandomองค์ประกอบจาก0..9การวนซ้ำแต่ละครั้ง ร้านตัวเลขเหล่านั้น (เป็นอาร์เรย์) $xลง ไพพ์นั้นจัดเรียงเข้าไปในลูปอื่น แต่ละซ้ำใช้องค์ประกอบปัจจุบัน$_เพิ่มไปยังถ่านตำแหน่งหั่นออกจาก$n(นัยถ่านเพื่อ int หล่อ) [char]ใหม่อีกครั้งแล้วบรรยากาศเป็น ออกจากที่บนไปป์ไลน์ ที่ถูกห่อหุ้มใน parens และ-joined ร่วมกันเพื่อสร้างคำ ที่เหลืออยู่ในท่อ นอกจากนี้หมายเลข$xยังถูก-joinรวมเข้าด้วยกันและปล่อยไว้บนไปป์ไลน์ สิ่งเหล่านั้นจะถูกพิมพ์โดยปริยายWrite-Outputเมื่อสิ้นสุดการดำเนินการซึ่งส่งผลให้พวกเขาถูกพิมพ์ด้วยบรรทัดใหม่ตามค่าเริ่มต้น

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\implement-this-key-cipher.ps1 'Hello World!'
Lhoot(Yt{mf"
433358259121

2

C #, 252 247 245 232 216 ไบต์

ขนาดค่อนข้างแย่เมื่อเทียบกับโซลูชันอื่น ๆ แต่อย่างไรก็ตาม ...

using System;using System.Linq;class p{static void Main(){var c="";var i=Console.ReadLine();var r=new Random();for(int b=0;b++<i.Count();){int d=r.Next(10);Console.Write((char)(i[b]+d));c+=d;}Console.Write("\n"+c);}}

นี่คือคำตอบที่สองของฉันสำหรับ codegolf และฉันค่อนข้างเป็นผู้เริ่มต้นในการพิจารณา C # ดังนั้นฉันยินดีที่ได้ยินวิธีทำให้สั้นลง :)

Ungolfed:

using System;
using System.Linq;

class p
{
    static void Main()
    {
        var c = "";
        var i = Console.ReadLine();
        var r = new Random();
        for (int b = 0; b++ < i.Count();)
        {
            int d = r.Next(10);
            Console.Write((char)(i[b] + d));
            c += d;
        }
        Console.Write("\n" + c);
    }
}
  • บันทึก 5 ไบต์ด้วย @FryAmTheEggman
  • บันทึก 2 ไบต์ด้วย @theLambGoat
  • บันทึก 7 ไบต์โดยลบออกstaticจากคลาส p
  • บันทึก 24 ไบต์ขอบคุณ @milk

1
เคล็ดลับไม่ได้ที่จะเปรียบเทียบกับภาษาอื่น ๆ ;) ฉันไม่เชี่ยวชาญโดยเฉพาะอย่างยิ่งใน C # golf แต่คุณสามารถทำb++<i.Count()และปล่อยประโยคที่สามว่างได้หรือไม่? นอกจากนี้ฉันไม่คิดว่าคุณต้องการบรรทัดใหม่ที่ต่อท้ายดังนั้นการโทรครั้งสุดท้ายWriteLineอาจเป็นการWriteแทน
FryAmTheEggman

ฉันยังไม่เชี่ยวชาญใน C # แต่ฉันคิดว่าคุณสามารถย้าย = r.Next (10) ได้ถึงการประกาศของ d และบันทึกในวงเล็บในการเขียน หรือสุ่มไม่คืน int ดังนั้นคุณไม่สามารถทำเช่นนั้น?
theLambGoat

ฉันคิดว่าฉันสามารถทำได้ขอให้ฉันตรวจสอบ
Tom Doodler

varคุณสามารถเปลี่ยนประเภท ie- var c=แทนstring c=การโกนไม่กี่ไบต์
นม

ทำไมไม่ปล่อยให้ผลConsole.ReadLine()เป็นสตริง? i.Lengthสั้นกว่าi.Count()คุณไม่ต้องใช้ System.Linq สตริงมีตัวทำดัชนีถ่าน การสร้างวัตถุสุ่มใหม่ในลูปนั้นก็น้อยกว่าnew Random().Next(10)ด้วยเช่นกัน
นม

2

CJam, 11 ไบต์

Nq{Amr_o+}/

ลองออนไลน์!

มันทำงานอย่างไร

N            Push a linefeed on the stack.
 q           Read all input from STDIN and push it on the stack.
  {      }/  For each character in the input:
   Amr       Pseudo-randomly pick an integer in [0 ... 9].
      _o     Print a copy.
        +    Add the integer to the character.
             (implicit) Print the linefeed, followed by the modified characters.

2

05AB1E , 18 17 ไบต์

vžh.RDyÇ+ç`?}J¶?,

คำอธิบาย

v           }      # for each char in input
 žh.RD             # push 2 copies of a random number in [0..9]
      yÇ+          # add 1 copy to the current chars ascii value
         ç`?       # convert to char, flatten and print
             J     # join stack (which contain the digits of the key)
              ¶?,  # print a newline followed by the key

ลองออนไลน์


2

Python 3, 112 ไบต์

c คือฟังก์ชั่นที่คืนค่าข้อความที่เข้ารหัสและคีย์

from random import*
c=lambda t:map(''.join,zip(*[(chr(a+b),str(b))for a,b in((ord(i),randint(0,9))for i in t)]))

นี่คือรหัสที่ทำสิ่งเดียวกันและสามารถอ่านได้อีกเล็กน้อย

def encrypt(text):
    # keep the codes of the letters in the input and a random key
    # that will be used later to encrypt this letter
    letter_and_key = ((ord(letter),randint(0,9)) for letter in text)

    # encrypt the letter and keep the key used as a string
    output_and_key = [(chr(letter_code+key), str(key))
                      for letter_code, key in letter_and_key]

    # At this point the values are kept in the format:
    # [(firstletter, firstkey), (secondletter, secondkey), ...]

    # to reorder the list to be able to output in the format "text key"
    text, key = map(''.join, zip(*output_and_key))

    # same as print(*output_and_key)
    return text, key

เอาท์พุท:

>>> text, key = c('Hello World')
>>> print(text, key, sep='\n')
Liuot#`oylk
44935390707

ยินดีต้อนรับสู่เว็บไซต์นี้!
James

1

PHP, 63 86 82 ไบต์

แก้ไข: ลืมพิมพ์รหัส ...

ขอบคุณ Alex Howansky ที่ช่วยฉัน 4 ไบต์

for(;$i<strlen($a=$argv[1]);$s.=$r)echo chr(ord($a[$i++])+$r=rand(0,9));echo"
$s";

อินพุตถูกกำหนดผ่านอาร์กิวเมนต์บรรทัดคำสั่ง ใช้อักขระแต่ละตัวในสตริงและเพิ่ม int แบบสุ่มจาก 0-9 เป็นรหัส ASCII ของมันจากนั้นแปลงรหัสกลับเป็น ASCII ทุกหมายเลขแบบสุ่มจะถูกต่อท้าย$sซึ่งจะถูกพิมพ์ในตอนท้าย


คุณต้องพิมพ์รหัสเช่นกัน
อเล็กซ์ Howansky

คุณสามารถใส่เครื่องหมาย$s.=$rกึ่งที่ 2 ลงใน for for loop ได้และบันทึกไบต์เนื่องจากคุณสามารถดัมพ์ semi semi ที่ต่อท้ายได้ จากนั้นวนรอบของคุณจะเป็นเพียงคำสั่งเดียวเพื่อให้คุณสามารถตัดวงเล็บปีกกาออกได้ช่วยประหยัด 2 ไบต์ขึ้นไป จากนั้นในตอนท้ายคุณสามารถใส่$sสตริงภายในที่ยกมาเพื่อบันทึก.โอเปอเรเตอร์อีกหนึ่งไบต์ :)
อเล็กซ์ Howansky

@AlexHowansky: จริงมาก ขอบคุณ
แมวธุรกิจ

1

J, 32 ไบต์

<@:e,:~[:<[:u:3&u:+e=.[:?[:$&10#

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

from random import randint
def encrypt(message):
    rand_list = list(map(lambda x: randint(0, 9), range(len(message))))
    return (''.join(list(map(lambda x,y: chr(x+y), rand_list, map(ord, message)))), rand_list)


0

Perl, 65 ไบต์

for(split'',$ARGV[0]){$;.=$a=int rand 9;$b.=chr$a+ord}say"$b\n$;"

เอาฉันสักครู่เพื่อหาวิธีป้อนข้อมูลโดยไม่ต้องขึ้นบรรทัดใหม่ในตอนท้าย ใช้มันเป็นบรรทัดคำสั่งหาเรื่อง


ทางออกของคุณมีปัญหาบางอย่าง อินพุตไม่ได้อ่านในรูปแบบ STDIN $;ไม่เริ่มต้นว่างเปล่าดังนั้นจึงพิมพ์เนื้อหาเก่าและแรนด์ไม่สามารถสร้างได้ 9 พวกเขาง่ายต่อการแก้ไขและการใช้ STDIN จะทำให้รหัสของคุณสั้นลง :-)
Hospel ตัน

@TonHospel ปกติแล้วข้อกำหนดในการป้อนข้อมูลจะหลวมและ args เป็นที่ยอมรับผ่าน STDIN และในขณะที่การป้อนข้อมูลจาก STDIN นั้นสั้นลงโดยต้องลบ newline ออกจากทำให้อีกต่อไป และในขณะที่แรนด์สร้างตัวเลข <9 แต่วิธี int ของ Perl จะปัดเศษจากพื้นเพื่อให้ทุกอย่าง> = 8.5 ควรลงท้ายด้วย 9
theLambGoat

โดยทั่วไปข้อกำหนดในการป้อนข้อมูลจะหลวม แต่นี่ไม่ใช่ ได้รับการขึ้นบรรทัดใหม่ไม่ใช่จาก STDIN <>=~/./gเป็นเรื่องง่าย: และไม่intใน perl ที่มีค่าเป็น 0 จะไม่ปัด perl -wle 'print int 8.6'ผลลัพธ์8
Ton Hospel

0

Python 2, 84 99 ไบต์

def f(x):y=`id(x)**len(x)`[1:len(x)+1];return''.join(map(chr,[ord(a)+int(b)for a,b in zip(x,y)])),y

ใช้id()ค่าของสตริงเพื่อสร้างตัวเลขสุ่ม

ลองมัน


คุณต้องส่งออกคีย์เช่นเดียวกับ ciphertext
TheBikingViking

@TheBikingViking ไม่รู้ว่าฉันทำพลาดอย่างไร ขอบคุณ - คงที่
ทัศนศึกษา

ฉันคิดว่านี่เป็นปัญหาเดียวกันกับคำตอบ Python รุ่นก่อนหน้าของฉัน มันไม่สร้างคีย์ด้วยเลขศูนย์นำหน้า
TheBikingViking

@TheBikingViking แก้ไขอีกครั้ง
ทัศนมาตรศาสตร์

เปลี่ยนmap(chr,[ord(a)+int(b)for a,b in zip(x,y)])เป็นmap(lambda x,y:chr(ord(x)+int(y)),x,y)? ที่ควรบันทึกบางสิ่งบางอย่าง
ljeabmreosn

0

Senva , 74 ไบต์

นี่คือโปรแกรมที่สั้นที่สุดที่ฉันทำ:

2'(`>0.>{@}0'{v}2-2'0,{@}1'{v}0'{+}{'}9%+{^}{1-}1'"{+}{~}>$10.~0'2+"0,-:>$

คำอธิบายเล็กน้อย? (หมายเหตุ: BMหมายถึงหน่วยความจำด้านหลัง ):

// === Input and informations storing ===

2'  // Go to the 3rd cell (the two first will be used to store informations)
(   // Ask the user for a string (it will be stored as a suite of ASCII codes)
`   // Go the end of the string
>   // Make a new cell
0.  // Put a 0 to mark the end of the string
>   // Make a new cell, here will be stored the first random number
{@} // Store its adress in BM
0'  // Go to the 1st cell
{v} // Paste the adress, now the 1st cell contains the adress of the first random number
2-  // Subtract 2 because the string starts at adress 2 (the 3rd cell)
2'  // Go to the 3rd cell (where the string begins)

// === String encryption and displaying ===

0,  // While the current cell doesn't contain 0 (while we didn't reach the string's end)
  {@}  // Store the character's adress into the memory
  1'   // Go to the 2nd cell
  {v}  // Paste the value, now the 1st cell contains the adress of the current char
  0'   // Go to the 1st cell
  {+}  // Add the adress of the first random number to the current char adress
  {'}  // Go to this adrses
  9%+  // A random number between 0 and 10
  {^}  // Store this number in BM
  {1-} // Decrease BM (random number between 0 and 9)
  1'   // Go to the 1st cell
  "    // Go to the adress pointed by the cell (the adress of the current char)
  {+}  // Add it to the random number value
  {~}  // Display it as an ASCII character
  >    // Go to the next cell (the next character)
$   // End of the loop
10. // Set the new line's ASCII code into the current cell (which is now useless, so it can be overwritten)
~   // Display the new line
0'  // Go to the first cell
2+  // Add 2 to the adress, because we are not in the string loop : we cancel the 2 substraction
"   // Go to the pointed adress (the first random number's one)

// === Display the random numbers ===

0,  // While we didn't reach the end of the random numbers suite
    // That was why I stored numbers between 1 and 10, the first equal to 0 will be the end of the suite
  - // Decrease it (number between 0 and 9)
  : // Display the current random number as an integer
  > // Go to the next cell (the next number)
$ // End of the loop

ที่ปรากฏใหญ่ขึ้นตอนนี้จริง: p อาจเป็นไปได้ที่จะเพิ่มประสิทธิภาพโค้ดนี้ แต่ในช่วงเวลาที่สั้นที่สุดที่ฉันเคยพบ


0

C #, 174 ไบต์

using static System.Console;class b{static void Main(){var c=new System.Random();var d="\n";foreach(var e in ReadLine()){var f=c.Next(10);Write((char)(e+f));d+=f;}Write(d);}}

Ungolfed:

using static System.Console;

class b
{
    static void Main()
    {
        var c = new System.Random();
        var d = "\n";

        foreach (var e in ReadLine())
        {
            var f = c.Next(10);
            Write((char)(e + f));
            d += f;
        }

        Write(d);
    }
}

ค่อนข้างตรงไปตรงมาจริงๆ


0

Perl 6: 55 หรือ 70 ไบต์

เป็นฟังก์ชั่นที่ไม่ระบุชื่อที่รับพารามิเตอร์สตริงและส่งกลับรายการของสองสตริง(54 ตัวอักษร 55 ไบต์) :

{my @n=^9 .roll(.ords);(.ords Z+@n)».chr.join,@n.join}

ในฐานะโปรแกรมที่อ่านจาก STDIN และเขียนไปยัง STDOUT (69 ตัวอักษร, 70 ไบต์) :

my @a=get.ords;my @n=^9 .roll(@a);say (@a Z+@n)».chr.join;say @n.join
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.