컴퓨터 암호


14

소개:

나는 한때 어렸을 때 컴파일 된 문서에 다양한 암호가 저장되어 있으며, 도전에 가장 적합하다고 생각되는 것을 선택했습니다 (너무 사소하지 않고 어렵지 않음). 대부분은 여전히 ​​샌드 박스에 있으며, 모두 게시할지 또는 일부만 게시할지 확실하지 않습니다. 그러나 여기에서 처음으로 일을 시작합니다.


컴퓨터 암호는 주어진 텍스트를 주어진 '무작위'문자 그룹으로 암호화합니다 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입니다.
  • hprit:이 그룹에는 숫자가 포함되지 않으므로이 그룹의 첫 번째 문자는 해독 된 텍스트에 암시 적으로 사용됩니다 h.
  • osyw2:이 그룹에는 숫자가 포함되어 있으므로이 그룹 2의 (1 색인) 두 번째 문자는 해독 된 텍스트에 사용되는 문자 s입니다.

도전:

integer length와 string이 주어지면 위에서 설명한대로 임의의 암호화 된 문자열을 word_to_encipher출력하십시오 .

length및을 지정하여 암호화 word_to_encipher하면되므로 해독 프로그램 / 기능도 만들 필요가 없습니다. 그러나 나는 앞으로 해독에 대한 2 부 도전을 할 수있다.

도전 규칙 :

  • length범위 안에 있다고 가정 할 수 있습니다 [3,9].
  • word_to_encipher의지에는 글자 만 포함되어 있다고 가정 할 수 있습니다 .
  • 소문자 또는 대문자를 사용할 수 있습니다 (답변에 사용한 것을 적어주십시오).
  • 출력, 모든 그룹 및 그룹의 숫자 위치 (있는 경우)는 균일하게 임의적 이어야합니다 . 따라서 알파벳의 모든 임의의 문자는 같은 확률로 발생합니다. 각 그룹에서 암호화 된 문자의 위치는 동일한 가능성이 있습니다. 숫자의 위치는 발생할 가능성이 동일합니다 (첫 번째 문자이고 숫자가없는 경우는 제외하고 암호화 된 문자와 동일한 위치에있을 수 없음).
  • 1- 인덱스 대신 0- 인덱스 숫자를 사용할 수도 있습니다. 답에 사용한 두 가지를 적어주십시오.
  • 숫자 1(또는 00 인덱싱 된 경우)는 출력에 절대 존재하지 않습니다. 따라서 b1ndh문자 'b'를 암호화하는 유효한 그룹이 아닙니다. 그러나 b4tbw를 Where, 유효 4암호화한다 b4 (1 인덱스의) 위치 및 다른 문자로는 b, t, w(동시도 포함하는 랜덤 b). 다른 가능한 유효한 그룹 length: 5 문자 '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
"uniform"은 무슨 뜻
인가요?

@ l4m2 모든 출력에 동일한 기회가 있습니다. 따라서 알파벳의 모든 임의의 문자는 같은 확률로 발생합니다. 각 그룹에서 암호화 된 문자의 위치는 동일한 가능성이 있습니다. 숫자의 위치는 발생할 가능성이 동일합니다 (첫 번째 문자이고 숫자가없고 암호화 된 문자와 같은 위치에 있지 않은 경우 제외).
Kevin Cruijssen

그래서 abcd2, ab2de, babbk모두 같은? 또한 b1akk유효합니까?
l4m2

@ l4m2 네, 세 개 모두 문자 'b'를 암호화하는 가능한 출력입니다. 에 관해서는 b1akk나는 아무 말도 것입니다. 확인하기 위해 챌린지 설명에서이를 편집합니다. 첫 번째 문자가 암호화 된 문자이면 숫자가 없어야합니다.
Kevin Cruijssen

1
예를 들어, 길이 = 3 인 경우 char = "a"; 이 양식은 "a??"676 개 가능한 결과를 가지고 있지만 "1a?", "?a1", "2?a", "?2a", only104 결과가 있습니다. 따라서이 780 개 결과 중 하나의 결과를 선택하려고하면 "암호화 된 문자의 위치"의 분포는 1 : 1 : 1이 아니라 13 : 1 : 1입니다. 그리고 저는 이것을 "균일하게 임의적 인"작동 방식으로 생각합니다.
tsh December

답변:


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

펄 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

파이썬 (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 인덱스 숫자를 사용합니다.

Kevin Cruijssen 덕분에 -3 바이트


@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

apt , 29 바이트

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

온라인으로 사용해보십시오!

인덱스가 0입니다.

설명:

;                                :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 색인, 소문자.

약간 골퍼되지 않고 확장 :

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

코드는 매우 간단해야합니다. 두 불규칙적 i, j하나 생성 rand()GCD는 (이후 호출은 독립 같은 좋은 n, ~-n1) =하고 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]

온라인으로 사용해보십시오!

선택 :

  • 무작위 x(세그먼트에서 캐릭터의 위치)
  • y같지 않은 난수 x(세그먼트에서 숫자의 위치)
  • 각 위치에 임의의 문자가 소문자하지 동일 x하고 동일하지 y않으면 x제로

1

자바 스크립트, 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 # 대화식 컴파일러) 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.