Peretasan Terminal Fallout

13

Adakah orang di sini yang penggemar keras Bethesda? Mungkin Anda lebih suka Obsidian Entertainment? Nah, jika Anda salah satu dari hal-hal itu daripada gambar berikut harus relatif akrab bagi Anda.

Terminal kejatuhan.

Saya sudah bebas mempersiapkan tantangan ASCII-Art yang agak unik, jadi inilah petunjuk pertama tentang apa yang akan saya lakukan:

  _____________________________________________________
 /                                                     \ 
|     _____________________________________________     |
|    |                                             |    |
|    | Welcome to ROBCO Industries (TM) Termlink   |    |
|    | Password Required                           |    |
|    | Attempts Remaining:                         |    |
|    |                                             |    |
|    | 0x01                 | 0x0D                 |    |
|    | 0x02                 | 0x0E                 |    |
|    | 0x03                 | 0x0F                 |    |
|    | 0x04                 | 0x10                 |    |
|    | 0x05                 | 0x11                 |    |
|    | 0x06                 | 0x12                 |    |
|    | 0x07                 | 0x13                 |    |
|    | 0x08                 | 0x14                 |    |
|    | 0x09                 | 0x15                 |    |
|    | 0x0A                 | 0x16                 |    |
|    | 0x0B                 | 0x17                 |    |
|    | 0x0C                 | 0x18                 |    |
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

Ini adalah templat yang sangat mendasar (kosong) untuk desain terminal RobCo Fallout di ASCII murni, tugas Anda adalah:

  • Pertama, hasilkan templat ini.
  • Kemudian, berikan daftar string ldan nomor 0 <= n <= 4untuk mengisinya!

Dua bagian dinamis dari terminal peretasan yang gagal adalah:

Jumlah Usaha

  • Jumlah upaya yang tersisa (ditunjukkan oleh kotak yang dibatasi ruang.
    • Untuk tujuan tantangan ini, Anda akan menggunakan Xsebagai gantinya .

Kata Sandi

  • Kata sandi, yang didefinisikan oleh l, diselingi dengan simbol ASCII yang dapat dicetak secara acak.
  • Kata sandi, seperti yang Anda tahu dari contoh, dapat membungkus banyak baris ( NAMES).
  • Semua kata sandi di layar terminal harus memiliki peluang yang sama untuk berada di mana saja.
  • Semua kata sandi dapat memiliki panjang yang sama, meskipun ini tidak masalah.
  • Daftar simbol yang dapat digunakan untuk password terpisah: !"#$%&'()*+/:;<=>?@[\]^_{|}.
  • Semua kata sandi lharus memiliki panjang yang sama.
  • PASSWORDS HARUS MEMILIKI POTENSI UNTUK MEMBUAT KOLOM ANTARA KEDUA.
    • Ini juga berlaku untuk baris, tetapi hanya ke alamat byte yang lebih tinggi (0x18-> 0x01 tidak valid).
  • Ruang tampilan untuk kata sandi di kedua sisi adalah 15 lebar (dengan ruang di kedua sisi).
    • Anda mungkin menganggap tidak ada kata yang llebih panjang dari ini.
  • Kata sandi hanya alfabet, artinya hanya huruf.

Contoh:

l = ["SMART","ENACT","SWORE","PITYS","SMELL","CARTS","RACES"], n = 4

  _____________________________________________________
 /                                                     \ 
|     _____________________________________________     |
|    |                                             |    |
|    | Welcome to ROBCO Industries (TM) Termlink   |    |
|    | Password Required                           |    |
|    | Attempts Remaining: X X X X                 |    | # N = 4 drives these X's.
|    |                                             |    |
|    | 0x01 $?_/%$ENACT||"} | 0x0D TYS"_'$\#|^%&{} |    |
|    | 0x02 }:!*@{/_<"[]#>; | 0x0E #{!"^&\]'|}_[$% |    |
|    | 0x03 $%&'()*+/:;<\_' | 0x0F }|[(%SMELL/_$@( |    |
|    | 0x04 ^SMART(!@$*'^_@ | 0x10 []_#!"{|}'%$\&^ |    |
|    | 0x05 (*@#%}*(!%)^(_! | 0x11 %$}[!\#'^&_]{|" |    |
|    | 0x06 $%&'()*+/:;<_@) | 0x12 \SWORE|%'_!}\^" |    |
|    | 0x07 "/')=*%!&>#<:$+ | 0x13 ^{['&$|!_]%\"#} |    |
|    | 0x08 ;'*$&"(<%!#)RAC | 0x14 ']!|^#[$"_\}&{% |    |
|    | 0x09 ES:($&';%#+"<*/ | 0x15 @)($!CARTS*!@$_ |    |
|    | 0x0A ;'*$&"(<%!#)/+: | 0x16 !#%${"'}&[]^|_\ |    |
|    | 0x0B |'_!}$\%["#^{&] | 0x17 ]"_#$&}^%[{|\'! |    |
|    | 0x0C #{!"^&\]'|}_[PI | 0x18 _![&#{$%\^'|}"] |    | # Notice how PITYS wrapped.
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

Jika n = 2pada contoh yang sama:

  _____________________________________________________
 /                                                     \ 
|     _____________________________________________     |
|    |                                             |    |
|    | Welcome to ROBCO Industries (TM) Termlink   |    |
|    | Password Required                           |    |
|    | Attempts Remaining: X X                     |    | # N = 2 drives these X's.
|    |                                             |    |
|    | 0x01 $?_/%$ENACT||"} | 0x0D TYS"_'$\#|^%&{} |    |
|    | 0x02 }:!*@{/_<"[]#>; | 0x0E #{!"^&\]'|}_[$% |    |
|    | 0x03 $%&'()*+/:;<\_' | 0x0F }|[(%SMELL/_$@( |    |
|    | 0x04 ^SMART(!@$*'^_@ | 0x10 []_#!"{|}'%$\&^ |    |
|    | 0x05 (*@#%}*(!%)^(_! | 0x11 %$}[!\#'^&_]{|" |    |
|    | 0x06 $%&'()*+/:;<_@) | 0x12 \SWORE|%'_!}\^" |    |
|    | 0x07 "/')=*%!&>#<:$+ | 0x13 ^{['&$|!_]%\"#} |    |
|    | 0x08 ;'*$&"(<%!#)RAC | 0x14 ']!|^#[$"_\}&{% |    |
|    | 0x09 ES:($&';%#+"<*/ | 0x15 @)($!CARTS*!@$_ |    |
|    | 0x0A ;'*$&"(<%!#)/+: | 0x16 !#%${"'}&[]^|_\ |    |
|    | 0x0B |'_!}$\%["#^{&] | 0x17 ]"_#$&}^%[{|\'! |    |
|    | 0x0C #{!"^&\]'|}_[PI | 0x18 _![&#{$%\^'|}"] |    | # Notice how PITYS wrapped.
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

Contoh-contoh ini dibuat secara manual, sehingga distribusinya tidak acak, maaf.


Ini adalah , byte-count terendah akan menjadi pemenang yang diterima. Saya akan memberi hadiah ini setelah 3 hari jika tidak ada jawaban yang diajukan dengan total 250 REP.

Guci Gurita Ajaib
sumber
Cepat! Tidak ada yang menjawab selama 3 hari! (bercanda). Ini adalah tantangan ascii-art favorit saya yang baru.
nmjcman101
2
@ nmjcman101 apa favorit terakhir Anda?
Magic Gurita Guci
Apa NAMESmaksud dari poin kedua? " Semua kata sandi dapat diperkirakan memiliki panjang yang sama, meskipun ini tidak masalah. " Atau " Semua kata sandi di saya harus memiliki panjang yang sama. "? Mungkin saja saya menjadi buta (lagi!) Tapi saya tidak melihat RACESdi salah satu output - haruskah kita menganggap ini berarti ada kemungkinan password tidak digunakan? Apakah Math.random(dan setara) cukup acak untuk keperluan tantangan ini?
Shaggy
2
Apakah harus ada spacer non-alfanumerik antara dua kata sandi atau tidak apa-apa jika mereka menghasilkan tepat di sebelah satu sama lain (non-tumpang tindih)?
HyperNeutrino
5
Apakah kata sandi perlu memiliki kemungkinan pembungkus langsung dari 0x18 hingga 0x01?
Jonathan Allan

Jawaban:

6

JavaScript (ES8), 575 568 564 byte

Disimpan 3 byte berkat @Shaggy

Mengambil input dalam sintaks currying (r)(a), di mana r adalah jumlah upaya yang tersisa dan a adalah array kata sandi.

r=>a=>[...C=`!"#[]^$%&'*+;<{}=`].reduce((s,c)=>(x=s.split(c)).join(x.pop()),`  "%%__
 /;;# \\ 
[ "} $Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:${" X".repeat(r).padEnd(9)};[$^1=^D<2=^E<3=^F<4*0<5*1<6*2<7*3<8*4<9*5<A*6<B*7<C*8='+"[|
|;;#'|
\\"{_/ 
}'\\&%/= ]]]]] | }' {%%%<='+ ^#}}}+|
[|*=0x1'   "{{{%___$+;#}} !^0x0]ZZZ[|}#;}"&{![+ `).replace(/Z/g,(c,i)=>a.join``[(i%58>>5?y++:x++)%L],x=(R=n=>Math.random()*n|0)(L=360),y=x+180,[...Array(L-(n=a.sort(_=>R(3)-1).length)*a[0].length)].map(_=>a[R(n)]+=(C+`>?@()/:\\_|`)[R(27)]))

Penyorot sintaks dinonaktifkan dengan sengaja. Tidak ada petunjuk apa yang harus dilakukan dengan itu.

Demo

Arnauld
sumber
Bisakah Anda menyimpan apa-apa menggunakan ES8 untuk mengisi upaya suka begitu: Attempts Remaining:${" X".repeat(r).padEnd(8)}?
Shaggy
1
@ Shaggy Itu memang menghemat 3 byte. Terima kasih!
Arnauld
Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:oof ... Saya harus diparafrasekan untuk menyimpan byte langs non-golf.
Magic Gurita Guci
4

SOGL V0.12 , 225 byte

R“EC"+w╗─║Z⁰2BΥø‘▓"▲╔⁸‘'²∙+"⅟Δλ≤LK⅟ΗΠ.JN║«⁸⅟‘▓+╬⁷"№D↓tι▲‛Q─Ρδν∙υ4Ρψ▲¦‽↑√Ε┐Ζ5↔‛⅟≤š▼¦⁾○ΔΡ%³‘ū91 tž85ž.ΖX Ο'⁹7žø]Xe@*c{leκψI1ž}_:@øŗ⁄c∑⁄≠}l{"T-)⅞↑°Χpjζ⅓īa0ε+Μ‛⁶ρ\=↔⅟¹‘ψ}¹K@Gŗ'¹nο²²Z+8«m«ο+I{@∑"0x0”Κ}¹6«n_'⁷1ž'⁵16«┐∙ž'⁸4 19∙ž89╬5

Coba Di Sini!
Mengharapkan input array pada stack dan jumlah input dan input, sehingga →"ditambahkan dalam program online untuk kemudahan penggunaan.

dzaima
sumber
4

Perl 5 , 588 560 + 1 (-a) = 589 561 byte

Potong 28 byte dengan saran yang ditunjukkan Dom

$,=$/;$_=" X"x pop@F;say"  "."_"x53," /".$"x53 ."\\",$q="|     ".'_'x45 ."     |",$e=($b="|    |").$"x45 .$b,"$b Welcome to ROBCO Industries (TM) Termlink   $b
$b Password Required".$"x27 .$b,"$b Attempts Remaining:$_".$"x(25-length).$b,$e;map{$s.=(grep/[^\w,.`-]|_/,map{chr}33..125)[rand 27]}1..360;($t=substr$s,$r=rand 360-($l=length),$l,$_)=~/[a-z]/i&&(substr$s,$r,$l,$t)&&push@F,$_ while$_=pop@F;@o=$s=~/.{15}/g;printf"$b 0x0%X %s | 0x%02X %s $b\n",$_,$o[$_-1],$_+12,$o[$_+11]for 1..12;say$b.'_'x45 .$b,$q=~y/_/ /r,$q=" \\"."_"x54 ."/",$"x6 .$q=~s/_{15}//r

Cobalah online!

Sebelumnya:

$,=$/;$_=" X"x pop@F;say"  "."_"x53," /".($"x53)."\\",$q="|     ".('_'x45)."     |",$e=($b="|    |").($"x45).$b,"$b Welcome to ROBCO Industries (TM) Termlink   $b
$b Password Required".($"x27).$b,"$b Attempts Remaining:$_".($"x(25-length)).$b,$e;$s=join'',map{(split//,'!"#$%&\'()*+/:;<=>?@[]^_{|}\\')[int rand 27]}1..360;while($_=pop@F){if(($t=substr$s,$r=rand 360-($l=length),$l,$_)=~/[a-z]/i){substr$s,$r,$l,$t;push@F,$_}}@o=$s=~/.{15}/g;printf"$b 0x0%X %s | 0x%02X %s $b\n",$_,$o[$_-1],$_+12,$o[$_+11]for 1..12;say$b.('_'x45).$b,$q=~y/_/ /r,$q=" \\".("_"x54)."/",($"x6).$q=~s/_{15}//r

Cobalah online!

Input ada pada satu baris, spasi terpisah: pertama string, lalu nomor

Bagaimana?

$,=$/;          # delimiter between fields is newline
$_=" X"x pop@F; # set number of attempts left
say             # output the header
"  "."_"x53,
" /".($"x53)."\\",
$q="|     ".('_'x45)."     |",
$e=($b="|    |").($"x45).$b,
"$b Welcome to ROBCO Industries (TM) Termlink   $b
$b Password Required".($"x27).$b,
"$b Attempts Remaining:$_".($"x(25-length)).$b,
$e;
$s=join'',map{(split//,'!"#$%&\'()*+/:;<=>?@[]^_{|}\\')[int rand 27]}1..360; # create random string long enough for entire screen
while($_=pop@F){  # for each given string
if(($t=substr$s,$r=rand 360-($l=length),$l,$_) # attempt to insert it
=~/[a-z]/i)                                    # but check if it overlaps another string
{substr$s,$r,$l,$t;                            # if it does, take it out
push@F,$_}}                                    # and put it back in line
@o=$s=~/.{15}/g;                               # split "memory dump" into chunks
printf"$b 0x0%X %s | 0x%02X %s $b\n",$_,$o[$_-1],$_+12,$o[$_+11]for 1..12; #output the grid
say                                            # output the footer
$b.('_'x45).$b,$q=~y/_/ /r,
$q=" \\".("_"x54)."/",
($"x6).$q=~s/_{15}//r
Xcali
sumber
Jawaban yang bagus untuk masalah yang rumit! Anda harus dapat menghemat hampir 30 byte dengan menghapus tanda kurung di sekitar operator pengulangan, Anda dapat menambahkan spasi sehingga .tidak digunakan sebagai titik desimal. Juga untuk mendapatkan tanda baca Anda dapat menggunakan sesuatu seperti (grep/[^\w,.`-]|_/,map{chr}33..125)dan Anda tidak perlu memanggil intindeks array! Mengubah whileloop ke postfix dan menggunakan &&bukannya ifharus menyimpan beberapa juga. Saat Anda membangun $s, jika Anda memiliki $s.=di dalam peta alih-alih menggunakan joinbeberapa tetes lagi. Semoga itu bisa membantu!
Dom Hastings
4

Python 3 , 585 byte

from random import*
def f(l,n,r=range):
	u,c='_ ';a=[choice('!"#$%&\'()*+/:;<=>?@[\\]^_{|}')for i in c*360];L=len(l[0]);i={*r(360-len(l[0]))};p=lambda x:'0x%02X'%x+c+''.join(a[15*x:][:15])
	for q in l:s=choice([*i]);a[s:s+L]=q;i-={*r(s+~L,s+-~-~L)}
	return'''  %s
 /%s\\
|# %s #|
?%s?
? Welcome to ROBCO Industries (TM) Termlink   ?
? Password Required   ######?
? Attempts Remaining:%-25s?
?%s?
%%s?%s?
|%s|
\%s/
#   \%s/'''.replace('?','|#|').replace('#',c*4)%(u*53,c*53,u*45,c*45,' X'*n,c*45,u*45,c*55,u*55,u*39)%('|    | %s | %s |    |\n'*12)%sum([(p(x),p(x+12))for x in r(12)],())

Cobalah online!

-70 byte terima kasih kepada Jonathan Allan
-9 byte terima kasih pada diriku sendiri (akhirnya!)
-72 byte terima kasih kepada notjagan

HyperNeutrino
sumber
Dan 15 lagi.
notjagan
16 lainnya dihapus! (Harus ada cara yang lebih baik untuk melakukan ini daripada banyak komentar)
notjagan
Lain 6 byte off dengan setengah mengembalikan salah satu perubahan saya yang lain (saya benar-benar harus berhenti berkomentar).
notjagan
@ notjagan Saya tidak keberatan komentar :) Terima kasih!
HyperNeutrino
2

JavaScript (ES8), 639 byte

(w,n,r=i=>Math.random()*i|0,s=b=>{for(i=b[k];i;i--)[b[i-1],b[j]]=[b[j=r(i)],b[i-1]]},a=Array(360-w[k="length"]*--w[0][k]),m=[...a].map((j,i)=>~(j=d.slice(0,w[k]).indexOf(i))?w[j]:`!"#$%&'()*+/:;<=>?@[\\]^_{|}`[r(27)],s(w),s(d=[...a.keys()])).join``.match(/.{15}/g).map((v,i)=>"0x"+(i+1).toString(16).padStart(2,0)+" "+v))=>`  _53
 / 53\\
| 5_45 5|
${["","Welcome to ROBCO Industries (TM) Termlink","Password Required","Attempts Remaining:"+" X".repeat(n),"",...m.slice(0,12).map((x,i)=>x+" | "+m[i+12])].map(x=>"| 4| "+x.padEnd(43)+" | 4|").join`
`}
| 4|_45| 4|
| 55|
\\_55/
 7\\_39/`.replace(/[_ ]([1-9]+)/g,(m,n)=>m[0].repeat(n))

Label heks berada dalam huruf kecil; jika huruf besar diperlukan, itu akan menjadi tambahan 14 byte untuk .toUpperCase().

Cuplikan Tes

Lebih baik dilihat pada CodePen .

Justin Mariner
sumber
Anda dapat menyimpan satu byte dengan menjelajah 2 parameter dan memindahkan variabel Anda ke yang pertama repeat.
Shaggy