Fallout Terminal Hacking

13

Alguém aqui é um fã obstinado da Bethesda? Talvez você prefira a Obsidian Entertainment? Bem, se você é uma dessas coisas, a imagem a seguir deve ser relativamente familiar para você.

O terminal de precipitação.

Tomei a liberdade de preparar um desafio ASCII-Art bastante singular, então aqui está a primeira pista sobre o que vou fazer com que você faça:

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

Este é um modelo (em branco) muito básico para o design do terminal RobCo Fallout em ASCII puro, seu trabalho será:

  • Primeiro, gere este modelo.
  • Então, dada uma lista de strings le um número 0 <= n <= 4para preenchê-lo!

As duas partes dinâmicas de um terminal de hacking de precipitação são:

O número de tentativas

  • O número de tentativas restantes (indicadas por caixas delimitadas por espaço.
    • Para o objetivo deste desafio, você usará em Xvez de .

As senhas

  • As senhas, definidas por l , são intercaladas com símbolos ASCII imprimíveis aleatórios.
  • As senhas, como você pode ver pelo exemplo, podem quebrar várias linhas (NAMES ).
  • Todas as senhas na tela do terminal devem ter a mesma chance de estar em qualquer lugar.
  • Pode-se esperar que todas as senhas tenham o mesmo comprimento, embora isso não importe.
  • A lista de símbolos utilizáveis ​​para separar senhas são: !"#$%&'()*+/:;<=>?@[\]^_{|} .
  • Todas as senhas em l devem ter o mesmo comprimento.
  • AS SENHAS DEVEM TER POTENCIAL DE ENVOLVER ENTRE AMBAS AS COLUNAS.
    • Isso também vale para linhas, mas apenas para um endereço de bytes mais alto (0x18-> 0x01 é inválido).
  • O espaço de exibição de senhas em ambos os lados tem 15 de largura (com um espaço em ambos os lados).
    • Você pode assumir que nenhuma palavra lserá maior que isso.
  • As senhas são apenas alfabéticas, significando apenas letras.

Exemplo:

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 = 2no mesmo exemplo:

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

Esses exemplos foram criados manualmente, então a distribuição não é aleatória, desculpe.


Este é o , o menor número de bytes será o vencedor aceito. Recompensarei isso após 3 dias, se nenhuma resposta tiver sido enviada para um total de 250 REP.

Urna de polvo mágico
fonte
Rápido! Ninguém responde por 3 dias! (brincando). Este é o meu novo desafio ascii-art favorito.
precisa saber é o seguinte
2
@ nmjcman101 qual foi seu último favorito?
Magic Octopus Urn
O que significa o NAMESno 2º marcador? " Pode-se esperar que todas as senhas tenham o mesmo comprimento, embora isso não importe. " Ou " Todas as senhas em l devem ter o mesmo comprimento. "? Pode ser que eu esteja cego (de novo!), Mas não vejo RACESem nenhum resultado - devemos considerar isso como uma possibilidade de uma senha não estar sendo usada? É Math.random(e equivalentes) suficientemente aleatório para os objetivos deste desafio?
Shaggy
2
É necessário que haja espaçadores não alfanuméricos entre duas senhas ou é bom se eles gerarem um ao lado do outro (sem sobreposição)?
HyperNeutrino
5
As senhas precisam ter a possibilidade de agrupar de 0x18 a 0x01?
Jonathan Allan

Respostas:

6

JavaScript (ES8), 575 568 564 bytes

Guardado 3 bytes graças a @Shaggy

Recebe entrada na sintaxe de curry (r)(a), onde r é o número de tentativas restantes e a é a matriz de senhas.

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

Marcador de sintaxe desativado de propósito. Não tem idéia do que fazer com isso.

Demo

Arnauld
fonte
Você poderia salvar algo usando o ES8 para preencher as tentativas da seguinte forma Attempts Remaining:${" X".repeat(r).padEnd(8)}:?
Shaggy
1
@ Shaggy Isso economiza 3 bytes. Obrigado!
Arnauld
Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:oof ... Eu deveria ter parafraseado para salvar bytes de langs sem golfe.
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

Experimente aqui!
Espera a entrada da matriz na pilha e o número de entrada como uma entrada, portanto, →"é adicionado ao programa on-line para facilitar o uso.

dzaima
fonte
4

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

Corte 28 bytes com as sugestões apontadas por 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

Experimente online!

Anteriormente:

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

Experimente online!

A entrada está em uma linha, espaço separado: primeiro as seqüências de caracteres, depois o número

Quão?

$,=$/;          # 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
fonte
Ótima resposta para um problema complexo! Você poderá salvar quase 30 bytes removendo os colchetes ao redor do operador de repetição. Você pode adicionar um espaço para que ele .não seja usado como ponto decimal. Também para obter a pontuação, você pode usar algo como (grep/[^\w,.`-]|_/,map{chr}33..125)e não precisa chamar intum índice de matriz! Alterar o whileloop para postfix e usar em &&vez de ifdeve salvar alguns também. Quando você está construindo $s, se você tiver $s.=dentro do mapa, em vez de usar joingotas mais algumas. Espero que ajude!
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)],())

Experimente online!

-70 bytes graças a Jonathan Allan
-9 bytes graças a mim mesmo (finalmente!)
-72 bytes graças a notjagan

HyperNeutrino
fonte
Mais 35 bytes de desconto!
precisa saber é o seguinte
E mais 15.
precisa saber é o seguinte
Mais 16 removidos! (tem de haver melhor maneira de fazer isso do que um monte de comentários)
notjagan
Outros 6 bytes de distância revertendo pela metade uma das minhas outras alterações (eu realmente deveria parar de comentar).
notjagan
@notjagan Não me importo de comentários :) Obrigado!
precisa saber é o seguinte
2

JavaScript (ES8), 639 bytes

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

Os rótulos hexagonais estão em minúsculas; se maiúsculas fosse necessária, seriam 14 bytes adicionais para .toUpperCase().

Snippet de teste

Melhor visualizado no CodePen .

Justin Mariner
fonte
Você pode salvar um byte, agrupando os 2 parâmetros e movendo suas variáveis ​​para o primeiro repeat.
Shaggy