Анонимизировать имена - своего рода


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
Вы не даете подробностей о том, как должно происходить маскирование, поэтому вы должны получить любой самый короткий код, независимо от ваших примеров.
— Билл Вуджер,

Я думал, что было ясно, что выигрывает самый короткий код? Хммм, может быть, мне нужно улучшить мою грамматику английского языка в соответствии с этим :( / Edit: мне действительно все равно, как выполняется маскировка, приведенное выше является лишь примером, но оно должно быть «нечитаемым», если вы прочитаете одно соответствие один "
— german_guy

Да, самый короткий код был понятен. Но вы будете в основном получать "обычную" маскировку, а не как ваши образцы. Возможно, так как вы все равно не возражаете, измените ваши выходные данные на обычные. В частности, ваш второй пример запуска, плюс пример в вашем вопросе
— Билл Вуджер,

1
Или вы можете получить бонус за случайную маскировку.
— Aprıʇǝɥʇ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
}+%      

Ницца! Не могли бы вы объяснить, что делает каждая часть кода?
— Джон Одом

9
Не могу понять почему. GolfScript настолько самодокументирован.
— Евпок

@JohnOdom Тем не менее я добавил несколько комментариев к коду.
— Говард

если вы случайным образом решите, хотите ли вы сдвинуть все * на один вправо, будет ли это учитываться бонус случайного маскирования?
— 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

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*

Ваш сырный питон может быть сокращен до g=lambda a,b:[a]+["*"*len(a)]*(b-1). : P
— cjfaure

@Trimsty Я вижу, спасибо :)
— Aprıʇǝɥʇuʎs

3
Я думаю, но, конечно, я не хочу, чтобы это было изложено совершенно ясно, лишает законной силы решение, которое не гарантирует, что по крайней мере один символ маскируется в каждой строке вывода.
— Говард

@ Как я знаю, это растягивает правила, но 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 байтов фактической информации, а в последней строке вы раскроете еще один бит.) Однако я понимаю, что это растягивается до макс.
— Aprıʇǝɥʇ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
ул ***************
** извед ************
***** ********* Ове
******** ****** RFL
*********** вл. ***
************** ком
$ 

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.
— Дероби

2

Perl, 24

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

Требуется -pпереключатель, который составляет два байта. Читает из 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ᵠ

Что заставило вас думать, что вы можете возиться с вводом, чтобы он был в двух строках?
— Билл Вуджер,

@BillWoodger: Вопрос не указывает форму ввода.
— Деннис

Справедливо. couldпропускает :-)
— Билл Вуджер,

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?
— Билл Вуджер,

Нет проблем. Просто уберите использованные комментарии прямо сейчас
— Билл Вуджер,

Так же 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

Всегда ли это гарантирует хотя бы символ на входе?
— Билл Вуджер,

@BillWoodger Нет.
— cjfaure

2
Извините, лично я считаю, что это не работает тогда. тогда.
— Билл Вуджер,

Несколько простых способов сократить вещи: распаковать sys.argvв присваивании и инициализировать xкак x=['']*int(b[2])(с b[2]заменой на то, что вы называете переменной, которую вы используете при распаковке).
— user2357112 поддерживает Monica

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()));}}}

Non-golfed

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) и заменой Math.floor из @toothbrush. Для изменения цикла, как предложено, ошибки в выводе.


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 символов;)
— Aprıʇǝɥʇuʎs

Вы говорите, если текст состоит из пяти символов, и его просят о шести заменах, которые он ломает?
— Билл Вуджер,

@BillWoodger Он сказал, что используя компилятор замыкания, он выбрал 8 символов из общей длины кода.
— Эдуард Флоринеску

@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;).
— Зубная щетка

1

R, (120-20) = 100 байт (2 разных решения одинаковой длины)

Помимо краткости, R наверняка обладает лучшим генератором случайных чисел! :) Вот 1-е решение длиной 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

к [50-20 = 30 символов]

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

объяснение

  1. Ввод: x = строка, которая должна быть замаскирована, y = количество строк
  2. Подсчитайте количество символов c в строке и создайте y сегментов.
  3. Поместите модные символы в каждое ведро.
  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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.