名前の匿名化-並べ替え


16

編集:ランダムマスキングには-20のボーナスがあります

仲間の内部告発者と秘密知識のキャリア。

私は郵送による面接のおかげです。もちろん、特定の名前を完全に言うことはできません。しかし、あまり明白ではない方法で開示したいので、あなたの助けが必要です。

これらの名前を次の形式で提供します

「evil_company_that_makes_me_shiver」

しかし、私はそれを完全に綴りたくありません。私と全世界を支援するあなたの仕事は、あなたが上記を変える素晴らしいプログラムを提供することです

"ev**************************"

または

"**il************************"

あるいは

"****_c**********************"

わかったと思う。しかし、1つの欠点があります。名前を全部公開したいので、出現回数と単語自体をスクリプトに渡す必要があり、文字を少しずつ公開します。例は

~$ ./whistle NSA 3
> "N**"
> "**A"
> "*S*"

または

~$ ./whistle nuclear 3
> "nu*****"
> "***lea*"
> "**c***r"

または

~$ ./whistle nuclear 2
> "nuc****"
> "***lear"

あなたが私を助けてくれることを願っています。サイズが重要であることを知っているので、最短のコードが勝ちます。この世界をより良い場所にしよう!


1
マスキングがどのように行われるべきかについての詳細は提供しないため、例に関係なく、最短のコードを取得する必要があります。
ビル・ウッドジャー14

最短のコードが勝つことは明らかだと思いましたか?うーん、多分これに従って英語の文法を改善する必要があります:( 」一人で
german_guy

はい、最短のコードは明確でした。ただし、サンプルとは異なり、ほとんどの場合、「通常の」マスキングが行われます。おそらく、気にしないので、サンプル出力を通常の出力に変更してください。それはあなたの質問に実行されている、プラスの例の具体的あなたの第二の例
ビルWoodger

1
または、ランダムマスキングのボーナスがあります。
ɐɔıʇǝɥʇuʎs

回答:


12

GolfScript、26文字

特定の開示方法が指定されていないので、私は最短で行くことにしました。

:f,\`{{\)f%.!@42if}%\;n}+%

このコードはオンラインで試すことができます

例:

> "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 7
******G******N******U*****
*****F******M******T******
****E******L******S******Z
***D******K******R******Y*
**C******J******Q******X**
*B******I******P******W***
A******H******O******V****

コメントされたコード:

:f           # Save the second input to variable f
,            # Makes the array [0 1 2 .... f-1]
\`{          # \´{}+% builds a code block where
             # first the input string is pushed (done
             # via the + operator and afterwards the whole
             # block is applied to above array, i.e.
             # For each line 0, 1, ...                                                
             #   Here, the stack contains the line number (counter)
             #   and the string
  {          #   {}% -> map to each character of the string
             #     Stack contains counter and current character
    \)f%     #     Increase the counter by one and calculate modulo f
    .        #     Duplicate counter (will be used for the if below)
    !        #     and test for zero 
             #     I.e. if counter==0
    @        #       Then Current character
    42       #       Else 42 (which is '*')
    if       #     
  }%         #   The mapping operation masked most of the characters
  \;         #   Discard the counter
  n          #   Add newline
}+%      

いいね!コードの各部分が何をするのか説明してもらえますか?
ジョンオドム14

9
理由がわかりません。GolfScriptはとても自己文書化されています。
Evpok 14

@JohnOdomそれにもかかわらず、コードにいくつかのコメントを追加しました。
ハワード

すべての*を1つ右にシフトするかどうかをランダムに決定した場合、ランダムマスキングボーナスはカウントされますか?
ランチャー

7

PHP-80バイト

<?for(;($c=$argv[1][~-$i+=1])?:$k^++$j;)echo$c?$i%$k=&$argv[2]^$j?'*':$c:$i='
';

サンプル使用法:

$ php whistle-blower.php ABCDEFGHIJKLMNOPQRSTUVWXYZ 7
******G******N******U*****
A******H******O******V****
*B******I******P******W***
**C******J******Q******X**
***D******K******R******Y*
****E******L******S******Z
*****F******M******T******

7

Python(157 149 139 138-20 = 118):

def f(a,b):
 from random import*;c=[["*"]*len(a) for i in range(b)]
 for d in range(len(a)):choice(c)[d]=a[d]
 for e in c:print "".join(e)

安っぽいパイソン(55 35):

必要な配布を教えてくれませんでした;)

g=lambda a,b:["*"*len(a)]*(b-1)+[a]

ユニフォームパイソン(129 123 122):

def h(a,b):
 c=[["*"]*len(a)for i in range(b)]
 for d in range(len(a)):c=c[1:]+c[:1];c[0][d]=a[d]
 for e in c:print"".join(e)

出力:

a="Synthetica 'Evil' the Second"
b=7
f(a,b)
print
for i in g(a,b): print i
print
h(a,b)

与える

***t***i***'***** *********d
******************t** ******
******t*** ***********Se**n*
S**************l****e*******
*y******c***E************o**
**n*h****a**************c***
*****e*******vi*'**h********

****************************
****************************
****************************
****************************
****************************
****************************
Synthetica 'Evil' the Second

******t******v******e******d
S******i******i****** ******
*y******c******l******S*****
**n******a******'******e****
***t****** ****** ******c***
****h******'******t******o**
*****e******E******h******n*

安っぽいpythonはに短縮できますg=lambda a,b:[a]+["*"*len(a)]*(b-1)。:P
cjfaure 14

私は、感謝を:)見る@Trimsty
ɐɔıʇǝɥʇuʎs

3
私は思うが、確かに私はそれを完全に明確に書きたくないので、出力の各行で少なくとも1つの文字がマスクされていることを保証しない解決策を無効にします。
ハワード14

@Howard私はそれがルールを伸ばしていることを知っていますが、をdisclose the letters bit by bit意味することもできますfirst, disclose the first bit (that just happens to be the entire thing), repeat until the b is met。これは最初の回答でも発生する可能性があるため、その回答を使用したと主張するだけで、たまたまこの結果が生成されます。(ちょうど["*"*len(a)]*(b-1)+[a]0バイトの実際の情報を含むビットを開示することから始めて、最後の行で別のビットを開示するように、それをとして書くこともできることに気付きました。)最大に伸びています。
ɐɔıʇǝɥʇuʎs

3

Bash、80バイト

m=${1//?/*}
for((i=1;d=i*${#1}/$2,i++<=$2;c=d)){
echo "${m:0:c}${1:c:d-c}${m:d}"
}

動作中:

$ ./anon.sh stackoverflow.com 6
st ***************
** ack ************
***** ove *********
******** rfl ******
*********** ow。***
************** com
$ 

2

C#、226

ランダムなものをより単純な分布(モジュラスと考えて)に置き換えると、これは削減できますが、ランダム性が興味をひきました。=)

とにかく、すべてを1行に入れると226文字になります。読み取り可能なコードでは、次のようになります。

private void F(string n, int i)
{
    var l = n.Length;
    var r = new Random();
    var a = new string[i];

    for (var p = 0; p < l; p++)
    {
        var x = r.Next(0, i);
        for (var j = 0; j < i; j++)
        {
            a[j] += j == x ? n.Substring(p, 1) : "*";
        }
    }

    for (var j = 0; j < i; j++)
    {
        Console.WriteLine(a[j]);
    }
}

サンプル出力:

Anonymize.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ 7
*****F**I**********T**W***
A*****************S****X**
**CDE**H*JKL**************
*************N************
**************O*****U****Z
*B****G*****M***QR********
***************P*****V**Y*

少なくとも入力からの文字を常に保証しますか?
ビル・ウッドガー14

うーん、いや、おそらくそうではない。良いキャッチ。短い文字列と低い値のi場合、おそらくで終わる可能性があります***/test
デロビー

2

Perl、24

$_ x=<>;s/(.|
)./\1*/g

-p2バイトを占めるスイッチが必要です。STDINから読み取ります。

使い方

  • この-p切り替えのため、Perlは最初の入力嘘を読み取り、その内容をに保存し$_ます。

  • このコマンド$_ x=<>;は、2番目の入力行(<>)が指定する回数だけ、最初の入力行を複製します。

  • このコマンドs/(.|\n)./\1*/g;は2文字を消費し、2番目の文字(改行にすることはできません)をアスタリスクに置き換えます。のコンテンツ全体を消費するまでこれを行い$_ます。

    改行は最初の文字としてカウントされるため、最初の行のすべての偶数文字と残りの行のすべての奇数文字が難読化されます。

  • -pスイッチのため、Perlはの内容を出力します$_

入力例

codegolf
4

出力例

c*d*g*l*
*o*e*o*f
*o*e*o*f
*o*e*o*f

重複している文字列ではなく、非常にきれいな...
CSᵠ

入力をいじって2行で入力できると思ったのはなぜですか?
ビル・ウッドガー14

@BillWoodger:質問は入力の形式を指定しません。
デニス14

けっこうだ。could:-)を通過できます
ビル・ウッドガー14

Since newlines count as the first character, this will obfuscate all even characters on the first line and all odd characters on the remaining lines.失敗するようにcodegolf\n1
聞こえます

1

Java-490

ええ、実際にはゴルフなどではありません。まあ、ここにあります:

import java.util.ArrayList;public class Anonymise {public static void  main(String[] args){ArrayList[] c=new ArrayList[Integer.parseInt(args[1])];for(int i=0;i<c.length;i++)c[i]=new ArrayList();for(char a:args[0].toCharArray()){int f=new java.util.Random().nextInt(c.length);c[f].add(a);for(int i=0;i<c.length;i++)if(i!=f)c[i].add('*');}ArrayList<String> b = new ArrayList<String>();for(ArrayList a:c){String s = "";for(Object o : a)s += o;b.add(s);}for(String s : b)System.out.println(s);}}

読みやすい形式で:

import java.util.ArrayList;

public class Anonymise {

public static void main(String[] args){
    ArrayList[] c = new ArrayList[Integer.parseInt(args[1])];
    for(int i=0;i<c.length;i++)
        c[i]=new ArrayList();
    for(char a:args[0].toCharArray()){
        int f = new java.util.Random().nextInt(c.length);
        c[f].add(a);
        for(int i=0;i<c.length;i++)
            if(i!=f)c[i].add('*');
    }
    ArrayList<String> b = new ArrayList<String>();
    for(ArrayList a:c){
        String s = "";
        for(Object o : a)
            s += o;b.add(s);
    }
    for(String s : b)
        System.out.println(s);
}
}

使用例(コンパイルされたクラスから実行する場合)

> java Anonymise OnlinePerson 3
*n****P***o*
O*li***e****
****ne**rs*n

それを実行していますか、それとも入力していますか?Pはどのようにしてpになりますか?
ビル・ウッドガー14

問題ない。今使用されているコメントを片付けてください
ビルウッドガー14

ただ、import java.util.*また、ArrayList<String> = new ArrayList<>();動作します。多くのスペースを削除することもできます。ほとんどの場合、のList代わりに使用できますArrayList
Ypnypn 14

1

Python 3-187(-20 = 167)

書くのにしばらく時間がかかりましたが、おそらくもっとゴルフができるかもしれません。

import sys,random as a
b=sys.argv
x=[""for i in' '*int(b[2])]
for i in range(len(b[1])):n=a.randrange(len(x));x=[c+["*",b[1][len(c)]][j==n]for j,c in enumerate(x)]
for i in x:print(i)

サンプル使用法:

$ python tx.py super_anonymous_user 3
s******n**y*ou****e*
**p***a**n*m**s_us*r
*u*er_**o***********

関数として-161(-20 = 141)

from random import*
def f(c,n):
    x=[""for i in' '*n]
    for i in range(len(c)):n=randrange(len(x));x=[v+["*",c[len(v)]][j==n]for j,v in enumerate(x)]
    return x

少なくとも入力からの文字を常に保証しますか?
ビル・ウッドガー14

@BillWoodger番号
cjfaure 14

2
申し訳ありませんが、個人的にはそれが機能していないと考えています。その後。
ビル・ウッドジャー14

物事を短縮するいくつかの簡単な方法:sys.argv割り当てでアンパックし、xasとして初期化しますx=['']*int(b[2])b[2]アンパックで使用する変数の名前に置き換えます)。
user2357112は、Monica 14

2
私は思うが、確かに私はそれを完全に明確に書きたくないので、出力の各行で少なくとも1文字がマスクされていることを保証しない解決策を完全に無効にします。
ハワード14

1

C#184

namespace System.Linq{class P{static void Main(string[] a){int n=int.Parse(a[1]);for(int i=0;i<n;i++)Console.WriteLine(new String(a[0].Select((c,x)=>(i+x)%n==0?c:'*').ToArray()));}}}

非ゴルフ

namespace System.Linq
{
    class P
    {
        static void Main(string[] a)
        {
            int n = int.Parse(a[1]);
            for (int i = 0; i < n; i++)
                Console.WriteLine(new String(a[0].Select((c, x) => (i + x) % n == 0 ? c : '*').ToArray()));
        }
    }
}

サンプル:

> Anonymize.exe "qwertyuio" 4
q***t***o
***r***i*
**e***u**
*w***y***

1

Perl 6(77バイト)

これは不正行為としてカウントされる場合がありますが、問題は解決します(文字列を完全に出力するわけではありません)。

($_,$!)=@*ARGS;.say for .chop~"*","*"x.chars-1~.substr(*-1),"*"x.chars xx$!-2

そして、サンプル出力。

> ./script.p6 ultimately_awesome 6
ultimately_awesom*
*****************e
******************
******************
******************
******************

1

JavaScript-170

function s(a,e){o="",b=a.length,x=b/e|0,y=b-x*e;for(c=1;c<=e;c++){r="*";o+=Array((c-1)*x+1).join(r)+a.substr(c*x-x,c==e?x+y:x)+Array(c<e?b-c*x+1:0).join(r)+"\n"}return o}

簡単な方法は、名前を入力してキャラクターよりも多くのピースを要求すると中断しますが、そのポイントまでは1まで動作します。

編集:ブラケット(@Synthetica)を削除し、@ toothbrushからMath.floorを置き換えて(187から)さらにゴルフをしました。提案されたforループの変更は、出力にエラーをもたらします。


function s(d,a){o="";b=d.length;x=Math.floor(b/a);y=b-x*a;for(c=1;c<=a;c++)r="*",o+=Array((c-1)*x+1).join(r)+d.substr(c*x-x,c==a?x+y:x)+Array(c<a?b-c*x+1:0).join(r)+"\n";return o}; closure-compiler.appspot.com/homeは8文字を削除できました;)
–ıʇǝɥʇuʎs 14

テキストが5文字で、6つの置換が要求された場合、それは壊れていると言っていますか?
ビル・ウッドガー14

@BillWoodger彼は、クロージャーコンパイラを使用して、コードの全長から8文字を削ったと言っています。
エデュアルドフロリネスク14

@EduardFlorinescu、申し訳ありませんが、私ははっきりしていませんでした、私はこのビットを意味しましたbreaks if you supply a name and ask for more pieces than characters
ビル・

1
x=b/e|0代わりに使用しますx=Math.floor(b/e)。また、for(c=1;c<=e;c++)に短縮できますfor(c=1;c++<=e;)
歯ブラシ14

1

R、(120-20)= 100バイト(同じ長さの2つの異なるソリューション)

簡潔さのほかに、Rは確かに最高の乱数ジェネレーターを備えています!:)ここで、長さ120の最初のソリューション:

function(s,n){
  c=strsplit(s,"")[[1]]
  e=sample(n,nchar(s),T)
  sapply(1:n,function(i)paste(ifelse(e==i,c,"*"),collapse=""))
}

関数の名前が fの場合、出力は次のようになります。

> f("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 7)
"******GH*****************Z" 
"ABCD*********N************" 
"***********L**O***********"
"*********J**M**P*RS*U**X**" 
"**********K***********W***" 
"*****F**I*******Q*********"
"****E**************T*V**Y*"

そして、ここでも、ランダムマスキングを使用した120バイトの2番目のソリューションです。

function(s,n){
  x=matrix("*",n,(m=nchar(s)))
  x[cbind(sample(n,m,T),1:m)]=strsplit(s,"")[[1]]
  apply(x,1,paste,collapse="")
}

0

Scala(1)177バイト

RIでの解決策もScalaで解決策を見つけた後、次のようになります。

def f(s:String, n:Int)={
  def c=s map (z=>z.toString)
  def r=(1 to s.length) map (v=>v%n+1)
  (for (i<-1 to n) yield s zip r map (t=>if(t._2==i) t._1 else "*") mkString "") map println
}

Scala(2)129バイト

短い調査の後、メソッドzipWithIndexを見つけました。素晴らしい:)

def f(s:String, n:Int)={
  (for (i<-0 until n) yield s.zipWithIndex.map (t=>if(t._2 % n==i) t._1 else "*") mkString "") map println
}

ここで解決策:

f("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4)
***D***H***L***P***T***X**
A***E***I***M***Q***U***Y*
*B***F***J***N***R***V***Z
**C***G***K***O***S***W***

0

Javascript-166

function s(b,a){o="";k=Array(a).join("*");t=k+b+k;for(i=a;0<i;i--)o+=t.replace(RegExp(".{"+(a-1)+"}(.)","g"),k+"$1").substr(i-1,b.length)+"\n",t=t.substr(1);return o}

正規表現を使用します。

サンプル

> s("four",5)                      
f***                            
*o**                             
**u*                             
***r                             
****                             

> s("evil_company_that_makes_me_shiver",3)
e**l**o**a**_**a**m**e**m**s**v**
*v**_**m**n**t**t**a**s**e**h**e*
**i**c**p**y**h**_**k**_**_**i**r

0

k [50-20 = 30文字]

{.{@[y#"*";z;:;x z]}[x;c]'=_d*y%#d:<<(-d)?!d:c:#x}

説明

  1. 入力:x =マスクする必要がある文字列、y =行数
  2. 文字列の文字数cをカウントし、y個のバケットを作成します。
  3. 各バケットにc mod y文字を配置します。
  4. バケットごとに、そのバケットにない残りの番号に「*」を印刷します。

{.{@[y#"*";z;:;x z]}[x;c]'=_d*y%#d:<<(-d)?!d:c:#x}["abcdefghijklmnopqrstuvwxyz";4]

出力

"ab*d*f***j**********u*w***"
"**c*e*gh**k*****q*s*******"
"********i***mn*****t*v**y*"
"***********l**op*r*****x*z"

0

JavaScript-139-20 = 119

function e(s,c){r=[];for(i=c;i--;)r[i]='';for(i=0;i<s.length*c;i++)x=i%c,n=(x<1?Math.random()*c|0:n),r[x]+=(n!=x?'*':s[(i/c)|0]);return r}

使用法とサンプル出力:

console.log(e("evil_company_that_makes_me_shiver", 3));

["**i*_**mp*****h**_ma**********v**", 
 "*****co**a***t*a******s*me_*hi*e*", 
 "ev*l******ny_***t***ke*_***s****r"]

マスキングはランダムなので、出力は次のようにもなります。

console.log(e("evil_company_that_makes_me_shiver", 2));

["evil_company_that_makes_me_shiver", 
 "*********************************"]

0

ジュリア56-20 = 36(よく働く)

f(s,n)=[join([rand()<1.9/n?c:"*" for c in s]) for r=1:n]

julia> f("evilcompany!!!",4)
4-element Array{Union(UTF8String,ASCIIString),1}:
 "e**l**mp*ny*!*"
 "***lco********"
 "e*il**m*a*y!*!"
 "evil**m*an***!"

短いランダムソリューションを求めて、短いソリューションでは保証された機能を犠牲にすることにしました。それは本当に良い解決策ではありません。


0

F#-81 80 75

これは提供されている他のものとかなり似ています:

let a s n=[for i in 0..n-1->String.mapi(fun j c->[c;'*'].[min((j+i)%n)1])s]

サンプル:

a "evil_company_that_makes_me_shiver" 7

e******m******h******e******h**** 
******o******t******k******s***** 
*****c******_******a******_****** 
****_******y******m******e******r 
***l******n******_******m******e* 
**i******a******t******_******v** 
*v******p******a******s******i*** 

完全なスタンドアロンアプリケーションとして、160 155 156文字になります。

[<EntryPoint>]let m (a:string array)=
 let n=System.Int32.Parse a.[1]
 for i in 0..n-1 do printfn"%s"(String.mapi(fun j c->[c;'*'].[min((j+i)%n)1])a.[0])
 0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.