Fallout Terminal Hacking

13

Ist hier jemand ein eingefleischter Bethesda-Fan? Vielleicht bevorzugen Sie Obsidian Entertainment? Nun, wenn Sie eines dieser Dinge sind, sollte Ihnen das folgende Bild relativ vertraut sein.

Das Fallout-Terminal.

Ich habe mir die Freiheit genommen, eine ziemlich einzigartige ASCII-Art-Herausforderung vorzubereiten. Hier ist der erste Hinweis darauf, was Sie tun sollen:

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

Dies ist eine sehr einfache (leere) Vorlage für das RobCo Fallout-Terminaldesign in reinem ASCII. Ihre Aufgabe besteht darin,

  • Generieren Sie zunächst diese Vorlage.
  • Geben Sie dann eine Liste mit Zeichenfolgen lund eine Zahl ein 0 <= n <= 4, um sie aufzufüllen!

Die zwei dynamischen Teile eines Fallout-Hacking-Terminals sind:

Die Anzahl der Versuche

  • Die Anzahl der verbleibenden Versuche (angezeigt durch durch Leerzeichen begrenzte Kästchen).
    • Für den Zweck dieser Herausforderung werden Sie Xanstelle von verwenden .

Die Passwörter

  • Die durch definierten Passwörter lsind mit zufälligen druckbaren ASCII-Symbolen durchsetzt.
  • Die Kennwörter können, wie Sie anhand des Beispiels erkennen können, mehrere Zeilen umbrechen ( NAMES).
  • Alle Passwörter auf dem Terminalbildschirm sollten die gleiche Chance haben, an einem beliebigen Ort zu sein.
  • Es kann erwartet werden, dass alle Passwörter gleich lang sind, auch wenn dies keine Rolle spielt.
  • Die Liste der Symbole nutzbar separate Passwörter sind: !"#$%&'()*+/:;<=>?@[\]^_{|}.
  • Alle Passwörter in lmüssen gleich lang sein.
  • PASSWORTE MÜSSEN DAS POTENZIAL HABEN, ZWISCHEN BEIDEN SPALTEN ZU WICKELN.
    • Dies gilt auch für Zeilen, jedoch nur für eine höhere Byteadresse (0x18-> 0x01 ist ungültig).
  • Der Anzeigebereich für Kennwörter auf beiden Seiten ist 15 breit (mit einem Leerzeichen auf beiden Seiten).
    • Sie können davon ausgehen, dass keine Wörter llänger als diese sind.
  • Passwörter sind nur alphabetisch und bedeuten nur Buchstaben.

Beispiel:

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

Wenn n = 2im selben Beispiel:

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

Diese Beispiele wurden manuell erstellt, daher ist die Verteilung leider nicht zufällig.


Dies ist . Die niedrigste Byte-Anzahl ist der akzeptierte Gewinner. Ich werde dies nach 3 Tagen belohnen, wenn keine Antworten für insgesamt 250 REP eingereicht wurden.

Magic Octopus Urn
quelle
Schnell! Niemand antwortet für 3 Tage! (Scherz). Dies ist meine neue Lieblingsherausforderung in Sachen ASCII-Kunst.
Nmjcman101
2
@ nmjcman101 was war dein letzter Favorit?
Magic Octopus Urn
Was bedeutet der NAMES2. Aufzählungspunkt? " Es kann erwartet werden, dass alle Passwörter gleich lang sind, auch wenn dies keine Rolle spielt. " Oder " Alle Passwörter in l müssen gleich lang sein. " Es kann sein, dass ich (wieder!) Blind bin, aber ich sehe RACESin keiner der Ausgaben - sollten wir dies so verstehen, dass die Möglichkeit besteht, dass ein Passwort nicht verwendet wird? Ist Math.random(und Äquivalente) für die Zwecke dieser Herausforderung ausreichend zufällig?
Shaggy
2
Müssen zwischen zwei Passwörtern nicht-alphanumerische Abstandshalter sein oder ist es in Ordnung, wenn sie direkt nebeneinander generiert werden (nicht überlappend)?
HyperNeutrino
5
Müssen die Passwörter die Möglichkeit haben, zwischen 0x18 und 0x01 einen Zeilenumbruch durchzuführen?
Jonathan Allan

Antworten:

6

JavaScript (ES8), 575 568 564 Bytes

3 Bytes gespart dank @Shaggy

Nimmt Eingaben in Curry-Syntax vor (r)(a), wobei r die Anzahl der verbleibenden Versuche und a das Array von Kennwörtern ist.

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

Syntax-Textmarker absichtlich deaktiviert. Es hat keine Ahnung, was damit zu tun ist.

Demo

Arnauld
quelle
Könnten Sie sparen ES8 etwas mit den Versuchen zu bevölkern etwa so: Attempts Remaining:${" X".repeat(r).padEnd(8)}?
Shaggy
1
@ Shaggy Das spart 3 Bytes. Vielen Dank!
Arnauld
Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:oof ... Ich hätte umschreiben sollen, um nicht-golfende langs Bytes zu sparen.
Magic Octopus Urn
4

SOGL V0.12 , 225 Bytes

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

Probieren Sie es hier aus!
Erwartet eine Array-Eingabe auf dem Stapel und eine Zahleneingabe und eine Eingabe, so →"wird sie zur Vereinfachung im Online-Programm hinzugefügt.

dzaima
quelle
4

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

Schneiden Sie 28 Bytes mit den Vorschlägen, auf die Dom hingewiesen hat

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

Probieren Sie es online!

Vorher:

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

Probieren Sie es online!

Die Eingabe erfolgt in einer Zeile, die durch ein Leerzeichen getrennt ist: Zuerst die Zeichenfolgen, dann die Nummer

Wie?

$,=$/;          # 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
quelle
Schöne Antwort auf ein komplexes Problem! Sie sollten in der Lage sein, fast 30 Bytes zu sparen, indem Sie die Klammern um den Wiederholungsoperator entfernen. Sie können ein Leerzeichen hinzufügen, damit das .nicht als Dezimalpunkt verwendet wird. Um die Interpunktion zu erhalten, können Sie auch so etwas verwenden, (grep/[^\w,.`-]|_/,map{chr}33..125)und Sie müssen keinen intArray-Index aufrufen ! Wenn Sie die whileSchleife auf postfix ändern und &&anstelle von verwenden, ifsollten Sie auch einige speichern. Beim Bauen $s, wenn Sie $s.=innerhalb der Karte haben, anstatt joinTropfen ein paar mehr zu verwenden. Ich hoffe, das hilft!
Dom Hastings
4

Python 3 , 585 Bytes

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

Probieren Sie es online!

-70 Bytes dank Jonathan Allan
-9 Bytes dank mir (endlich!)
-72 Bytes dank Notjagan

HyperNeutrino
quelle
Und 15 weitere.
Notjagan
16 weitere entfernt! (Es muss einen besseren Weg geben, dies zu tun als eine Reihe von Kommentaren)
notjagan
Weitere 6 Bytes weniger, wenn ich eine meiner anderen Änderungen zur Hälfte rückgängig mache (ich sollte wirklich aufhören zu kommentieren).
Notjagan
@notjagan Ich habe nichts dagegen Kommentare :) Danke!
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))

Die hexadezimalen Bezeichnungen sind in Kleinbuchstaben angegeben. Wenn Großbuchstaben erforderlich wären, wären dies zusätzliche 14 Byte für .toUpperCase().

Testschnipsel

Besser drüben auf CodePen zu sehen .

Justin Mariner
quelle
Sie können ein Byte speichern, indem Sie die 2 Parameter eingeben und Ihre Variablen in den ersten verschieben repeat.
Shaggy