暗号を生成する


15

番号と文字列を指定して暗号を生成します

あなたの仕事は簡単です。与えられた文字列sと数字0 <= n <= 9入力としてを指定し、文字列の各文字の間に擬似ランダムの印刷可能なASCII文字を挿入しますn。各文字のためにこのようなことsがありn、それらの間のランダムな文字が。スペースは削除する必要があります。

入力:

  • ストリング s暗号で暗号化するフレーズ
  • nの範囲の整数0 <= n <= 9

例:

入力:

The treasure is here
2

出力:

T!0 h 32 e F4 t 0i r lk e hm a 7y s#0 u *&r * h e!2 i H ^ s B、h!@ e 0)r $ h e


これはので、最短のコードが勝ちます!頑張って楽しんでね!


3
ランダムな印刷可能なASCII文字ここで、ランダムの意味を定義する必要があります。すべての印刷可能なASCII文字が同じ確率を持っていると思いますか?それらは統計的に独立すべきですか?これに関してどのような柔軟性がありますか?
ルイスメンドー

3
@jacksonecac私は同意しません。ランダムと言うだけでは十分ではありません。例えば、私はまだランダムだが、それはおそらく受け入れられていないこと、でもASCIIコードでランダムな文字列を選択する(またはそれをイスト?)場合の各シリーズ場合はn文字がで構成されn、同じランダムな文字のコピー、彼らはまだランダムであるが、彼らはあります統計的に独立していません。など
ルイスメンドー

5
@jacksonecac「ランダム」は非常に広い用語です。周囲の文字Oがスペースや~?よりも多くなるように、正規分布の文字を選択できますか?それが均一でなければならない場合、あなたはそう明示的に言う必要があります。そして、それが均一である必要がない場合は、少なくとも各キャラクターがゼロ以外の確率を持つ必要があるようなことを述べる必要があります。また、前のコメントで、各キャラクターに独立した分布が必要であると述べているため、これが重要な場合は、チャレンジで言及する必要があります。ランダム性非常に広範なスペクトルがあります。
マーティンエンダー

3
これは実際には暗号ではありません。おそらくステガノグラフィックです。
グレッグマーティン

2
@MartinEnderの有効なポイントに対する適切な応答ではありません。解決策は、文字が互いに均一で統計的に独立している必要があり、コメントが停止することを明示的に指定することです。代替の(しかし、より乱用されやすい)仕様は、すべての文字がゼロでない可能性がある限り、歪んだ分布または文字が互いに依存している分布は問題ないというものです。コードでは、ゴルフの仕様は公平性のために重要です。そうでなければ良い挑戦についてのこれらの有効なコメントに対処したくないと思われるので、私は閉会を表明します。
レベルリバーセント

回答:


7

C#、141 131バイト

@Geobitの Javaの回答とかなり似ていますが、現在より長い:(

(I,n)=>{var R=new System.Random();var o="";int i,r;foreach(var c in I)if(c>32)for(i=r=0,o+=c;i++<n;){r=R.Next(33,127);o+=(char)r;}return o;};

フルラムダスタッフ:

Func<string, int, string> a = (I,n) =>
{
    var R=new System.Random();
    var o="";
    int i;
    foreach(var c in I)
        if(c>32)
            for(i=0,o+=c;i++<n;o+=(char)R.Next(33,127));
    return o;
};

なぜR=...あなたはnew System.Random().Next(...)私が思うだけで直接使用することができます
ローマGräf16年

2
@RomanGräf msdn.microsoft.com/en-us/library/h343ddh9(v=vs.110).aspx C#のランダムクラス、種なし、などの中など(あなたが矢継ぎ早に呼び出すそうならば、システムクロックを使用します。ループ)、ほとんどの場合に機能しない値のほとんどが同一になります:(信じてください、私は常にそれを試してから覚えています。
Yodle

7

05AB1E、11のバイト

ð-vy²FžQ.RJ

オンラインでお試しください!

説明

ð-           # remove spaces from input string
  v          # for each char in the string
   y         # push the char
    ²F       # input-2 number of times do:
      žQ.R   # push a random ascii character
          J  # join to string

閉じる!スペースをトリム!:)
jacksonecac

@jacksonecac:その部分を見逃して申し訳ありません。今すぐ修正:)
エミグナ

良くやった!うまくいく!
jacksonecac

1
@carusocomputing:最後の文字の後にランダムな文字も追加されます。文字の間だけではありません。
エミグナ

1
@Emigna質問の下で最近のコメントの後、これは問題ないようです:)
geisterfurz007

6

Java 7、132 124バイト

String f(int n,char[]a){String o="";int i;for(char b:a)if(b>32)for(i=0,o+=b;i++<n;o+=(char)(33+Math.random()*94));return o;}

派手なものは何もありません、あなたが期待するようなダブルループです。文字列をループする外側、ランダムに埋める内側:

String f(int n,char[]a){
    String o="";
    int i;
    for(char b:a)
        if(b>32)
            for(i=0,
                o+=b;
                    i++<n;
                        o+=(char)(33+Math.random()*94));
    return o;
}

不要kString f(int n,char[]a){String o="";for(char b:a)if(b>32){o+=b;for(int i=0;i++<n;o+=(char)(33+Math.random()*94));}return o;}(125バイト)
オリビエグレゴワール

そうだね。別の方法で使用していました。私がcharキャストと一緒に行ったときにそれを取り出すことを考えていませんでした。ありがとう!
ジオビット

私の悪い。私は間違って数えましたが、私の提案 124バイトでした:長さではなく列をチェックしました;)
オリビエ・グレゴワール

ええ、私は2つを比較するときに気づいた:)
Geobits

5

パイク、12 11 9バイト

d-FQV~KHs

ここで試してみてください!

d-        -  remove spaces from input
  F       - for i in ^:
   QV     -  repeat (number) times:
     ~KH  -    random_from(printable)
        s -   sum(^)

OPによれば、末尾のランダムな文字は問題ありません。


5

オクターブ、43バイト

@(s,n)[s(s>32);33+94*rand(n,nnz(s>32))](:)'

これは、入力として文字列sと整数nを取ります。Octaveの文字列は、単なる文字の配列です。s>32は、1非スペース文字用の論理マップです。このコードは、33から126までの浮動小数点数を含むn行と列の数が同じである行列を追加しますs(s>32)。暗黙的に整数に丸められ、文字列と連結されるとASCII文字に変換されますs(:)'これを水平方向の文字配列にまっすぐにします。

ここでテストしてください!


1
暗黙的な丸め!ニース
ルイスメンドー

4

パイソン2、123 122 118 114 98バイト

男、私randomはそれほど高価ではなかったと思います(そしてスペースをフィルターする必要はありませんでした)。これで、最後に暗号文字を使用できるようになり、大きな節約になりました:)とにかく、ここに行きます:

from random import*
f=lambda s,n:s and(' '<s[0])*eval('s[0]'+'+chr(randint(32,126))'*n)+f(s[1:],n)

4

JavaScript(Firefox 30 +)、96バイト

(s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32]))

Pure ES6は2バイト長くなります。

(s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[...Array(n)].map(_=>Math.random()*95+32)))

悲しいことに26バイト長い、本当にクールなアプローチを次に示します。

(s,n)=>String.raw({raw:s.split` `.join``},...[for(_ of s)String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32])])

厳密に言えば/. *(?=.)/、スペースで始まる文字列やスペースで終わる文字列では機能しません。(現在、ランダムな文字の末尾も許可されています。)
ニール

@Neil末尾のランダムな文字は許可されますか?(?=.)文字列の最後のスペースを処理するものを削除できると思います。
ETHproductions

仕様はそれほど明確ではありませんが、空白の挿入は避けてください。94+33代わりに95+32
-edc65


3

CJam21 18バイト

lS-(ol~f{{95mrSc+\}*}

オンラインでお試しください!

nランダムな末尾の文字を印刷します。

説明

lS-        e# Read line and remove spaces.
l~         e# Read and evaluate another line.
f{         e# For each character (passing in N)...
  {        e#   Do this N times...
    95mr   e#     Push random integer in [0, 95).
    Sc+    e#     Add to space character, giving a random printable ASCII character.
  }*
}
           e# All characters remaining on the stack are printed implicitly
           e# at the end of the program.

3

バッシュ、124バイト

純粋なbash + coreutils、制御フロー構造なし、サブ言語なし、「評価」なし

ゴルフ

E() { N=${1// /};paste <(fold -1<<<$N) <(tr -cd "\\40-\\176"<\/dev\/urandom|head -c$(($2*${#N}-$2))|fold -$2)|tr -d '\t\n';}

テスト

>E "The treasure is here" 2
TkZhf(e&Rt@FrS,edha+-sJTuh.rX@eVKi+3s<7hftey8r*/e

3

Q / KDB +、39 36 34バイト

raze{""sv(raze x;`char$40+n?87)}prior s
(,/)({""sv((,/)x;`char$40+n?87)}':)s

(,/)({""sv((,/)x;10h$40+n?87)}':)s

使用中の変数:

s:"The treasure is here"
n:2

これは前の副詞を使用します。この副詞は、右の各アイテムとその前身の間にある左に関数を適用します。(本質的に、右側の各文字の間の左側に関数を適用します。)

40から126までのn個の乱数を生成し、それらを同等の文字に変換します(qはこれらの文字のみを持っているようです)

`char$40+n?87

//Possible characters.
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~

出力例:

TVghrveVp Rpti+r0sea3a9nsIjuRXrAReJ; +di=ys`{ ikhKTe4trTZesz

編集:
k表記を使用してqのレイズを(、/)に変換して3バイトを保存し、同様に `:の前に変更しました:更新の@slackwearに感謝、2バイトを削りました:)


1
でキャストしてバイトのカップルを保存することができます10h$
skeevey

2

Java 8、114バイト

ゴルフ

(n,s)->s.chars().forEach((c)->{if(c>32)for(int i=0;i<=n;)System.out.print((char)(++i==1?c:33+Math.random()*94));})

整数と文字列を受け入れるラムダ。Java 7の答えに触発され、いくつかのJava 8ストリーム構文(String.chars)を使用して数ループを節約するダブルループ。

入力

3, "Hello world!"

出力

HfKIedb3l<-Ul%}vod"Bw\"|oa`%rH-}l/-{dMS;!B#X

2

Scala、95 94バイト

def c(s:String,i:Int)=s.filter(_>32).mkString(scala.util.Random.alphanumeric.take(i).mkString)

StringでmkStringを使用すること以外に、あまり凝ったものはありません。文字列を文字のリストとして扱い、それらの間にセパレータを挿入できます。私の区切り文字は、ランダムに生成された英数字の適切な数です。


質問にはまったく答えません。の性質によりRandom.alphanumeric、各チャンクが同じになるため、不完全な暗号になります...この例を参照してくださいscala> c("Hello", 1) res0: String = Hbeblblbo
Jacob

ところで、あなたは削除することができますfiltermkString文字列を呼び出すと、文字コレクションとして扱われます。
ジェイコブ

@Jacobフィルターは、スペースを削除する上で最も効率的な方法です。十分だと思われるのでランダムのままにしましたが、時間があれば、適切なランダムテキスト用に別の関数を追加します。
イーサン

2

> <>(魚)、107 106 103バイト

<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<

オンラインでお試しください!

超ランダムではありませんが、ランダムです。文字列と整数をスタックに配置するだけです(例:「Hello world!」、5)。

Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d

完全な説明

説明を更新するまで、これはコードの少し古いバージョンです。ほとんど同じですが、読みやすいかもしれません。

< v}:{r&" "
+1xv
+2<v
   }
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<

文字列パラメータがsで、整数パラメータがのふりをしますi

< v}:{r&" "

<ラップアラウンド左すぐに移動する魚、伝え" "スタックにcharactedスペースを追加し、。その後、魚がを通過し&、レジスタにスペースが追加されます。rスタックを反転し、スタックを{:}左に移動し(スタックiの最後に配置)、スタックの最後に値をコピーしてから、右に移動します。v魚が下方に動き始めるように指示します。

+1xv
+2<v
   }

xランダムな方向に移動するように魚に指示し、最終的に魚は右に移動して下方に進むか、または通過する1+2+事前に通過します。これらは、スタックの最後の数にそれぞれ1または2を追加します。魚が上方に移動すると、v再びヒットし、下方に移動します。}スタックを右に移動してから、スタックのi位置1に配置し、この新しい変数を位置0に配置します(これを呼び出しますm)。

:&:<~ v!?=&

このセクションは関数です。それをwhitespaceTrimmerと呼びましょう。そこから始まります<。スタックの最後(文字列の先頭)にあるスペースを、スペース以外の文字に達するまで削除します。

そのため、魚はすぐに泳ぎ<、左に移動しなければなりません。それから:&:&、スタックの最後に値をコピーし、レジスタのスペースをスタックの最後に配置し、コピーしてからレジスタに戻します。

次に、魚はをヒットし=?!v ~ます。具体的に=は、スタックから最後の2つの値(作成した2つ)をポップし、それらを比較し、等しい場合はスタックの最後に1を置き、0をオンにします異なる場合はスタックの最後。?それは、この場合にある次の命令、実行しない0である場合、スタックの末尾から新しい値をポップし!、それに代えて実行v下方(関数を出る)を移動し、注文魚。

ただし、1の場合はスペースが見つかったため!、トランポリンであるを実行します。これにより、魚は次の命令であるをスキップしv、魚は続行します。魚の前で、~スタックから最後の値(スペースであることが確認された)をポップするように指示していることがわかり、魚は続行し、関数を再度実行します。

?!;a6.>ol2-

魚はすぐにaによって右に泳ぐように指示さ>れ、スタックの最後の文字を出力しますo(これが最初に実行されるとき、これはの最初の文字ですs)。からスタックの長さを取得し、スタックの末尾にla 2を配置してから、-2を減算しlます。ヒットする?!;と、何?が起こるかを覚えて!、スタックが空の場合に魚がスキップし、着地します;、プログラムが終了します。

スタックに文字がまだある場合は、実行!して魚を跳ね返させ、;実行a6.してa(AKA 10)を保存し6、スタックの終わりに、のx, y座標であり.、を終了するスタックし、魚をテレポートします10, 6その位置の右側に命令を実行します(魚は右に泳いでいます)。

これはy、位置6がこの1つ下の行であることに気づいたときに聞こえるほど複雑ではありません。x位置10はでv、その右側はで、これはノーオペレーションです。これにより、魚は右に泳ぎ続け、実際にラインの先頭で実行を開始します...

:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<

したがって、これは、文字の間にランダムテキストを追加する関数です。少し口が広いですが、それは私が少し余分にランダムにしようとしたからです。これをgenRandomCharsと呼びましょう。

これ:{{:}l1-[rvは実際には関数のセットアップであり、実際の関数自体のそれほど重要な部分ではありません。魚は最初に泳ぎ:{{、スタックの最後に値をコピーし、次に左に2回シフトします。iスタックの位置1にあったことを思い出すと、スタックiの終わりにいることがわかります。

次に、魚は:}そのコピーの上を泳ぎi、スタックを右にシフトし、スタックiの最初と最後の両方に配置します。l1-[魚にスタックの最後に長さを配置させ、そこから1を引いて[、新しいスタックを作成し、l-1(スタックの長さから1を引いた)値を新しいスタックに移動します(したがってi、古いスタックのままにします)。その後、魚は単にヒットrvし、スタックを再度反転します(新しいスタックを作成すると、何らかの理由でそれが反転すると思います)、魚がもう一度下に泳ぐように命令し、真に機能を開始します<真下でます。

それで、現在スタックの終わりにはm一時的なものiがありますti。すぐに魚が泳ぎ1-}、1を引いtiてスタックの先頭に移動します。その後:}、単にコピーmしてスタックの先頭に移動します(プットtiスタック位置1に配置)。

これは、私たちがこの小さなことをしたときです。

v2<
<1x|!
^3<

これは実際には非常に簡単です。これ!により、魚はスキップ|して実行されxます。何をxしているのかを思い出して、これにより魚が4方向に移動することを覚えています。|単に鏡であり、魚を泳がせるx。したがって、基本的に、魚はスタックの最後に1、2、または3を配置し、左に移動し続けます。

次に、魚が実行さ*+oれ、スタックの最後の2つの値がポップオフされ、乗算され、結果が押し戻され、同じものが加算され、最後の値がスタックからポップされて出力されoます。私たちのスタックは、[再びちょうど含む今比較的正常ですmtis ]。

:}}:スタックの最後の値(基本的にはs位置0)をコピーし、スタックを右に2回シフト(ti前面に再度配置)してからtiコピーします。?!v今ではかなり簡単に理解できるはずです。基本的にti0の場合、で関数を終了しますv。それ以外の場合は、実行!してスキップしますv(別のループます)。

tiが0で、わずかにランダムな文字の出力が完了したら、実行して以下vを確認します。

   v ~}}r]~<
.43<

ここであまり派手なものはありません。をti介してスタックから削除します~。それから]新しいもので、すべての値をスタックからポップし、古いスタックに配置します!逆転の問題のため、私たちがして、逆rに右二回スタックをシフトし、その後、}}~右にスタックをshufting、私たちを与える[ mis]、~重複余分を削除することですs[0]、我々があれば、それを必要とするだろうとしての機能で以前からループを実行していました(しかし、そうではありません、終了しています)。vダウン泳ぐにするために魚を告げる>34.だけで、左とに泳ぐ魚を伝えている、(実行順序を示すために、反転)3, 4(ので.ジャンプであります!)。3, 4実際には始まりのすぐ右側ですwhitespaceTrimmer、これは私たちが左に移動しているので完璧です。

このすべてのロジックに従って、スタックが最終的に空になり、プログラムwhitespaceTrimmerが実行された直後に終了するまで、魚を追跡できます。


うーん、キャラクターが印刷可能でなければならないことはわかりませんでした。これには、ランダム性を減らして小さくするわずかな変更が必要になります。
redstarcoder

それほどランダムではありません。私はそれがほとんどの場合うまくいくと信じています、まだ失敗していません。大文字、小文字、およびいくつかの記号で動作します。これはチャレンジの要件を満たしていると確信しています。
redstarcoder

2

Perl 5、81バイト

($_,$n)=<>;chomp;y/ //d;$\=chop;print map{$_,map{chr 33+int rand 94}1..$n}split//

以下がワンライナーの機能を理解するのに役立つことを願っています。

($_, $n) = <STDIN>;  # Reads in the string into $_,
                     # and the number into $n, from standard input.
                     # (<STDIN> works slightly different from <>.)
chomp($_);           # Removes the newline from the string.
$_ =~ tr/ //d;       # `Tr/`ansliterates ASCII space characters
                     # into nothing, effectively `/d`eleting them.
$\ = chop($_);       # Chop()s off the last character out of $_ and
                     # appends it to the output when print()ing.
                     # (Perl always prints $\ after you call print().)
print( map {         # Each element of [List 1] will be mapped to:
    $_,              #   -- Itself, and
                     # (When mapping, each element is available as $_.)
    map {            # (`map` resembles `foreach` but returns a list.)
        chr(         #   -- A random ASCII character, in the range
          33 + int(rand(94)) ) # from 33 (!, hex 21) to 126 (~, hex 7E)
    } 1..$n          # ...$n times! (Over the range 1 to $n, actually.)
} split(//, $_) );   # [List 1] is $_, split() into characters.

1

Clojureは、126の 123 118 122 117バイト

(defn c[m n](apply str(remove #(=\space %)(mapcat #(apply str %(for [_(range n)](char(rand-nth(range 32 127)))))m))))

メッセージにマップし、ランダムな文字を挿入し、結果を連結します。

指示は、結果文字列からすべてのスペースを削除することを示唆しています。元のメッセージのスペースのみが削除されることになっている場合は、それを変更できます。

ゴルフをしていない:

(defn cipher [message n]
  (apply str
    (remove #(= \space %)
        (mapcat #(apply str %
                     (for [_ (range n)]
                       (char (rand-nth (range 32 127)))))
                message))))

1

Python 3、127バイト

import random
a,b=input(),input()
print(''.join([x+''.join([chr(random.randint(33,126))for c in range(int(b))]) for x in a]))

おそらく必要以上に長いですが、これはこれまでのところ私のものです。


1
これにより、最初の文字の前にランダムな文字が追加され、スペースは削除されません。これらの両方がルールを破ると思います。
スチューウィーグリフィン

1

PHP、96バイト

引数1として文字列を、引数2として数値を取ります

for(;($s=str_replace(' ','',$argv[1]))[$j]>'';)echo$i++%($argv[2]+1)?chr(rand(33,127)):$s[$j++];

オンラインで試す


1

Python 3、133バイト

from random import *
c=int(input())
print(''.join([i+''.join([chr(randint(33,126))for i in range(c)])for i in input().strip(' ')])[:-c])

1

Node.js、88バイト

(s,n)=>s.replace(/./g,c=>c!=" "?c+crypto.randomBytes(n).toString`base64`.substr(0,n):"")

出力例:

f("The treasure is here", 2)
// THphdwekAtMArbSeU1aDTsZWuqnr2yek1iyUsKshqXewvrVCeTi

f("The treasure is here", 2)
// TYshlcep6t4Iru7e29aQ1sl/uvQrlzeSJihysDhhOLe1urpte1m

オンラインでお試しください!


1

C、102100バイト

スキップする場合は-2バイトcontinue

i;f(char*s,int n){do{while(*s==32)++s;putchar(*s);i=n;while(i--)putchar(32+rand()%95);}while(*s++);}

ゴルフをしていない:

i;
f(char*s,int n){
 do{
  while(*s==32)++s;
  putchar(*s);
  i=n;
  while(i--)
    putchar(32+rand()%95);
 }while(*s++);
}

使用法:

main(){
  char a[]="A   A A";
  f(a,3);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.