익명의 이름-일종의


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

가장 짧은 코드가이기는 것이 분명하다고 생각 했습니까? 흠, 어쩌면 나는 이것에 따라 영어 문법을 향상시켜야 할 수도 있습니다 : alone "
german_guy

예, 가장 짧은 코드는 분명했습니다. 그러나 샘플과 달리 대부분 "일반적인"마스킹을받습니다. 어쨌든 마음에 들지 않기 때문에 샘플 출력을 일반 출력으로 변경하십시오. 특히 실행중인 두 번째 예와 질문의 예
Bill 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
}+%      

좋은! 코드의 각 부분이 무엇을하는지 설명해 주시겠습니까?
John Odom

9
이유를 알 수 없습니다. GolfScript는 자체 문서화입니다.
Evpok

@JohnOdom 그럼에도 불구하고 코드에 주석을 추가했습니다.
Howard

모든 *를 오른쪽으로 오른쪽으로 옮길 지 여부를 무작위로 결정하면 무작위 마스킹 보너스로 간주됩니까?
Cruncher

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)

치즈 파이톤 ( 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*

치즈 비가 짧아 질 수 있습니다 g=lambda a,b:[a]+["*"*len(a)]*(b-1). : P
cjfaure

@Trimsty 감사합니다. :)
ɐɔıʇǝɥʇuʎs

3
나는 생각 하지만 분명히 그것을 철자하고 싶지 는 않지만 적어도 하나의 문자가 각 출력 줄에 마스킹되도록 보장하지 않는 솔루션을 완전히 무효화합니다.
Howard

@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

배쉬, 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*

적어도 입력에서 항상 문자를 보장합니까?
Bill Woodger

흠 .. 아마 아닐 것이다. 잘 잡는다. 짧은 문자열과 낮은 값의 경우 i아마으로 끝날 수 있습니다 ***/test.
deroby

2

펄, 24

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

-p2 바이트를 차지하는 스위치가 필요합니다 . STDIN에서 읽습니다.

작동 원리

  • -p스위치로 인해 Perl은 첫 번째 입력 거짓말을 읽고 그 내용을에 저장합니다 $_.

  • 이 명령 $_ 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ᵠ

두 줄로 입력하기 위해 입력을 엉망으로 만들 수 있다고 생각한 이유는 무엇입니까?
Bill Woodger

@BillWoodger : 질문은 입력 형식을 지정하지 않습니다.
Dennis

그럴 수 있지. 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

자바-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

문제 없어요. 사용 된 의견을 정리하십시오
Bill Woodger

그냥 import java.util.*또한, ArrayList<String> = new ArrayList<>();작동합니다. 많은 공간을 제거 할 수도 있습니다. 그리고 대부분의 경우 List대신 대신 사용할 수 있습니다 ArrayList.
Ypnypn

1

파이썬 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

@BillWoodger No.
cjfaure

2
미안, 개인적으로 나는 그것이 작동하지 않는 것으로 간주합니다. 그때.
Bill Woodger

sys.argv과제 를 단축하는 몇 가지 간단한 방법 : 과제에서 압축을 풀고 다음 과 같이 초기화 x합니다 x=['']*int(b[2])( b[2]포장 풀기에서 사용하는 변수 이름 으로 대체 됨).
user2357112는 Monica

2
나는 생각 하지만 분명히 그것을 철자하고 싶지 는 않지만 적어도 하나의 문자가 각 출력 줄에 마스킹되도록 보장하지 않는 솔루션을 완전히 무효화합니다.
Howard

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

펄 6 (77 바이트)

이것은 부정 행위로 간주 될 수 있지만 문제를 해결합니다 (문자열이 완전히 인쇄되지는 않음).

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

그리고 샘플 출력.

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

1

자바 스크립트-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까지 작동합니다.

편집 : @toothbrush에서 대괄호 (@Synthetica) 및 Math.floor 교체를 제거하여 (187에서) 더 골프를 치십시오. 제안 된 루프 변경의 경우 출력에 오류가 발생합니다.


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

텍스트가 5 자이고 6 번의 교체가 필요한지 말입니까?
Bill Woodger

@BillWoodger 그는 폐쇄 컴파일러를 사용하여 코드의 전체 길이에서 8자를 깎았다고 말합니다.
Eduard Florinescu

@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 바이트 (같은 길이의 두 가지 다른 솔루션)

간결함 외에도 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

스칼라 (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
}

스칼라 (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

자바 스크립트-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

자바 스크립트-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

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