匿名命名-有点


16

编辑:随机蒙版会有-20的奖励

告密者和您好,秘密知识的载体。

我是通过邮寄方式接受采访的,我当然不能说完整的具体姓名。但是,由于我想以一种不太明显的方式进行披露,因此需要您的帮助。

我将以以下形式提供这些名称:

“ evil_company_that_makes_me_shiver”

但我当然不想完全说明。您为我和整个世界提供帮助的任务是,您提供一个不错的程序,将上述内容转化为

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

要么

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

甚至

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

我想你明白了。但是有一个缺陷:我想完全公开名称,所以我需要将出现的次数和单词本身传递给脚本,它会一点一点地公开字母。一个例子可能是

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

要么

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

要么

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

希望您能对我有所帮助,并且我们知道大小很重要,因此最短的代码获胜。帮助使这个世界变得更美好!


1
您没有提供有关如何进行屏蔽的详细信息,因此无论您的示例如何,都应获取最短的代码。
Bill Woodger

我以为很显然,最短的代码会胜出?嗯,也许我需要根据这个来改进我的英语语法:( /编辑:我不太在乎掩饰主义是如何完成的,以上只是一个例子,但是如果您读过一个错误,应该是“不可读的”一个人”
german_guy 2014年

是的,最短的代码很清楚。但是您通常会获得“常规”遮罩,而不是像样本一样。也许,由于您仍然不介意,因此请将示例输出更改为常规输出。具体来说就是您正在运行的第二个示例,再加上问题中的示例
Bill Woodger

1
或者,您也可以为随机掩膜加分。
ɐɔıʇǝɥʇuʎs

Answers:


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
}+%      

真好!您能解释一下代码的每个部分做什么吗?
约翰·奥多姆2014年

9
不明白为什么。GolfScript具有自记录功能。
Evpok

@JohnOdom尽管如此,我还是在代码中添加了一些注释。
霍华德

如果您随机决定是否将所有*向右移一位,那么这是否算作随机掩盖奖金?
Cruncher 2014年

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

蟒(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)

俗气的python(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

@Trimsty我知道了,谢谢:)
ɐɔıʇǝɥʇuʎs

3
我认为但可以肯定的是,我不想完全将其拼写清楚,这会使解决方案无效,该解决方案不能确保在输出的每一行中至少掩盖一个字符。
2014年

@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
圣***************
** ack ************
***** ove *********
******** rfl ******
***********现在。***
************** com
$ 

2

C#,226

如果您用更简单的分布(认为模量)代替随机填充物,则可以减少这种情况,但是随机性是引起我兴趣的。=)

无论如何,将所有内容放在一行上,我得到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*

是否始终保证至少在输入字符上?
比尔·伍德格

嗯..不,可能不是;接得好。对于短字符串和较低的值,i您可能最终会得到***/test
deroby 2014年

2

Perl,24岁

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

需要-p开关,该开关占两个字节。从STDIN读取。

怎么运行的

  • 由于-p切换,Perl读取第一个输入lie并将其内容存储在中$_

  • 该命令$_ x=<>;将第二条输入行(<>)指定的次数复制第一条输入行。

  • 该命令使用s/(.|\n)./\1*/g;两个字符,并用星号替换第二个字符(不能是换行符)。它将执行此操作,直到耗尽了的全部内容$_

    由于换行符是第一个字符,因此这将混淆第一行中的所有偶数字符和其余行中的所有奇数字符。

  • 由于-p切换,Perl将打印的内容$_

输入示例

codegolf
4

输出示例

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

重复的字符串,不是很干净...
CSᵠ

是什么让您认为您可以弄乱输入内容以将其分成两行?
比尔·伍德格

@BillWoodger:该问题未指定输入形式。
丹尼斯

很公平。could让您通过:-)
Bill Woodger

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
Cruncher

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?
比尔·伍德格

没问题。现在就整理一下使用过的评论吧
Bill Woodger

只是import java.util.*ArrayList<String> = new ArrayList<>();将工作。您也可以删除很多空格。在大多数情况下,您可以使用List代替ArrayList
Ypnypn 2014年

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

是否始终保证至少在输入字符上?
Bill Woodger 2014年

@BillWoodger号
cjfaure

2
抱歉,我个人认为当时不起作用。然后。
比尔·伍德格

一些简单的方法可以缩短内容:sys.argv在分配中解压缩,并初始化xx=['']*int(b[2])(用b[2]您在解压缩中使用的变量命名的任何东西替换)。
user2357112支持Monica 2014年

2
我认为但可以肯定的是,我不想完全将其拼写清楚,这会使解决方案无效,该解决方案不能确保在输出的每一行中至少掩盖一个字符。
霍华德

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。我认为可以打更多的高尔夫,因此可能会修改或提建议,因为这有点混乱。

编辑:进一步打高尔夫球(从187开始),并取消了括号(@Synthetica),并从@toothbrush替换Math.floor。对于建议的循环更改会导致输出错误。


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ʎs2014年

您是说文本是否为五个字符,并且要求替换六个字符?
比尔·伍德格

@BillWoodger他说,使用闭包编译器,他从代码的总长度中减少了8个字符。
Eduard Florinescu 2014年

@EduardFlorinescu,对不起,我不清楚,我的意思是breaks if you supply a name and ask for more pieces than characters
Bill Woodger

1
使用x=b/e|0代替x=Math.floor(b/e)。另外,for(c=1;c<=e;c++)可以缩短为for(c=1;c++<=e;)
牙刷

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字节长:

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字符。
  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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.