Anonimkan nama - semacam

16

Sunting: Akan ada bonus -20 untuk masking acak

Halo sesama Pelapor dan pembawa pengetahuan rahasia.

Saya akan diwawancarai melalui surat dan saya - tentu saja - tidak dapat menyebutkan nama tertentu secara lengkap. Tetapi karena saya ingin mengungkapkannya dengan cara yang agak tidak terlalu jelas saya membutuhkan bantuan Anda.

Saya akan memberikan nama-nama ini dalam bentuk

"evil_company_that_makes_me_shiver"

tapi tentu saja saya tidak ingin mengejanya sepenuhnya. Tugas Anda untuk membantu saya dan seluruh dunia adalah Anda menyediakan program yang bagus yang mengubah hal di atas menjadi

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

atau

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

atau bahkan

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

Saya pikir Anda mengerti. Tapi ada satu kelemahan: Saya ingin mengungkapkan nama secara total, jadi saya perlu menyampaikan jumlah kemunculan dan kata itu sendiri ke skrip dan itu akan mengungkapkan huruf sedikit demi sedikit. Contohnya bisa

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

atau

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

atau

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

Saya harap Anda dapat membantu saya dan seperti yang kita ketahui bahwa ukuran penting kode menang. Bantu menjadikan dunia ini tempat yang lebih baik!

german_guy
sumber
1
Anda tidak memberikan detail tentang bagaimana masking seharusnya terjadi, jadi Anda harus mendapatkan kode tersingkat apa pun, tidak peduli contoh Anda.
Bill Woodger
Saya pikir jelas bahwa kode terpendek menang? Hmmm, mungkin saya perlu meningkatkan tata bahasa Inggris saya sesuai dengan ini :( / Sunting: Saya tidak terlalu peduli tentang bagaimana penyamaran dilakukan, contoh di atas hanyalah sebuah contoh, tetapi seharusnya "tidak terbaca" jika Anda membaca satu akorensi sendirian "
german_guy
Ya, kode terpendek jelas. Tetapi Anda sebagian besar akan mendapatkan masking "biasa", tidak seperti sampel Anda. Mungkin, karena Anda tidak keberatan, ubah output sampel Anda menjadi yang biasa. Khususnya contoh kedua untuk menjalankannya, ditambah contoh dalam pertanyaan Anda
Bill Woodger
1
Atau Anda bisa mendapat bonus untuk masking acak.
Aprıʇǝɥʇu

Jawaban:

12

GolfScript, 26 karakter

Karena tidak ada cara pengungkapan khusus yang ditentukan, saya memutuskan untuk mengambil jalan terpendek:

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

Anda dapat bereksperimen dengan kode ini secara online .

Contoh:

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

Kode yang dikomentari:

: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
}+%      
Howard
sumber
Bagus! Bisakah Anda menjelaskan apa yang dilakukan setiap bagian kode?
John Odom
9
Tidak bisa melihat mengapa GolfScript sangat mendokumentasikan diri.
Evpok
@JohnOdom Namun saya menambahkan beberapa komentar ke kode.
Howard
jika Anda memutuskan secara acak apakah Anda akan menggeser semua * satu per satu ke kanan, apakah itu termasuk dalam bonus masking acak?
Cruncher
7

PHP - 80 byte

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

Penggunaan sampel:

$ 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******
primo
sumber
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)

Python keju ( 55 35):

Anda tidak memberi tahu saya distribusi yang diperlukan;)

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

Python seragam ( 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)

Keluaran:

a="Synthetica 'Evil' the Second"
b=7
f(a,b)
print
for i in g(a,b): print i
print
h(a,b)

memberi

***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*
ɐɔıʇǝɥʇu
sumber
Python murahan Anda dapat disingkat menjadi g=lambda a,b:[a]+["*"*len(a)]*(b-1). : P
cjfaure
@Trimsty saya mengerti, terima kasih :)
Aprıʇǝɥʇuʎs
3
Saya pikir tapi pasti saya tidak ingin menjelaskannya dengan jelas membatalkan solusi yang tidak memastikan bahwa setidaknya satu karakter disembunyikan di setiap baris output.
Howard
@Howard Saya tahu itu adalah peregangan aturan, tetapi disclose the letters bit by bitjuga bisa berarti first, disclose the first bit (that just happens to be the entire thing), repeat until the b is met. Ini juga dapat terjadi untuk jawaban pertama, jadi klaim saja Anda menggunakan yang itu, dan cukup senang untuk menghasilkan hasil ini. (Saya baru sadar bahwa Anda juga dapat menuliskannya ["*"*len(a)]*(b-1)+[a], sehingga Anda mulai dengan mengungkapkan bit yang kebetulan mengandung 0 byte informasi aktual, dan pada baris terakhir, Anda mengungkapkan bit lain.) Namun saya menyadari, bahwa ini membentang ke max.
ɐɔıʇǝɥʇuʎ
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}"
}

Dalam aksi:

$ ./anon.sh stackoverflow.com 6
st *****************
** ACK ************
***** ove *********
******** rfl ******
*********** Ow. ***
************** com
$ 
digital Trauma
sumber
2

C #, 226

Ini dapat dipangkas jika Anda mengganti hal-hal acak dengan distribusi yang lebih sederhana (pikirkan modulus) tetapi keacakan itulah yang membuat saya tertarik. =)

Ngomong-ngomong, menempatkan semuanya pada satu baris saja, saya mendapatkan 226 karakter. Dalam kode yang mudah dibaca terlihat seperti ini:

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

Output sampel:

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*
Deroby
sumber
Apakah itu menjamin setidaknya pada karakter dari input selalu?
Bill Woodger
Hmm .. tidak, mungkin tidak; tangkapan yang bagus. Untuk string pendek dan nilai rendah dari iAnda mungkin bisa berakhir dengan ***/test.
deroby
2

Perl, 24

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

Membutuhkan -psakelar, yang menyumbang dua byte. Baca dari STDIN.

Bagaimana itu bekerja

  • Karena -pswitch, Perl membaca kebohongan input pertama dan menyimpan isinya $_.

  • Perintah $_ x=<>;menduplikasi baris input pertama berapa kali baris input kedua ( <>) menentukan.

  • Perintah s/(.|\n)./\1*/g;mengkonsumsi dua karakter dan menggantikan yang kedua (yang tidak bisa menjadi baris baru) dengan tanda bintang. Ini melakukan ini sampai telah menghabiskan seluruh konten $_.

    Karena baris baru dihitung sebagai karakter pertama, ini akan mengaburkan semua karakter genap di baris pertama dan semua karakter aneh di baris yang tersisa.

  • Karena -pberalih, Perl mencetak konten $_.

Contoh input

codegolf
4

Contoh output

c*d*g*l*
*o*e*o*f
*o*e*o*f
*o*e*o*f
Dennis
sumber
duplikat string, tidak sangat bersih ...
CSᵠ
Apa yang membuat Anda berpikir Anda bisa dipusingkan dengan input untuk memilikinya di dua baris?
Bill Woodger
@ BillWoodger: Pertanyaan tidak menentukan bentuk input.
Dennis
Cukup adil. couldmemungkinkan Anda melalui :-)
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. Sepertinya itu akan gagal codegolf\n1
Cruncher
1

Jawa - 490

Ya, tidak benar-benar bermain golf atau apa pun. Oh well, ini dia:

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

Dalam format yang bagus dan dapat dibaca:

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

Penggunaan sampel (Saat dijalankan dari kelas yang dikompilasi)

> java Anonymise OnlinePerson 3
*n****P***o*
O*li***e****
****ne**rs*n
Ishak
sumber
Apakah Anda menjalankannya atau mengetik? Bagaimana P bisa menjadi p?
Bill Woodger
Tidak masalah. Hanya merapikan komentar yang digunakan sekarang
Bill Woodger
Hanya import java.util.*Juga, ArrayList<String> = new ArrayList<>();akan berhasil. Anda juga dapat menghapus banyak ruang. Dan sebagian besar waktu, Anda dapat menggunakan Listbukan ArrayList.
Ypnypn
1

Python 3 - 187 (-20 = 167)

Butuh waktu beberapa saat untuk menulis, mungkin bisa bermain golf lebih banyak.

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)

Penggunaan sampel:

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

Sebagai fungsi - 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
cjfaure
sumber
Apakah itu menjamin setidaknya pada karakter dari input selalu?
Bill Woodger
@BillWoodger No.
cjfaure
2
Maaf, secara pribadi saya menganggapnya tidak berfungsi saat itu. kemudian.
Bill Woodger
Beberapa cara sederhana untuk mempersingkat hal-hal: Buka kemasan sys.argvdalam tugas, dan inisialisasi xsebagai x=['']*int(b[2])(dengan b[2]diganti oleh apa pun yang Anda nama variabel yang Anda gunakan dalam membongkar).
user2357112 mendukung Monica
2
Saya pikir tapi pasti saya tidak ingin menjelaskannya dengan jelas membatalkan solusi yang tidak memastikan bahwa setidaknya satu karakter disembunyikan di setiap baris 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-golf

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

Sampel:

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

Perl 6 (77 byte)

Ini mungkin dianggap sebagai kecurangan, tetapi ini memecahkan masalah (tidak mencetak keseluruhan string).

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

Dan output sampel.

> ./script.p6 ultimately_awesome 6
ultimately_awesom*
*****************e
******************
******************
******************
******************
Konrad Borowski
sumber
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}

Cepat, istirahat jika Anda memberikan nama dan meminta lebih banyak potongan daripada karakter, tetapi bekerja sampai titik itu dan turun ke 1. Bisa jadi golf lebih saya anggap, jadi dapat merevisi atau mengambil saran, karena itu sedikit berantakan.

Sunting: Diputar lebih jauh (dari 187) dengan menghilangkan tanda kurung (@Synthetica) dan penggantian Math.floor dari @toothbrush. Untuk perubahan loop seperti yang disarankan menghasilkan kesalahan dalam output.

Mat
sumber
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 mampu mencukur 8 karakter;)
Aprıʇǝɥʇuʎs
Apakah Anda mengatakan jika teks itu lima karakter dan diminta enam pengganti yang rusak?
Bill Woodger
@ BillWoodger Dia mengatakan bahwa menggunakan kompilator penutupan dia mencukur 8 karakter dari total panjang kode.
Eduard Florinescu
@EduardFlorinescu, maaf, saya tidak jelas, maksud saya sedikit inibreaks if you supply a name and ask for more pieces than characters
Bill Woodger
1
Gunakan x=b/e|0sebagai gantix=Math.floor(b/e) . Juga,for(c=1;c<=e;c++) bisa disingkat menjadi for(c=1;c++<=e;).
Sikat gigi
1

R, (120-20) = 100 byte (2 solusi berbeda dengan panjang yang sama)

Selain keringkasannya, R pastinya menampilkan penghasil angka acak terbaik! :) Berikut solusi pertama panjang 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=""))
}

Jika fungsi ini dinamai f , outputnya terlihat seperti:

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

Dan di sini solusi ke-2, lagi dengan masking acak, dan lagi 120 byte panjang:

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="")
}
lambruscoAcido
sumber
0

Scala (1) 177 byte

Setelah solusi di RI juga menemukan satu di Scala, ini dia:

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

Setelah penelitian singkat saya menemukan metode zipWithIndex . Hebat :)

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
}

Di sini solusinya:

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***
lambruscoAcido
sumber
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}

Menggunakan regex.

Sampel

> 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
zoro
sumber
0

k [50-20 = 30 karakter]

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

Penjelasan

  1. Input: x = String yang perlu di-mask, y = jumlah baris
  2. Hitung jumlah karakter c dalam string dan buat y ember.
  3. Tempatkan karakter mod di setiap bucket.
  4. Untuk setiap ember, cetak "*" untuk angka yang tersisa yang tidak ada dalam ember itu.

Contoh

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

Keluaran

"ab*d*f***j**********u*w***"
"**c*e*gh**k*****q*s*******"
"********i***mn*****t*v**y*"
"***********l**op*r*****x*z"
nyi
sumber
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}

Output penggunaan dan sampel:

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

Karena maskingnya acak, hasilnya juga akan terlihat seperti ini:

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

["evil_company_that_makes_me_shiver", 
 "*********************************"]
codeporn
sumber
0

Julia 56-20 = 36 (sering bekerja)

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

Mencoba untuk mencari solusi acak yang lebih pendek, saya memutuskan untuk mengorbankan fungsi yang dijamin untuk solusi yang lebih pendek. Ini benar-benar bukan solusi yang sangat bagus.

gggg
sumber
0

F # - 81 80 75

Ini cukup mirip dengan yang lain yang telah ditawarkan:

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

Sampel:

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

Sebagai aplikasi yang lengkap dan berdiri sendiri, ia menghasilkan 160 155 156 karakter:

[<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
pswg
sumber