Anonimizza i nomi - una specie di


16

Modifica: ci sarà un bonus di -20 per il mascheramento casuale

Salve compagni informatori e portatori di conoscenza segreta.

Sono dovuto a un colloquio per posta e io - ovviamente - non posso dire nomi specifici per intero. Ma siccome voglio rivelarlo in un modo non abbastanza ovvio, ho bisogno del tuo aiuto.

Fornirò questi nomi sotto forma di

"Evil_company_that_makes_me_shiver"

ma sicuramente non voglio spiegarlo completamente. Il tuo compito di aiutare me e il mondo intero è quello di fornire un bel programma che trasformi quanto sopra in

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

o

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

o anche

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

Penso che tu l'abbia capito. Ma c'è un difetto: voglio rivelare il nome in totale, quindi devo passare il numero di occorrenze e la parola stessa allo script e rivelerà le lettere poco a poco. Un esempio potrebbe essere

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

o

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

o

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

Spero che tu mi possa aiutare e come sappiamo che le dimensioni contano vince il codice più corto. Aiuta a rendere questo mondo un posto migliore!


1
Non fornisci dettagli su come dovrebbe avvenire il mascheramento, quindi dovresti ottenere qualunque sia il codice più breve, indipendentemente dai tuoi esempi.
Bill Woodger,

Ho pensato che fosse chiaro che il codice più corto vince? Hmmm, forse dovrei migliorare la mia grammatica inglese in base a questo :( / Modifica: non mi interessa davvero come è fatto il mascheramento, quanto sopra è solo un esempio, ma dovrebbe essere "illeggibile" se leggi un'accorrenza da solo "
german_guy,

Sì, il codice più breve era chiaro. Ma otterrai principalmente mascheramenti "regolari", non come i tuoi campioni. Forse, dato che non ti dispiace comunque, cambiare i tuoi output di esempio con quelli normali. In particolare il tuo secondo esempio di esecuzione, oltre all'esempio nella tua domanda
Bill Woodger

1
Oppure potresti ottenere un bonus per il mascheramento casuale.
ɐɔıʇǝɥʇuʎs

Risposte:


12

GolfScript, 26 caratteri

Poiché non è stato specificato alcun modo specifico di divulgazione, ho deciso di scegliere il più breve:

:f,\`{{\)f%.!@42if}%\;n}+%

Puoi provare questo codice online .

Esempio:

> "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****

Codice commentato:

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

Bello! Potresti spiegare cosa fa ogni parte del codice?
John Odom,

9
Non riesco a capire perché. GolfScript è così auto-documentante.
Evpok,

@JohnOdom Tuttavia ho aggiunto alcuni commenti al codice.
Howard,

se decidi a caso se spostare o meno tutti gli * di uno a destra, questo conta per il bonus di mascheramento casuale?
Cruncher,

7

PHP - 80 byte

<?for(;($c=$argv[1][~-$i+=1])?:$k^++$j;)echo$c?$i%$k=&$argv[2]^$j?'*':$c:$i='
';

Esempio di utilizzo:

$ 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)

Cheesy Python ( 55 35):

Non mi hai detto la distribuzione richiesta;)

g=lambda a,b:["*"*len(a)]*(b-1)+[a]

Pitone uniforme ( 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)

Produzione:

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*

Il tuo pitone di formaggio può essere abbreviato g=lambda a,b:[a]+["*"*len(a)]*(b-1). : P
cjfaure,

@Trimsty Vedo, grazie :)
ɐɔıʇǝɥʇuʎs

3
Penso, ma sicuramente non voglio spiegarlo chiaramente invalida chiaramente una soluzione che non garantisce che almeno un carattere sia mascherato in ogni riga di output.
Howard,

@Howard so che sta allungando le regole, ma disclose the letters bit by bitpuò anche significare first, disclose the first bit (that just happens to be the entire thing), repeat until the b is met. Questo può accadere anche per la prima risposta, quindi basta affermare di averlo usato e che sarà felice di produrre questo risultato. (Mi sono appena reso conto che potresti anche scriverlo come ["*"*len(a)]*(b-1)+[a], in modo da iniziare a rivelare bit che contengono appena 0 byte di informazioni effettive e, nell'ultima riga, divulgare un altro bit.) Tuttavia, mi rendo conto che questo si sta allungando al massimo.
3ıʇǝɥʇuʎs

3

Bash, 80 byte

m=${1//?/*}
for((i=1;d=i*${#1}/$2,i++<=$2;c=d)){
echo "${m:0:c}${1:c:d-c}${m:d}"
}

In azione:

$ ./anon.sh stackoverflow.com 6
st ***************
** ack ************
***** ove *********
******** RFL ******
*********** ow. ***
************** com
$ 

2

C #, 226

Questo può essere ridotto se sostituisci le cose casuali con una distribuzione più semplice (pensa al modulo) ma la casualità è ciò che mi ha interessato. =)

Ad ogni modo, mettendo tutto su una sola riga ottengo 226 caratteri. Nel codice leggibile si presenta così:

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

Uscita campione:

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*

Garantisce sempre almeno il carattere dell'input?
Bill Woodger,

Hmm .. no, probabilmente no; buona pesca. Per stringhe brevi e valori bassi di ite probabilmente potresti finire con ***/test.
derby il

2

Perl, 24

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

Richiede l' -popzione, che rappresenta due byte. Legge da STDIN.

Come funziona

  • A causa -pdell'opzione, Perl legge la prima bugia di input e ne memorizza il contenuto $_.

  • Il comando $_ x=<>;duplica la prima riga di input il numero di volte specificato dalla seconda riga di input ( <>).

  • Il comando s/(.|\n)./\1*/g;consuma due caratteri e sostituisce il secondo (che non può essere una nuova riga) con un asterisco. Lo fa fino a quando non ha consumato l'intero contenuto di $_.

    Dato che le nuove righe contano come primo carattere, ciò offuscherà tutti i caratteri pari sulla prima riga e tutti i caratteri dispari sulle righe rimanenti.

  • A causa -pdell'opzione, Perl stampa il contenuto di $_.

Esempio di input

codegolf
4

Esempio di output

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

stringhe duplicate, non molto pulite ...
CSᵠ

Cosa ti ha fatto pensare di poter scherzare con l'input per averlo su due righe?
Bill Woodger,

@BillWoodger: la domanda non specifica alcuna forma di input.
Dennis,

Giusto. couldti fa passare :-)
Bill Woodger il

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.Sembra che falliràcodegolf\n1
Cruncher

1

Java - 490

Sì, non ho davvero giocato a golf o altro. Oh bene, eccolo qui:

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

In un formato piacevole e leggibile:

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

Utilizzo di esempio (quando eseguito dalla classe compilata)

> java Anonymise OnlinePerson 3
*n****P***o*
O*li***e****
****ne**rs*n

Lo stai eseguendo o digitando? Come diventa P?
Bill Woodger,

Nessun problema.
Metti in

Funzionerà import java.util.*anche ArrayList<String> = new ArrayList<>();. Puoi anche rimuovere molti spazi. E la maggior parte delle volte, puoi usare al Listposto di ArrayList.
Ypnypn,

1

Python 3 - 187 (-20 = 167)

Mi ci è voluto un po 'di tempo per scrivere, probabilmente avrei potuto giocare di più.

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)

Esempio di utilizzo:

$ python tx.py super_anonymous_user 3
s******n**y*ou****e*
**p***a**n*m**s_us*r
*u*er_**o***********

Come funzione - 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

Garantisce sempre almeno il carattere dell'input?
Bill Woodger,

@BillWoodger No.
cjfaure,

2
Mi dispiace, personalmente lo considero come non funzionante allora. poi.
Bill Woodger,

Alcuni semplici modi per abbreviare le cose: decomprimere sys.argvnell'assegnazione e inizializzare xcome x=['']*int(b[2])(con b[2]sostituito da qualunque sia il nome della variabile che si utilizza nel disimballaggio).
user2357112 supporta Monica

2
Penso, ma sicuramente non voglio spiegarlo chiaramente invalida chiaramente una soluzione che non garantisce che almeno un carattere sia mascherato in ogni riga di output.
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()));}}}

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

Campione:

> Anonymize.exe "qwertyuio" 4
q***t***o
***r***i*
**e***u**
*w***y***

1

Perl 6 (77 byte)

Questo può essere considerato un imbroglio, ma risolve il problema (non stampa interamente la stringa).

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

E l'output di esempio.

> ./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}

Uno veloce, si interrompe se si fornisce un nome e si chiedono più pezzi che personaggi, ma funziona fino a quel punto e fino a 1. Potrebbe essere giocato a golf più presumo, quindi potrebbe rivedere o dare consigli, in quanto è un po 'un casino.

Modifica: golfato ulteriormente (dal 187) con rimozione delle parentesi (@Synthetica) e sostituzione Math.floor da @toothbrush. La modifica del loop come suggerito provoca errori nell'output.


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}; closing-compiler.appspot.com/home è stato in grado di radere 8 caratteri;)
3ıʇǝɥʇuʎs

Stai dicendo che se il testo è composto da cinque caratteri e viene richiesto di sostituire sei caratteri?
Bill Woodger,

@BillWoodger Sta dicendo che usando il compilatore di chiusura ha rasato 8 caratteri dalla lunghezza totale del codice.
Eduard Florinescu,

@EduardFlorinescu, scusa, non ero chiaro, intendevo questo pezzobreaks if you supply a name and ask for more pieces than characters
Bill Woodger

1
Usa x=b/e|0invece di x=Math.floor(b/e). Inoltre, for(c=1;c<=e;c++)può essere abbreviato in for(c=1;c++<=e;).
Spazzolino da denti

1

R, (120-20) = 100 byte (2 diverse soluzioni della stessa lunghezza)

Oltre alla concisione, R offre sicuramente il miglior generatore di numeri casuali! :) Ecco la prima soluzione di lunghezza 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=""))
}

Se la funzione è denominata f , l'output appare come:

> f("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 7)
"******GH*****************Z" 
"ABCD*********N************" 
"***********L**O***********"
"*********J**M**P*RS*U**X**" 
"**********K***********W***" 
"*****F**I*******Q*********"
"****E**************T*V**Y*"

E qui la seconda soluzione, sempre con mascheramento casuale, e di nuovo 120 byte:

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 byte

Dopo che la soluzione in RI ne ha trovata anche una a Scala, eccola qui:

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 byte

Dopo una breve ricerca ho trovato il metodo zipWithIndex . Meraviglioso :)

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
}

Ecco la soluzione:

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}

Usando regex.

Campione

> 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 caratteri]

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

Spiegazione

  1. Input: x = stringa che deve essere mascherata, y = numero di righe
  2. Contare il numero di caratteri c nella stringa e creare y secchi.
  3. Posiziona i caratteri mod in ciascun secchio.
  4. Per ogni bucket, stampa "*" per i numeri rimanenti non presenti in quel bucket.

Esempio

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

Produzione

"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}

Utilizzo e output di esempio:

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"]

Poiché il mascheramento è casuale, l'output può anche apparire così:

console.log(e("evil_company_that_makes_me_shiver", 2));

["evil_company_that_makes_me_shiver", 
 "*********************************"]

0

Julia 56-20 = 36 (lavora spesso)

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***!"

Cercando una soluzione casuale più breve, ho deciso di sacrificare il funzionamento garantito per una soluzione più breve. Non è davvero un'ottima soluzione.


0

F # - 81 80 75

Questo è abbastanza simile ad altri che sono stati offerti:

let a s n=[for i in 0..n-1->String.mapi(fun j c->[c;'*'].[min((j+i)%n)1])s]

Campione:

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*** 

Come applicazione completa e indipendente, arriva a 160 155 156 caratteri:

[<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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.