Piratage de terminaux Fallout

13

Quelqu'un ici est un fan inconditionnel de Bethesda? Peut-être que vous préférez Obsidian Entertainment? Eh bien, si vous êtes l'une de ces choses, l'image suivante devrait vous être relativement familière.

Le terminal des retombées.

J'ai pris la liberté de préparer un défi ASCII-Art plutôt unique, alors voici le premier indice de ce que je vais vous demander de faire:

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

Il s'agit d'un modèle très basique (vierge) pour la conception du terminal RobCo Fallout en ASCII pur, votre travail consistera à:

  • Générez d'abord ce modèle.
  • Ensuite, étant donné une liste de chaînes let un nombre 0 <= n <= 4à remplir!

Les deux parties dynamiques d'un terminal de piratage des retombées sont:

Le nombre de tentatives

  • Le nombre de tentatives restantes (indiqué par des cases séparées par des espaces).
    • Aux fins de ce défi, vous utiliserez Xau lieu de .

Les mots de passe

  • Les mots de passe, définis par l, sont entrecoupés de symboles ASCII imprimables aléatoires.
  • Les mots de passe, comme vous pouvez le voir dans l'exemple, peuvent encapsuler plusieurs lignes ( NAMES).
  • Tous les mots de passe dans l'écran du terminal devraient avoir une chance égale d'être n'importe où.
  • On peut s'attendre à ce que tous les mots de passe soient de longueur égale, mais cela n'a pas d'importance.
  • La liste des symboles utilisables pour séparer les mots de passe est: !"#$%&'()*+/:;<=>?@[\]^_{|} .
  • Tous les mots de passe dans l doivent être de longueur égale.
  • LES MOTS DE PASSE DOIVENT AVOIR LE POTENTIEL D'ENVELOPPER ENTRE LES DEUX COLONNES.
    • Cela vaut également pour les lignes, mais uniquement pour une adresse d'octet supérieure (0x18-> 0x01 n'est pas valide).
  • L'espace d'affichage des mots de passe de chaque côté est de 15 de large (avec un espace de chaque côté).
    • Vous pouvez supposer qu'aucun mot lne sera plus long que cela.
  • Les mots de passe sont uniquement alphabétiques, c'est-à-dire uniquement des lettres.

Exemple:

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

Si n = 2sur le même exemple:

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

Ces exemples ont été créés manuellement, donc la distribution n'est pas aléatoire, désolé.


Il s'agit du , le nombre d'octets le plus bas sera le gagnant accepté. Je remettrai ceci après 3 jours si aucune réponse n'a été soumise pour un total de 250 REP.

Urne de poulpe magique
la source
Rapide! Personne ne répond pendant 3 jours! (blague). Ceci est mon nouveau défi ascii-art préféré.
nmjcman101
2
@ nmjcman101 quel a été votre dernier favori?
Magic Octopus Urn
Que signifie le NAMESdeuxième point? " Tous les mots de passe peuvent être de même longueur, mais cela n'a pas d'importance. " Ou " Tous les mots de passe de l doivent être de même longueur. "? Il se peut que je sois aveugle (encore une fois!) Mais je ne vois RACESdans aucune des sorties - devrions-nous considérer cela comme signifiant qu'il devrait y avoir une possibilité qu'un mot de passe ne soit pas utilisé? Est - Math.random(et équivalents) suffisamment aléatoire pour les besoins de ce défi?
Shaggy
2
Doit-il y avoir des espaceurs non alphanumériques entre deux mots de passe ou est-ce correct s'ils génèrent l'un à côté de l'autre (sans chevauchement)?
HyperNeutrino
5
Les mots de passe doivent-ils avoir la possibilité de passer de 0x18 à 0x01?
Jonathan Allan

Réponses:

6

JavaScript (ES8), 575 568 564 octets

Enregistré 3 octets grâce à @Shaggy

Prend une entrée dans la syntaxe de curry (r)(a), où r est le nombre de tentatives restantes et a est le tableau de mots de passe.

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

Surligneur de syntaxe désactivé à dessein. Il n'a aucune idée de quoi faire avec ça.

Démo

Arnauld
la source
Pourriez - vous faire économiser de quoi que ce soit en utilisant ES8 pour alimenter les tentatives comme ceci: Attempts Remaining:${" X".repeat(r).padEnd(8)}?
Shaggy
1
@Shaggy Cela économise 3 octets. Merci!
Arnauld
Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:oof ... J'aurais dû paraphraser pour enregistrer les octets langs non-golf.
Urne de poulpe magique
4

SOGL V0.12 , 225 octets

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

Essayez-le ici!
Attend l'entrée du tableau sur la pile et le nombre entré et une entrée, donc→" est ajouté dans le programme en ligne pour une facilité d'utilisation.

dzaima
la source
4

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

Coupez 28 octets avec les suggestions de 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

Essayez-le en ligne!

Précédemment:

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

Essayez-le en ligne!

L'entrée est sur une ligne, séparée par des espaces: d'abord les chaînes, puis le nombre

Comment?

$,=$/;          # 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
la source
Belle réponse à un problème complexe! Vous devriez être en mesure d'économiser près de 30 octets en supprimant les crochets autour de l'opérateur de répétition, vous pouvez ajouter un espace afin que le .ne soit pas utilisé comme point décimal. Aussi pour obtenir la ponctuation, vous pouvez utiliser quelque chose comme (grep/[^\w,.`-]|_/,map{chr}33..125)et vous n'avez pas besoin d'appeler intsur un index de tableau! Changer la whileboucle en postfix et utiliser &&au lieu de ifdevrait en sauver quelques-uns aussi. Lorsque vous construisez $s, si vous avez $s.=à l'intérieur de la carte au lieu d'utiliser joinquelques gouttes de plus. J'espère que cela pourra aider!
Dom Hastings
4

Python 3 , 585 octets

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

Essayez-le en ligne!

-70 octets grâce à Jonathan Allan
-9 octets grâce à moi-même (enfin!)
-72 octets grâce à notjagan

HyperNeutrino
la source
Et 15 de plus.
notjagan
16 de plus supprimés! (il doit y avoir une meilleure façon de le faire qu'un tas de commentaires)
notjagan
Encore 6 octets de moins en annulant à moitié l'un de mes autres changements (je devrais vraiment arrêter de commenter).
notjagan
@notjagan Cela ne me dérange pas de commentaires :) Merci!
HyperNeutrino
2

JavaScript (ES8), 639 octets

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

Les étiquettes hexadécimales sont en minuscules; si des majuscules étaient nécessaires, ce serait 14 octets supplémentaires pour .toUpperCase().

Extrait de test

Mieux vu sur CodePen .

Justin Mariner
la source
Vous pouvez enregistrer un octet en curryant les 2 paramètres et en déplaçant vos variables dans le premier repeat.
Shaggy