Fallout Terminal Hacking


13

Qualcuno qui è un fan sfegatato di Bethesda? Forse preferisci Obsidian Entertainment? Bene, se sei una di queste cose rispetto alla seguente immagine dovrebbe esserti relativamente familiare.

Il terminale delle ricadute.

Mi sono preso la libertà di preparare una sfida ASCII-Art piuttosto singolare, quindi ecco il primo indizio su cosa ho intenzione di farti fare:

  _____________________________________________________
 /                                                     \ 
|     _____________________________________________     |
|    |                                             |    |
|    | 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                 |    |
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

Questo è un modello di base (vuoto) per il design del terminale RobCo Fallout in puro ASCII, il tuo compito sarà:

  • Innanzitutto, genera questo modello.
  • Quindi, dato un elenco di stringhe le un numero 0 <= n <= 4per riempirlo!

Le due parti dinamiche di un terminale di hacking di fallout sono:

Il numero di tentativi

  • Il numero di tentativi rimanenti (indicato da caselle delimitate da spazi.
    • Ai fini di questa sfida si utilizzerà Xinvece di .

Le password

  • Le password, definite da l, sono intervallate da simboli ASCII stampabili casuali.
  • Le password, come puoi vedere dall'esempio, possono racchiudere più righe ( NAMES).
  • Tutte le password nella schermata del terminale dovrebbero avere le stesse possibilità di trovarsi ovunque.
  • Ci si può aspettare che tutte le password abbiano la stessa lunghezza, anche se questo non ha importanza.
  • L'elenco dei simboli utilizzabili per le password distinte sono: !"#$%&'()*+/:;<=>?@[\]^_{|}.
  • Tutte le password ldevono avere la stessa lunghezza.
  • LE PASSWORD DEVONO AVERE IL POTENZIALE DI AVVOLGERE TRA ENTRAMBE LE COLONNE.
    • Questo vale anche per le righe, ma solo per un indirizzo byte superiore (0x18-> 0x01 non è valido).
  • Lo spazio di visualizzazione per le password su entrambi i lati è largo 15 (con uno spazio su entrambi i lati).
    • Non puoi presumere che le parole in lsaranno più lunghe di così.
  • Le password sono solo alfabetiche, ovvero solo lettere.

Esempio:

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.
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

Se n = 2sullo stesso esempio:

  _____________________________________________________
 /                                                     \ 
|     _____________________________________________     |
|    |                                             |    |
|    | 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.
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

Questi esempi sono stati realizzati manualmente, quindi la distribuzione non è casuale, scusate.


Questo è , il conteggio di byte più basso sarà il vincitore accettato. Lo ricompenserò dopo 3 giorni se non sono state inviate risposte per un totale di 250 REP.


Presto! Nessuna risposta per 3 giorni! (prendere in giro). Questa è la mia nuova sfida ascii-art preferita.
nmjcman101,

2
@ nmjcman101 qual è stato il tuo ultimo preferito?
Magic Octopus Urn

Cosa significa il NAMESpunto 2 nel punto elenco? " può aspettare che tutte le password abbiano la stessa lunghezza, anche se questo non ha importanza " o " Tutte le password in l devono avere la stessa lunghezza. "? Può darsi che io sia cieco (di nuovo!) Ma non vedo RACESin nessuno dei due output - dovremmo intendere questo per significare che dovrebbe esserci la possibilità che una password non venga utilizzata? È Math.random(ed equivalenti) abbastanza casuale ai fini di questa sfida?
Shaggy,

2
Devono esserci distanziatori non alfanumerici tra due password o va bene se si generano uno accanto all'altro (senza sovrapposizione)?
HyperNeutrino,

5
Le password devono avere la possibilità di passare da 0x18 a 0x01?
Jonathan Allan,

Risposte:


6

JavaScript (ES8), 575 568 564 byte

Salvato 3 byte grazie a @Shaggy

Accetta input nella sintassi del curry (r)(a) , dove r è il numero di tentativi rimanenti e a è l'array di password.

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

Evidenziatore di sintassi disabilitato apposta. Non ha idea di cosa farsene.

dimostrazione


Potresti salvare qualcosa usando ES8 per popolare i tentativi in ​​questo modo Attempts Remaining:${" X".repeat(r).padEnd(8)}:?
Shaggy,

1
@Shaggy Questo fa risparmiare 3 byte. Grazie!
Arnauld,

Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining: oof ... avrei dovuto parafrasare per salvare byte non golfistici.
Magic Octopus Urn l'

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

Provalo qui!
Prevede l'input di array nello stack e il numero immette un input, quindi →"viene aggiunto nel programma online per facilità d'uso.


4

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

Tagliare 28 byte con i suggerimenti indicati da 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

Provalo online!

In precedenza:

$,=$/;$_=" 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

Provalo online!

L'input è su una riga, spazio separato: prima le stringhe, quindi il numero

Come?

$,=$/;          # 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

Bella risposta a un problema complesso! Dovresti essere in grado di salvare quasi 30 byte rimuovendo le parentesi attorno all'operatore di ripetizione, puoi aggiungere uno spazio in modo che .non sia usato come punto decimale. Inoltre per ottenere la punteggiatura è possibile utilizzare qualcosa di simile (grep/[^\w,.`-]|_/,map{chr}33..125)e non è necessario chiamare intun indice di array! Cambiare il whileloop in postfix e usare &&invece di ifdovrebbe salvare anche alcuni. Quando stai costruendo $s, se hai$s.= all'interno della mappa invece di utilizzare joinalcune gocce in più. Spero possa aiutare!
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)],())

Provalo online!

-70 byte grazie a Jonathan Allan
-9 byte grazie a me stesso (finalmente!)
-72 byte grazie a notjagan




Altri 16 rimossi! (ci deve essere un modo migliore per farlo rispetto a un mucchio di commenti)
notjagan

Altri 6 byte in meno ripristinando a metà uno dei miei altri cambiamenti (dovrei davvero smettere di commentare).
notjagan,

@notjagan Non mi dispiace commenti :) Grazie!
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))

Le etichette esadecimali sono in minuscolo; se fosse richiesto il carattere maiuscolo, sarebbero necessari ulteriori 14 byte per.toUpperCase() .

Test snippet

Meglio visto su CodePen .


È possibile salvare un byte valutando i 2 parametri e spostando le variabili nella prima repeat.
Shaggy,
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.