익명의 이름-일종의


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.