Membungkam kata sandi saya

17

Kata-kata umum harus tetap dihindari untuk digunakan sebagai kata sandi. Tantangan ini adalah tentang coding program yang sangat sederhana yang munges password yang diberikan ( M odify U ntil N ot G uessed E asily).

Memasukkan

Sebuah kata, yang merupakan string yang ditulis dalam alfabet abcdefghijklmnopqrstuvwxyz. Tidak masalah jika hurufnya kecil atau besar.

Munging

  1. Ubah urutan berulang dari huruf yang sama menjadi dirinya sendiri didahului dengan berapa kali surat itu diulang ( LLLLdengan 4L)
  2. Ubah dulu adengan@
  3. Ubah dulu bdengan8
  4. Ubah dulu cdengan(
  5. Ubah dulu ddengan6
  6. Ubah dulu edengan3
  7. Ubah dulu fdengan#
  8. Ubah dulu gdengan9
  9. Ubah dulu hdengan#
  10. Ubah dulu idengan1
  11. Ubah yang kedua idengan!
  12. Ubah dulu kdengan<
  13. Ubah dulu ldengan1
  14. Ubah yang kedua ldengani
  15. Ubah dulu odengan0
  16. Ubah dulu qdengan9
  17. Ubah dulu sdengan5
  18. Ubah yang kedua sdengan$
  19. Ubah dulu tdengan+
  20. Ubah dulu vdengan>
  21. Ubah yang kedua vdengan<
  22. Ubah dulu wdenganuu
  23. Ubah yang kedua wdengan2u
  24. Ubah dulu xdengan%
  25. Ubah dulu ydengan?

Aturan 1 harus diterapkan beberapa kali hingga tidak mungkin untuk menerapkannya lebih lanjut. Setelah itu sisa aturan diterapkan.

Keluaran Kata mungis

Contohnya

  • codegolf -> (0639o1#
  • programming -> pr09r@2m1ng
  • puzzles -> pu2z135
  • passwords -> p@25uu0r6$
  • wwww -> 4uu
  • aaaaaaaaaaa -> 11a
  • lllolllolll -> 3103io3l
  • jjjmjjjj -> 3jm4j

Ini , jadi harap buat program Anda sesingkat mungkin!

Tidak ada dalam posting ini yang dapat digunakan sebagai ide kata sandi atau sebagai bagian dari praktik kata sandi.

mdahmoune
sumber
18
Kenyataan bahwa program seperti ini adalah mungkin berarti bahwa penyerang dapat menulisnya dan menghapus kata sandi (dan mencoba berbagai apel) dengan mudah (bahkan lebih mudah karena mereka sering memiliki akses ke perangkat keras yang lebih baik). Jadi hanya demi keselamatan saya akan mengatakan: tidak ada dalam posting ini yang dapat digunakan sebagai ide kata sandi atau sebagai bagian dari praktik kata sandi.
NH.
1
Saya sarankan untuk membuat penafian itu dengan berani dan menduplikasinya di bagian atas. Anda tidak akan pernah bisa terlalu berhati-hati ...
wizzwizz4

Jawaban:

11

Java 8, 237 321 319 280 247 241 240 237 byte

s->{for(int a[]=new int[26],i=0,l=s.length,t,x;i<l;i+=t){for(t=0;++t+i<l&&s[i]==s[t+i];);System.out.print((t>1?t+"":"")+(++a[x=s[i]-65]>2?s[i]:"@8(63#9#1J<1MN0P9R5+U>u%?ZABCDEFGH!JKiMNOPQR$TU<2XYZ".charAt(x+26*~-a[x])+(x==22?"u":"")));}}

+84 byte karena aturan mendapat perubahan .. ( EDIT: Akhirnya kembali ke 237 byte awal saya. ) Mengganti WWWWdengan 222Wmudah di Jawa, tetapi dengan 4Wtidak .. Kalau saja Jawa punya cara untuk menggunakan regex capture-group untuk sesuatu. Memperoleh panjang lebar "$1".length(), mengganti kecocokan itu sendiri dengan "$1".replace(...), mengubah kecocokan menjadi bilangan bulat dengan new Integer("$1"), atau menggunakan sesuatu yang mirip dengan Retina (yaitu s.replaceAll("(?=(.)\\1)(\\1)+","$#2$1")) atau JavaScript (yaitu s.replaceAll("(.)\\1+",m->m.length()+m.charAt(0))) akan menjadi hal nomor 1 saya yang ingin saya lihat di Jawa di masa depan untuk mendapatkan keuntungan dari codegolfing ..>.> Saya pikir ini adalah kali ke-10 saya benci Java tidak bisa melakukan apa-apa dengan pertandingan grup-tangkap ..
-78 byte terima kasih kepada @ OlivierGrégoire .

I / O adalah huruf besar.

Penjelasan:

Coba di sini.

s->{                           // Method with String parameter and no return-type
  for(int a[]=new int[26],     //  Array with 26x 0
          i=0,                 //  Index-integer, starting at 0
          l=s.length,          //  Length
          t,x;                 //  Temp integers
      i<l;                     //  Loop (1) over the characters of the input
      i+=t){                   //    After every iteration: Increase `i` by `t`
    for(t=0;++                 //   Reset `t` to 1
        t+i<l                  //   Inner loop (2) from `t+i` to `l` (exclusive)
        &&s[i]==s[t+i];        //   as long as the `i`'th and `t+i`'th characters are equal
    );                         //   End of inner loop (2)
    System.out.print(          //   Print:
     (t>1?t+"":"")             //    If `t` is larger than 1: print `t`
     +(++a[x=s[i]-65]>2?       //    +If the current character occurs for the third time:
       s[i]                    //      Simply print the character
      :                        //     Else:
       "@8(63#9#1J<1MN0P9R5+U>u%?ZABCDEFGH!JKiMNOPQR$TU<2XYZ".charAt(x
                               //      Print the converted character at position `x`
        +26*~-a[x])            //       + 26 if it's the second time occurring
       +(x==22?"u":"")));      //      And also print an additional "u" if it's 'W'
  }                            //  End of loop (1)
}                              // End of method
Kevin Cruijssen
sumber
10

JavaScript (ES6), 147 byte

s=>[[/(.)\1+/g,m=>m.length+m[0]],..."a@b8c(d6e3f#g9h#i1k<l1o0q9s5t+v>x%y?i!lis$v<".match(/../g),["w","uu"],["w","2u"]].map(r=>s=s.replace(...r))&&s

Uji Kasus

Penjelasan

Berjalan melalui serangkaian penggantian pada string input s,, dalam urutan yang ditentukan oleh tantangan. Setiap item dalam seri adalah array atau string, dengan dua item, yang kemudian menyebar ( ...r) dan diteruskan ke s.replace().

s=>[
    [/(.)\1+/g, m=>m.length + m[0]],// first replacement: transform repeated letters
                                    // into run-length encoding

                                    // string split into length-2 partitions and
                                    // spread into the main array
    ..."a@b8c(d6e3f#g9h#i1k<l1o0q9s5t+v>x%y?i!lis$v<".match(/../g),
                                    // next replacements: all single-char replacements.
                                    // "second" versions are placed at the end so they
                                    //    replace the second instance of that char

    ["w","uu"],["w","2u"]           // last replacements: the two "w" replacements
]
.map(r=> s = s.replace(...r))       // run all replacements, updating s as we go
&& s                                // and return the final string
Justin Mariner
sumber
Jawaban yang sangat bagus
mdahmoune
6

05AB1E , 69 byte

-9 byte terima kasih kepada Emigna

γvygD≠×yÙ}J.•k®zĀÒĀ+ÎÍ=ëµι
•"@8(63#9#1<1095+>%?!i$<"ø'w„uu„2u‚â«vy`.;

Cobalah online!

Okx
sumber
Anda bisa menggunakan'w„uu„2u‚â
Emigna
Tolong bisakah Anda memverifikasi hasil untuk wwww sebagai input?
mdahmoune
@mdahmoune Ini keluaran4uu
Okx
@Emigna produk Cartesian, ide bagus.
Okx
Bagian pertama bisaγvygD≠×yÙ}J
Emigna
6

Perl 5 , 152 + 1 ( -p) = 153 byte

s/(.)\1+/(length$&).$1/ge;%k='a@b8c(d6e3f#g9h#i1j!k<l1mio0q9r5s$t+u>v<x%y?'=~/./g;for$i(sort keys%k){$r=$k{$i};$i=~y/jmru/ilsv/;s/$i/$r/}s/w/uu/;s/w/2u/

Cobalah online!

Xcali
sumber
Plz apa yang Anda maksud dengan (-p)?
mdahmoune
1
@mdahmoune -pdigunakan sebagai argumen perlpada pada commandline yang secara otomatis membaca input dari STDINdan printisi dari $_di akhir skrip. TIO memungkinkan opsi itu, dan karena perl -pe<code>1 byte lebih dari perl -e<code>itu dihitung sebagai satu byte tambahan.
Dom Hastings
Saya pikir Anda telah membuat kesalahan ketik, bukankah seharusnya ~antara j~kmenjadi !? Saat ini menggantikan kejadian kedua idengan ~bukannya a !.
Kevin Cruijssen
@Xcali #testingonproduction
NieDzejkob
2
@NieDzejkob Tidak ada tempat yang lebih baik. Itulah satu-satunya cara Anda tahu itu akan berhasil dalam produksi.
Xcali
4

Mungkin bukan golf yang paling bisa, tapi berhasil.

-6 byte berkat ovs

-77 Bytes berkat NieDzejkob dan Jonathan French

Python 3 , 329 323 byte, 246 byte

import re;n=input()
for a in re.finditer('(\w)\\1+',n):b=a.group();n=n.replace(b,str(len(b))+b[0],1)
for A,B,C in[('abcdefghikloqstvxyw','@8(63#9#1<1095+>%?','uu'),('ilsvw','!i$<','2u')]:
	for a,b in zip(A,list(B)+[C]):n=n.replace(a,b,1)
print(n)

Cobalah online!

reffu
sumber
1
Saya pikir Anda dapat drop.lower()
mdahmoune
Masuk akal, saya tidak yakin apakah saya perlu menangani huruf besar atau tidak.
reffu
321 byte .
Jonathan Frech
1
320 byte .
Jonathan Frech
2
Sebenarnya, jawaban Anda tidak berhasil. jjjmjjjjseharusnya output 3jm4jtetapi output 3jm3jj. Sunting: 258 byte dengan masalah ini diperbaiki
NieDzejkob
3

Retina , 166 124 byte

(.)\1+
$.&$1
([a-y])(?<!\1.+)
¶$&
¶w
uu
T`l¶`@8(63#9#1j<\1mn0\p9r5+u>\w%?_`¶.
([ilsvw])(?<!\1.+)
¶$&
¶w
2u
T`i\lsv¶`!i$<_`¶.

Cobalah online! Penjelasan:

(.)\1+
$.&$1

Ganti serangkaian huruf yang berulang dengan panjang dan huruf itu.

([a-y])(?<!\1.+)
¶$&

Mencocokkan kejadian pertama dari surat-surat auntuk ydan menandai mereka dengan pengganti.

¶w
uu

Perbaiki kemunculan pertama w.

T`l¶`@8(63#9#1j<\1mn0\p9r5+u>\w%?_`¶.

Perbaiki kemunculan pertama semua surat lainnya dari ake ydan hapus placeholder.

([ilsvw])(?<!\1.+)
¶$&

Tandai (awalnya) terjadinya kedua dari surat-surat i, l, s, v, atau wdengan pengganti.

¶w
2u

Perbaiki kemunculan kedua w.

T`i\lsv¶`!i$<_`¶.

Perbaiki kemunculan kedua dari empat huruf lainnya.

Neil
sumber
Apakah Anda pikir mungkin untuk bermain golf lebih jauh?
mdahmoune
@mdahmoune Ya, saya pikir saya bisa menghemat 33 byte.
Neil
Saya memilih ulang jawaban Anda :) akan lebih baik jika Anda menyimpan 33 byte;)
mdahmoune
@mdahmoune Kabar baik, saya benar-benar menyelamatkan 42 byte!
Neil
Hebat, kode Anda adalah yang terpendek kedua;)
mdahmoune
3

Haskell , 221 218 213 byte

($(f<$>words"w2u li i! s$ v< a@ b8 c( d6 e3 f# g9 h# i1 k< l1 o0 q9 s5 t+ v> wuu x% y?")++[r]).foldr($)
f(a:b)(h:t)|a==h=b++t|1>0=h:f(a:b)t
f _ s=s
r(a:b)|(p,q)<-span(==a)b=[c|c<-show$1+length p,p>[]]++a:r q
r s=s

Cobalah online!

Abuse foldruntuk menjalankan string melalui urutan transformasi string mundur. Urutan "dimulai" dengan ryang pengulangan menghitung penggantian dengan menggunakan spanuntuk mematahkan ekor tali ketika berhenti sama dengan kepala. Jika bagian pertama dari itu tidak kosong itu adalah pengulangan jadi kami mencetak panjang +1. Selanjutnya kita mencari argumen funtuk setiap penggantian karakter dengan urutan (terbalik). Pengganti dikodekan sebagai string tunggal dengan karakter pertama menjadi karakter yang akan diganti dan sisanya sebagai string (karena penggantian w adalah beberapa karakter) untuk menggantikannya. Saya menempatkan string yang disandikan ini dalam satu string besar yang dipisahkan oleh spasi sehinggawords dapat memecahnya menjadi daftar untuk saya.

EDIT: Terima kasih @Laikoni karena telah menyelamatkan saya 5 byte! Itu penggunaan cerdas yang $tidak terpikirkan oleh saya. Saya juga tidak tahu <-trik itu.

pengguna1472751
sumber
Thanx untuk penjelasan terperinci;)
mdahmoune
1
Anda dapat menggunakan (p,q)<-span(==a)bsebagai ganti let(p,q)=span(==a)bdan p>[] bukannya p/=[].
Laikoni
2
Simpan dua byte lagi dengan membuat mpointfree: ($(f<$>words"w2u ... y?")++[r]).foldr($) Cobalah online!
Laikoni
2

Lua , 173 byte

s=...for c,r in("uua@b8c(d6e3f#g9h#i1i!jjk<l1limmnno0ppq9rrs5s$t+v>v<wuuw2ux%y?zz"):gmatch"(.)(.u?)"do s=s:gsub(c..c.."+",function(p)return#p..c end):gsub(c,r,1)end print(s)

Cobalah online!

Tidak digabungkan dan dijelaskan:

s = ...


--This string contains every character to replace, followed by
--the character(s) it should be replaced with.
--
--It also contains all characters for which repeated sequences
--of them should be replaced by "<number><character>". That is,
--all letters in the alphabet. This way, a single loop can do
--both the "replace repeated characters" and "encode characters"
--operations, saving a for loop iterating over the alphabet.
--
--Characters that shouldn't be replaced will be replaced with
--themselves.
--
--In order to avoid matching half of the "replace u with u"
--command as the replace part of another command, "uu" is placed
--at the beginning of the string. This ensures that only the
--2-character replacements for "w" get an extra "u".

cmdstring = "uua@b8c(d6e3f#g9h#i1i!jjk<l1limmnno0ppq9rrs5s$t+v>v<wuuw2ux%y?zz"


--Iterate over all the search/replace commands.
--The character to replace is in the "c" variable, the string to
--replace it with is in "r".
--
--Due to the dummy search/replace commands (i.e. "mm") placed
--in the string, this loop will also iterate over all letters
--of the alphabet.

for c,r in cmdstring:gmatch("(.)(.u?)") do
	
	--First, replace any occurences of the current letter
	--multiple times in a row with "<number><letter>".
	s = s:gsub(c..c.."+", function(p)
		return #p .. c
	end)
	
	--Then, replace the first occurence of the letter
	--with the replacement from the command string.
	s = s:gsub(c, r, 1)
end

print(s)
Jonathan S.
sumber
Lol lua :) kerja bagus
mdahmoune
2

C # (.NET Core), 317 , 289 , 279 Bytes

p=>{string r="",l=r,h=r,c="a@b8c(d6e3f#g9h#i1i!k<l1lio0q9s5s$t+v>v<wuw2x%y?";int i=0,n=p.Length,d,a=1;for(;i<n;i++){h=p[i]+"";if(h==p[(i==n-1?i:i+1)]+""&&i!=n-1)a++;else{d=c.IndexOf(h);if(d>=0&&d%2<1){l=c[d+1]+"";h=l=="u"?"uu":l;c=c.Remove(d,2);}r+=a>1?a+""+h:h;a=1;}}return r;};

Cobalah secara Online!

Saya harap tidak apa-apa untuk menerima array char sebagai input dan bukan string.

Tidak Disatukan :

string result = "", casesCharReplacement = result, currentChar = result, cases = "a@b8c(d6e3f#g9h#i1i!k<l1lio0q9s5s$t+v>v<wuw2x%y?";
int i = 0, n = pas.Length, casesIndex, charAmounts = 1;

// For every char in the pass.
for (; i < n; i++)
{
    currentChar = pas[i] + "";
    // if the next char is equal to the current and its not the end of the string then add a +1 to the repeated letter.
    if (currentChar == (pas[(i == n - 1 ? i : i + 1)] + "") && i != n - 1)
        charAmounts++;
    else
    {
        // Finished reading repeated chars (N+Char).
        casesIndex = cases.IndexOf(currentChar);
        // Look for the replacement character: only if the index is an even position, otherwise I could mess up with letters like 'i'.
        if (casesIndex >= 0 && casesIndex % 2 < 1)
        {
            casesCharReplacement = cases[casesIndex + 1]+"";
            // Add the **** +u
            currentChar = casesCharReplacement == "u"?"uu": casesCharReplacement;
            // Remove the 2 replacement characters (ex: a@) as I won't need them anymore.
            cases = cases.Remove(casesIndex, 2);
        }
        // if the amount of letters founded is =1 then only the letter, otherwise number and the letter already replaced with the cases.
        result += charAmounts > 1 ? charAmounts + ""+currentChar : currentChar;
        charAmounts = 1;
    }
}
return result;
Emiliano
sumber
1
Ya tidak apa-apa :) untuk input
mdahmoune
2

C ++, 571 495 478 444 byte

-127 byte berkat Zacharý

#include<string>
#define F r.find(
#define U(S,n)p=F s(S)+b[i]);if(p-size_t(-1)){b.replace(i,1,r.substr(p+n+1,F'/',n+p)-p-2));r.replace(p+1,F'/',p+1)-p,"");}
#define V(A)i<A.size();++i,c
using s=std::string;s m(s a){s b,r="/a@/b8/c(/d6/e3/f#/g9/h#/i1//i!/k</l1//li/o0/q9/s5//s$/t+/v>/wuu//w2u/x%/y?/";int c=1,i=0;for(;V(a)=1){for(;a[i]==a[i+1]&&1+V(a)++);b+=(c-1?std::to_string(c):"")+a[i];}for(i=0;V(b)){auto U("/",1)else{U("//",2)}}return b;}

yang "/a@/b8/c(/d6/e3/f#/g9/h#/i1//i!/k</l1//li/o0/q9/s5//s$/t+/v>/wuu//w2u/x%/y?/"string digunakan untuk mengubah dari satu karakter ke orang lain. 1 /berarti "char berikutnya" pertama harus diganti dengan yang mengikuti berikutnya /, 2 berarti "char berikutnya" kedua harus diganti dengan yang berikut.

Cobalah online

HatsuPointerKun
sumber
Hebat, bisakah Anda menambahkan tautan tio.run?
mdahmoune
Tautan @mdahmoune TIO ditambahkan, dengan kode untuk menguji kasus pengujian Anda :)
HatsuPointerKun
494 byte , dan perbarui tautan TIO sesuai jika Anda mengubahnya.
Zacharý
@ Zacharý Anda perlu memberi spasi antara nama makro dan konten makro, jika tidak, akan terjadi kesalahan saat kompilasi dengan C ++ 17. Selain itu, apakah Anda tahu cara menghapus tautan TIO? (karena yang lama tidak berguna)
HatsuPointerKun
1
444 byte
Zachar
2

R , 224 219 byte

function(s,K=function(x)el(strsplit(x,"")),u=rle(K(s)))
Reduce(function(x,y)sub(K('abcdefghiiklloqsstvvwwxy')[y],c(K('@8(63#9#1!<1i095$+><'),'uu','2u',K('%?'))[y],x),1:24,paste0(gsub("1","",paste(u$l)),u$v,collapse=""))

Cobalah online!

Jahat, tetapi bagian utama adalah substitusi berulang di Internet Reduce. subhanya mengubah kemunculan pertama pertandingan.

Terima kasih kepada JayCe karena menunjukkan golf yang bagus!

Giuseppe
sumber
Kerja
simpan 1 byte dengan mengatur ulang args. Tidak membuat perbedaan besar, saya tahu;)
JayCe
@JayCe Saya menemukan beberapa byte lagi :-)
Giuseppe
1

Perl 5 , 123 byte

122 byte kode +1 untuk -p.

Dikembangkan secara independen dari @ Xcali 's jawaban , tapi menggunakan proses yang sangat mirip.

s/(.)\1+/$&=~y!!!c.$1/ge;eval"s/$1/$2/"while'a@b8c(d6e3f#g9h#i1i!k<l1lio0q9s5t+v>v<x%y?'=~/(.)(.)/g;s/s/\$/;s/w/uu/;s;w;2u

Cobalah online!

Dom Hastings
sumber
1

Python 2 , 220 216 194 190 188 byte

import re
S=re.sub(r'(.)\1+',lambda m:`len(m.group(0))`+m.group(1),input())
for a,b in zip('abcdefghiiklloqsstvvxyww',list('@8(63#9#1!<1i095$+><%?')+['uu','2u']):S=S.replace(a,b,1)
print S

Cobalah online!

Python 3 , 187 byte

import re
S=re.sub(r'(.)\1+',lambda m:str(len(m.group(0)))+m.group(1),input())
for a,b in zip('abcdefghiiklloqsstvvxyww',[*'@8(63#9#1!<1i095$+><%?','uu','2u']):S=S.replace(a,b,1)
print(S)

Cobalah online!

TFeld
sumber
Thanx Tfeld 192 byte tio.run/…
mdahmoune
Golf hebat;)
mdahmoune
186 byte . Anda juga dapat dengan mudah port ini ke Python 3 dalam 192 byte , tetapi saya tidak berpikir itu harus menjadi jawaban yang terpisah.
NieDzejkob
@NieDzejkob Sepertinya versi Python 2 golf Anda menghasilkan output yang berbeda dari versi OP saat ini atau versi Python 3 Anda.
Jonathan Frech
@JomathanFrech maaf, karena selalu menguji produksi. 188 bytes
NieDzejkob
1

Pip , 103 102 byte

aR:`(.)\1+`#_.B
Fm"abcdefghiiklloqsstvvwwxy"Z"@8(63#9#1!<1i095$+><WU%?"I#Ya@?@maRA:ym@1aR'W"uu"R'U"2u"

Cobalah online!

Penjelasan

Kode melakukan tiga langkah transformasi:

aR:`(.)\1+`#_.B  Process runs of identical letters

a                1st cmdline argument
 R:              Do this replacement and assign back to a:
   `(.)\1+`       This regex (matches 2 or more of same character in a row)
           #_.B   Replace with callback function: concatenate (length of full match) and
                  (first capture group)
                  Note: #_.B is a shortcut form for {#a.b}

Fm"..."Z"..."I#Ya@?@maRA:ym@1  Do the bulk of rules 2-25

  "..."                        String of letters to replace
       Z"..."                  Zip with string of characters to replace with
Fm                             For each m in the zipped list:
                   @m           First item of m is letter to replace
                a@?             Find its index in a, or nil if it isn't in a
               Y                Yank that into y
             I#                 If len of that is truthy:*
                     aRA:        Replace character in a at...
                         y        index y...
                          m@1     with second item of m

aR'W"uu"R'U"2u"  Clean up substitution
                 In the previous step, the replacements each had to be a single character.
                 This doesn't work for uu and 2u, so we use W and U instead (safe, since
                 uppercase letters won't be in the input) and replace them here with the
                 correct substitutions.
aR'W"uu"         In a, replace W with uu
        R'U"2u"  and U with 2u
                 and print the result (implicit)

* Kita perlu menguji apakah a@?m@0nol. Tidak cukup untuk menguji apakah itu benar, karena 0 adalah indeks sah yang salah. Pip tidak memiliki cara pendek untuk menguji apakah suatu nilai adalah nihil, tetapi menguji panjangnya cukup baik dalam kasus ini: angka apa pun akan memiliki panjang setidaknya 1 (benar), dan nil memiliki panjang nihil (falsey).

DLosc
sumber