コンピューター暗号


14

前書き:

私は子供の頃にコンパイルしたドキュメントにさまざまな暗号を保存しており、チャレンジに最も適していると考えたものをいくつか選んで(些細ではなく、難しくもありません)チャレンジに変換しました。それらのほとんどはまだサンドボックス内にあり、それらすべてを投稿するのか、それともほんの少数を投稿するのかはまだわかりません。しかし、ここで最初のものを始めます。


Computer 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
  • hprit:このグループには数字が含まれないため、このグループの最初の文字は、解読されたテキストに暗黙的に使用されますh
  • osyw2:このグループには数字が含まれている2ため、このグループの(1から始まる)2番目の文字は、解読されたテキストに使用される文字ですs

チャレンジ:

整数lengthと文字列を指定するとword_to_encipher、上記のようにランダムに暗号化された文字列を出力します。

lengthandを指定するだけで暗号化word_to_encipherする必要があるため、解読プログラム/関数を作成する必要もありません。ただし、将来の解読では、パート2の課題に取り組む可能性があります。

チャレンジルール:

  • length範囲内にあると想定できます[3,9]
  • word_to_encipherは文字のみが含まれると想定できます。
  • 小文字でも大文字でも使用できます(回答で使用したものを明記してください)。
  • 出力、すべてのグループ、およびグループ内の数字の位置(存在する場合)は、一様にランダムでなければなりません。したがって、アルファベットのすべてのランダムな文字は、発生する可能性が同じです。各グループ内の暗号化された文字の位置は、発生する可能性が同じです。また、数字の位置は、発生する可能性が同じです(最初の文字で数字が存在しない場合を除き、暗号化された文字と同じ位置にあることは明らかにできません)。
  • 1インデックスの代わりに0インデックスの数字を使用することもできます。回答でどちらを使用したかを明記してください。
  • 数字1(または00がインデックス付けされている場合)は出力に表示されません。したがってb1ndh、文字「b」を暗号化する有効なグループではありません。しかし、b4tbw有効であり、ここで4暗号化しb4における(1インデックス)の位置、および他の文字はbtw(偶然にも含まれているランダムですb)。他の可能な有効なグループのlength文字「B」を暗号化するための5は以下のとおりです。abcd2ab2debabbkhue5b、など

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿することを妨げないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 標準のルールデフォルトの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すべての出力に等しい機会があること。したがって、アルファベットのすべてのランダムな文字は、発生する可能性が同じです。各グループ内の暗号化された文字の位置は、発生する可能性が同じです。数字の位置は、発生する可能性が同じです(最初の文字で数字が存在せず、暗号化された文字と同じ位置にない場合を除く)。
ケビンクルーッセン

ですからabcd2ab2debabbkすべて同じ?またb1akk有効ですか?
l4m2

@ l4m2はい、3つすべては、文字「b」を暗号化する可能性のある出力です。b1akk私はノーと言うだろう。明確にするために、チャレンジの説明でそれを編集します。最初の文字が暗号化されたものである場合、数字は存在しないはずです。
ケビンCruijssen

1
たとえば、長さ= 3の場合、char = "a"; フォームに"a??"は676の可能な結果がありますが"1a?""?a1""2?a""?2a"、only104結果を持っています。したがって、これら780の結果すべてから1つの結果を選択しようとすると、「暗号化された文字の位置」の分布は、1:1:1ではなく13: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

パイソン2187の 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)か?乗算は、減算よりも演算子の優先順位がありますか?
ケビンクルーッセン

1
うん@KevinCruijssen、私は私はいくつかの問題持っていたとき、それらを削除するのを忘れて
TFeldを


3

R134の 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ベースです。
  • このエントリはIntStreamString::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インデックス付き、小文字。

わずかに拡張されていない:

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

コードは非常に簡単なはずです。1回の呼び出しij生成される2つの乱数は、rand()gcd(n~-n)= 1でRAND_MAXあり、大きいため、独立しているとして適切です。


1
PPCGへようこそ!:)
シャギー

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、等しくない、等しくない各位置のランダムな小文字yx

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θ≡κ

出力文字ごとに1回ループし、位置を切り替えます。

ζ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.