Анонімізувати імена - сорт


16

Редагувати: Буде бонус -20 за випадкове маскування

Здрастуйте, товариші, що передають таємні знання.

Мені належить інтерв'ю поштою, і я, звичайно, не можу сказати конкретні імена в повну довжину. Але оскільки я хочу розкрити це досить не дуже очевидним чином, мені потрібна ваша допомога.

Я надам ці імена у формі

"злий_комплект_тхат_макес_ме_шир"

але, безумовно, я не хочу це повністю викладати. Ваше завдання допомогти мені та всьому світу полягає в тому, щоб ви надали приємну програму, яка перетворює вищесказане

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

або

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

або навіть

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

Я думаю, ти це отримаєш. Але є один недолік: я хочу розкрити ім’я в цілому, тому мені потрібно передати кількість скриптів і саме слово до сценарію, і воно розкриє букви побіжно. Прикладом може бути

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

або

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

або

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

Сподіваюся, ви можете мені допомогти, і як ми знаємо, що розмір має значення, найкоротший виграє код. Допоможіть зробити цей світ кращим місцем!


1
Ви не даєте деталей про те, як має відбуватися маскування, тому ви повинні отримати найкоротший код, незалежно від ваших прикладів.
Білл Вудгер

Я думав, що зрозуміло, що найкоротший код виграє? Гммм, можливо, мені потрібно вдосконалити свою англійську граматику відповідно до цього :( / Редагувати: Мені дуже не важливо, як робиться маскування ist, наведене вище є лише прикладом, але це має бути "нечитабельним", якщо ви прочитаєте один припис поодинці »
german_guy

Так, найкоротший код був зрозумілий. Але ви здебільшого отримаєте "регулярне" маскування, не так, як ваші зразки. Можливо, оскільки ви все одно не заперечуєте, змініть свої вибірки на звичайні. Зокрема, ваш другий приклад запуску, а також приклад у вашому запитанні
Білл Вудджер

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

Приємно! Чи можете ви пояснити, що робить кожна частина коду?
Джон Одом

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

Пітон ( 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 Я знаю, що це розтягування правил, але 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 ************
***** над *********
******** 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

Перл, 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 No.
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()));}}}

Не гольф

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 символів;)
ɐɔıʇǝɥʇ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*"

І ось 2-е рішення, знову з випадковим маскуванням, і знову 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 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.