รหัสคอมพิวเตอร์


14

บทนำ:

ฉันมียันต์ต่าง ๆ มากมายที่เก็บไว้ในเอกสารที่ฉันเคยรวบรวมเมื่อตอนเป็นเด็กฉันเลือกบางอย่างที่ฉันคิดว่าเหมาะสมที่สุดสำหรับความท้าทาย ส่วนใหญ่ยังอยู่ในกล่องทรายและฉันยังไม่แน่ใจว่าฉันจะโพสต์พวกเขาทั้งหมดหรือเพียงไม่กี่ แต่นี่เป็นครั้งแรกที่พวกเขาจะเริ่มต้นสิ่งต่าง ๆ


คอมพิวเตอร์ Cipher จะเข้ารหัสข้อความให้เป็น 'สุ่ม' lengthกลุ่มตัวละครที่ได้รับ หากกลุ่มดังกล่าวมีตัวเลขมันจะใช้ตัวเลขนั้นเพื่อจัดทำดัชนีลงในกลุ่มของตัวเองสำหรับอักขระที่เข้ารหัส หากไม่มีตัวเลขอยู่ในกลุ่มแสดงว่ามีการใช้อักขระตัวแรก

ตัวอย่างเช่นสมมติว่าเราต้องการที่จะเข้ารหัสข้อความที่มีความยาวที่กำหนดของthis is a computer cipher 5นี่เป็นเอาต์พุตที่เป็นไปได้ (หมายเหตุ: ตัวเลขมีการจัดทำดัชนี 1 รายการในตัวอย่างด้านล่าง):

t     h     i     s     i     s     a     c     o     m     p     u     t     e     r     c     i     p     h     e     r       (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv   (without spaces of course, but added as clarification)

ลองมาเป็นตัวอย่างสองสามกลุ่มเพื่ออธิบายวิธีถอดรหัสกลุ่ม:

  • qu5dtกลุ่มนี้มีหลัก5ดังนั้น (1 จัดทำดัชนี) ตัวละครที่ 5 tของกลุ่มนี้เป็นตัวละครที่ใช้สำหรับข้อความถอดรหัส:
  • hprithกลุ่มนี้มีตัวเลขไม่ดังนั้นตัวอักษรตัวแรกของกลุ่มนี้จะถูกใช้โดยปริยายสำหรับข้อความที่ถอดรหัส:
  • osyw2: กลุ่มนี้ประกอบด้วยหลัก2ดังนั้น (1 จัดทำดัชนี) ตัวละครที่ 2 sของกลุ่มนี้เป็นตัวละครที่ใช้สำหรับข้อความถอดรหัส:

ท้าทาย:

กำหนดจำนวนเต็มlengthและสตริงword_to_encipherเอาท์พุทสตริงเข้ารหัสแบบสุ่มตามที่อธิบายไว้ข้างต้น

คุณจะต้องเข้ารหัสlengthและword_to_encipherให้ดังนั้นจึงไม่จำเป็นต้องสร้างโปรแกรม / ฟังก์ชั่นการถอดรหัสเช่นกัน ฉันอาจทำข้อ 2 ในการถอดรหัสในอนาคต

กฏท้าทาย:

  • คุณสามารถถือว่าจะอยู่ในช่วงlength[3,9]
  • คุณสามารถสันนิษฐานได้ว่าword_to_encipherจะมีเพียงตัวอักษร
  • คุณสามารถใช้ตัวพิมพ์เล็กเต็มหรือตัวพิมพ์ใหญ่เต็มรูปแบบ (โปรดระบุว่าคุณใช้คำตอบแบบใด
  • เอาท์พุทของคุณทุกกลุ่มและตำแหน่งของตัวเลขในกลุ่ม (ถ้ามี) ที่ควรจะเหมือนกันแบบสุ่ม ดังนั้นตัวอักษรแบบสุ่มทั้งหมดของตัวอักษรจึงมีโอกาสเกิดขึ้นเหมือนกัน ตำแหน่งของจดหมายที่เข้ารหัสในแต่ละกลุ่มจะมีโอกาสเกิดขึ้นเช่นเดียวกัน และตำแหน่งของตัวเลขนั้นมีโอกาสเกิดขึ้นเท่ากัน (ยกเว้นเมื่อตัวอักษรตัวแรกและไม่มีตัวเลขอยู่และเห็นได้ชัดว่าไม่สามารถอยู่ในตำแหน่งเดียวกับตัวอักษรที่เข้ารหัส)
  • คุณยังได้รับอนุญาตให้ใช้ตัวเลข 0 ดัชนีแทนดัชนี 1 ดัชนี โปรดระบุว่าคุณใช้คำตอบใดในสองข้อ
  • ตัวเลข1(หรือ0เมื่อดัชนี 0) จะไม่ปรากฏในผลลัพธ์ ดังนั้นจึงb1ndhไม่ใช่กลุ่มที่ถูกต้องที่จะเข้ารหัสอักขระ 'b' อย่างไรก็ตามb4tbwเป็นที่ถูกต้องที่4enciphers bที่ 4 ตำแหน่ง (1 จัดทำดัชนี) และตัวละครอื่น ๆb, t, wเป็นแบบสุ่ม (ซึ่งบังเอิญยังมีb) กลุ่มที่ถูกต้องอื่น ๆ เป็นไปได้ของlength5 ถึงเข้ารหัสตัวอักษร 'B' คือ: abcd2, ab2de, babbk, hue5bฯลฯ

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O ที่เป็นค่าเริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

Input:
 Length:           5
 Word to encipher: thisisacomputercipher
Possible output:
 qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv

Input:
 Length:           8
 Word to encipher: test
Possible output:
 ewetng4o6smptebyo6ontsrbtxten3qk

Input:
 Length:           3
 Word to encipher: three
Possible output:
 tomv3h2rvege3le

2
"เครื่องแบบ" หมายความว่าอย่างไร
l4m2

@ l4m2 มีโอกาสเท่ากันสำหรับเอาต์พุตใด ๆ ดังนั้นตัวอักษรแบบสุ่มทั้งหมดของตัวอักษรจึงมีโอกาสเกิดขึ้นเหมือนกัน ตำแหน่งของจดหมายที่เข้ารหัสในแต่ละกลุ่มจะมีโอกาสเกิดขึ้นเช่นเดียวกัน และตำแหน่งของตัวเลขนั้นมีโอกาสเกิดขึ้นเท่ากัน (ยกเว้นเมื่อเป็นตัวอักษรตัวแรกและไม่มีตัวเลขอยู่และไม่อยู่ในตำแหน่งเดียวกับตัวอักษรที่เข้ารหัส)
Kevin Cruijssen

ดังนั้นabcd2, ab2de, babbkเดียวกันทั้งหมดหรือไม่ ยังb1akkถูกต้องหรือไม่
l4m2

@ l4m2 ใช่แล้วทั้งสามตัวนี้เป็นเอาต์พุตที่เป็นไปได้ที่เข้ารหัสอักขระ 'b' สำหรับb1akkฉันจะบอกว่าไม่ จะแก้ไขในคำอธิบายการท้าทายเพื่อชี้แจง หากอักขระตัวแรกเป็นอักขระที่เข้ารหัสไม่ควรมีตัวเลขหลัก
Kevin Cruijssen

1
ตัวอย่างเช่นเมื่อ length = 3, char = "a"; แบบฟอร์มที่"a??"มีผลลัพธ์ที่เป็นไป 676 แต่"1a?", "?a1", "2?a", "?2a"มี only104 ผล ดังนั้นถ้าฉันพยายามเลือกผลลัพธ์หนึ่งรายการจากผลลัพธ์ทั้งหมด 780 รายการการกระจายของ "ตำแหน่งของจดหมายที่เข้ารหัส" คือ 13: 1: 1 ไม่ใช่ 1: 1: 1 และฉันจะพิจารณาสิ่งนี้ว่า "สุ่มอย่างสม่ำเสมอ" ทำงานอย่างไร
tsh

คำตอบ:


3

Pyth, 22 ไบต์

smsXWJOQXmOGQJdO-UQJJz

ลองออนไลน์

ใช้ตัวพิมพ์เล็กและการจัดทำดัชนีเป็นศูนย์

คำอธิบาย

อัลกอริทึมตรงไปตรงมามาก

                           Implicit: read word in z
                           Implicit: read number in Q
 m                   z     For each char d in z:
      OQ                     Choose a number 0..Q-1
     J                       and call it J.
         m  Q                Make an array of Q
          OG                 random letters.
        X     d              Place d in this string
             J               at position J.
    W                        If J is not 0,
   X                J        place J in this string
               O             at a random position from
                 UQ          0..Q-1
                -  J         except for J.
  s                          Concatenate the letters.
s                          Concatenate the results.

5

Perl 6 , 125 ไบต์

->\n{*.&{S:g{.}=(65..90)>>.chr.roll(n).join.subst(/./,$/,:th($!=roll 1..n:)).subst(/./,$!,:th($!-1??(^n+1$!).roll!!n+1))}}

ลองออนไลน์!

รับอินพุตและเอาต์พุตเป็นตัวพิมพ์ใหญ่ f(n)(string)จะเข้าแกงกะหรี่เช่น ใช้การจัดทำดัชนี 1 รายการ

คำอธิบาย:

->\n{*.&{ ...  }}   # Anonymous code block that takes a number n and returns a function
     S:g{.}=        # That turns each character of the given string into
                          .roll(n)      # Randomly pick n times with replacement
            (65..90)>>.chr              # From the uppercase alphabet
                                  .join # And join
            .subst(                         ) # Then replace
                   /./,  ,:th($!=roll 1..n:)  # A random index (saving the number in $!)
                       $/               # With the original character
            .subst(                )    # Replace again
                   /./,$!,:th( ... )    # The xth character with $!, where x is:
                           $!-1??          # If $! is not 1
                                 (^n+1$!).roll       # A random index that isn't $!
                                               !!n+1  # Else an index out of range

4

Python 2 , 187 177 176 156 154 148 ไบต์

lambda l,s:''.join([chr(choice(R(65,91))),c,`n`][(j==n)-(j==i)*(n>0)]for c in s for n,i in[sample(R(l),2)]for j in R(l))
from random import*
R=range

ลองออนไลน์!

ใช้ตัวอักษรตัวพิมพ์ใหญ่และตัวเลขดัชนี 0

-3 ไบต์ขอบคุณ Kevin Cruijssen


@KevinCruijssen ขอบคุณ :)
TFeld

อะไรนะ sample(R(l),2)[::1|-(random()<.5)]หมายถึง?
l4m2

@ l4m2 มันต้องใช้ตัวเลข 2 ตัวจากrange(l)นั้นก็สับพวกมัน แต่เห็นได้ชัดว่าตัวอย่างไม่รับประกันการสั่งซื้อดังนั้นจึงไม่จำเป็น :)
TFeld

คุณไม่สามารถลบวงเล็บออกได้(j==i)*(n>0)หรือไม่? การคูณมีตัวดำเนินการสำคัญเหนือการลบหรือไม่
Kevin Cruijssen

1
@KevinCruijssen ใช่ฉันลืมที่จะลบพวกเขาเมื่อฉันมีปัญหาบางอย่าง
TFeld


3

R , 134 132 123 ไบต์

function(S,n,s=sample)for(k in utf8ToInt(S)){o=k+!1:n
P=s(n,1)
o[-P]=s(c(P[i<-P>1],s(17:42,n-1-i,T)))+48
cat(intToUtf8(o))}

ลองออนไลน์!

ใช้ตัวอักษรตัวพิมพ์ใหญ่

คำอธิบายของรหัสเก่า (ส่วนใหญ่เป็นวิธีเดียวกัน):

function(S,n){s=sample				# alias
K=el(strsplit(S,""))				# split to characters
o=1:n						# output array
for(k in K){					# for each character in the string
P=s(n,1)					# pick a Position for that character
o[-P]=						# assign to everywhere besides P:
      s(					# a permutation of:
	c(P[i<-P>1],				# P if it's greater than 1
		s(letters,n-1-i,T)))		# and a random sample, with replacement, of lowercase letters
o[P]=k						# set k to position P
cat(o,sep="")}}					# and print

2

Java (JDK) , 193 ไบต์

s->n->s.flatMap(c->{int a[]=new int[n],i=n,x=0;for(;i-->0;)a[i]+=Math.random()*26+97;a[i+=Math.random()*n+1]=c;x+=Math.random()*~-n;if(i>0)a[x<i?x:x+1]=48+i;return java.util.Arrays.stream(a);})

ลองออนไลน์!

  • ดัชนีเป็นแบบ 0
  • รายการนี้ใช้IntStream(รับผ่านString::chars) เป็นอินพุตรวมถึงตัวเลขและส่งคืนรายการอื่นIntStreamเช่นเดียวกับจำนวนและผลตอบแทนอื่น
  • ปลดเปลื้องจากdoubleถึงintไม่จำเป็นเพราะ+=แฮ็ค

2

Japt 29 ไบต์

;£=VöJ;CöV hUÎX hUÅÎUÎ?UÎs:Cö

ลองออนไลน์!

ศูนย์การจัดทำดัชนี

คำอธิบาย:

;                                :Set C = [a...z]
 £                               :For each character of the input:
  =VöJ;                          : Get two different random indexes from [0,length)
       CöV                       : Get 5 random letters
           hUÎX                  : Replace one at random with the character from the input
                hUÅÎ             : Replace a different random character with:
                    UÎ?          :  If the input character was not placed at 0:
                       UÎs       :   The index of the input character
                          :      :  Otherwise:
                           Cö    :   A random letter
                                 :Implicitly join back to a string

2

C, 115 ไบต์

g(_,n)char*_;{int i=rand(),j=i%~-n,k=0;for(i%=n;k<n;k++)putchar(k-i?!i|i<k^k-j?rand()%26+97:48+i:*_);*++_&&g(_,n);}

ลองออนไลน์!

ดัชนี 0 ตัวพิมพ์เล็ก

ungolfed เล็กน้อยและขยาย:

g(char*_,int n) {
    int i = rand(), j = i%(n-1), k = 0;
    for(i = i%n; k<n; k++)
        putchar(k!=i ? i!=0 || k==j + (k>i)
                          ? rand()%26 + 'A'
                          : i + '0')
                    : *_);
    if (*++_!=0) g(_,n);
}

รหัสควรตรงไปตรงมาสวย ทั้งสอง randoms i, jสร้างขึ้นในหนึ่งrand()โทรดีเป็นอิสระตั้งแต่ GCD ( n, ~-n) = 1 และRAND_MAXมีขนาดใหญ่


1
ยินดีต้อนรับสู่ PPCG! :)
Shaggy

1

ทำความสะอาด , 256 ไบต์

import StdEnv
s::!Int->Int
s _=code {
ccall time "I:I"
ccall srand "I:I"
}
r::!Int->Int
r _=code {
ccall rand "I:I"
}
$n|s 0<1#k=map\e.r e rem n
=flatten o map\c.hd[map(\i|i==x=c=toChar if(i==y&&x>0)(x+48)(r i rem 26+97))[0..n-1]\\x<-k[0..]&y<-k[0..]|x<>y]

ลองออนไลน์!

Chooses:

  • สุ่มx(ตำแหน่งของตัวละครในกลุ่ม)
  • สุ่มyที่ไม่เท่ากับx(ตำแหน่งของตัวเลขในกลุ่ม)
  • อักษรตัวพิมพ์เล็กสุ่มสำหรับแต่ละตำแหน่งไม่เท่ากับxและไม่เท่ากับyเว้นแต่xจะมีค่าเป็นศูนย์

1

JavaScript, 134 ไบต์

l=>w=>w.replace(/./g,c=>eval("for(s=c;!s[l-1]||s[t?t-1||9:0]!=c;t=s.replace(/\\D/g,''))s=(p=Math.random()*36**l,p-p%1).toString(36)"))

ลองออนไลน์!

คำตอบนี้เลือกสตริงที่เข้ารหัสจากสตริงที่เข้ารหัสที่เป็นไปได้ทั้งหมดอย่างสม่ำเสมอ ดังนั้นจึงเป็นไปได้ที่จะสร้างตัวอักษรที่เข้ารหัสเป็นตัวแรก


1

C # (Visual C # Interactive Compiler) , 171 ไบต์

s=>n=>{var r=new Random();return s.SelectMany(c=>{int i=r.Next(n),j=r.Next(n-1);j+=j<i?0:1;return new int[n].Select((_,k)=>(char)(i==k?c:j==k&i>0?i+49:r.Next(26)+97));});}

ลองออนไลน์!

ชี้แจง ...

// s is the input string
// n is the input length
s=>n=>{
  // we need to create an instance
  // of Random and use throughout
  var r=new Random();
  // iterate over s, each iteration
  // returns an array... flatten it
  return s.SelectMany(c=>{
    // i is the position of the letter
    // j is the position of the number
    int i=r.Next(n), j=r.Next(n-1);
    // ensure i and j are different
    j+=j<i?0:1;
    // create an iterable of size n
    return new int[n]
      // iterate over it with index k
      .Select((_,k)=>(char)(
        // return the letter
        i==k?c:
        // return the number
        j==k&i>0?i+49:
        // return a random letter
        r.Next(26)+97)
      );
  });
}

1

ถ่าน , 35 30 ไบต์

NθFS«≔‽θη≔∧η‽Φθ⁻κηζFθ≡κζIηηι‽β

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด 0 การจัดทำดัชนี คำอธิบาย:

Nθ

ใส่ความยาว

FS«

ป้อนคำและวนรอบตัวอักขระ

≔‽θη

เลือกตำแหน่งสุ่มสำหรับตัวอักษรที่ถอดรหัส

≔∧η‽Φθ⁻κηζ

เลือกตำแหน่งสุ่มที่แตกต่างกันสำหรับตัวเลขยกเว้นว่าตัวอักษรอยู่ที่ตำแหน่ง 0 ซึ่งในกรณีนี้ใส่ตัวเลขที่ตำแหน่ง 0 เช่นกัน

Fθ≡κ

วนหนึ่งครั้งสำหรับอักขระเอาต์พุตแต่ละตัวและสลับตำแหน่ง

ζIη

หากนี่คือตำแหน่งของตัวเลขแล้วส่งออกตำแหน่งของตัวอักษรที่ถอดรหัส

ηι

แต่ถ้านี่คือตำแหน่งของตัวอักษรที่ถอดรหัสแล้วเอาท์พุทตัวอักษร สิ่งนี้จะมีความสำคัญมากกว่าตำแหน่งของตัวเลขเพราะ Charcoal ใช้รายการสุดท้ายหากกรณีสวิตช์จำนวนมากมีค่าเท่ากัน

‽β

มิฉะนั้นเอาท์พุทตัวอักษรแบบสุ่ม


0

05AB1E , 26 ไบต์

ε²Ý¨Ω©A.r²£Šǝ®Āi®²Ý¨®KΩǝ]J

0 การจัดทำดัชนี

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ε            # Map over the characters of the first (implicit) input-string:
 ²Ý¨         #  Create a list in the range [0, second input)
    Ω        #  Get a random item from this list
     ©       #  Store it in the register (without popping)
 A           #  Push the lowercase alphabet
  .r         #  Shuffle it
    ²£       #  Leave only the first second input amount of characters
      Š      #  Triple swap, so the stack order becomes:
             #  random index; random string; map-character
       ǝ     #  Insert the map-character at this random index into the random string
 ®Āi         #  If the random index was NOT 0:
    ®        #   Push the random index
    ²Ý¨      #   Push the list in the range [0, second input) again
       ®K    #   Remove the random index from this list
         Ω   #   Get a random item from this list
          ǝ  #   Insert the first random index at the second random index into the string
]            # Close both the if-else and map
 J           # Join all strings together (and output implicitly)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.