Злом терміналу Fallout


13

Хтось тут убогий фанат Бетесди? Можливо, ви віддаєте перевагу Obsidian Entertainment? Добре, якщо ви будь-яка з цих речей, ніж наступна картина повинна бути вам досить знайомою.

Спадковий термінал.

Я взяв на себе сміливо готувати досить унікальний виклик ASCII-Art, тож ось перша підказка щодо того, що я маю робити у вас:

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

Це дуже базовий (порожній) шаблон для дизайну терміналу RobCo Fallout в чистому ASCII, ваше завдання буде:

  • Спочатку згенеруйте цей шаблон.
  • Потім, давши список рядків lі номер, 0 <= n <= 4щоб заповнити його!

Дві динамічні частини терміналу злому випаду:

Кількість спроб

  • Кількість спроб, які у вас залишилися (позначено полями, відміченими місцями).
    • Для цього завдання ви будете використовувати Xзамість цього .

Паролі

  • Паролі, визначені l, перемежовуються з випадковими символами ASCII для друку.
  • Паролі, як ви можете сказати на прикладі, можуть містити кілька рядків ( NAMES).
  • Усі паролі на екрані терміналів повинні мати рівний шанс опинитися в будь-якому місці.
  • Очікується, що всі паролі мають однакову довжину, хоча це не має значення.
  • Список символів використовуваних для поділу паролів: !"#$%&'()*+/:;<=>?@[\]^_{|}.
  • Усі паролі lповинні бути однакової довжини.
  • ПАРОЛОГИ ПОВИННІ МАЙТЕ ПОТЕНЦІАЛЬНОГО ПОКРИТТЯ МІЖ ЗА КОЛОНАМИ.
    • Це також стосується рядків, але лише до вищої байтової адреси (0x18-> 0x01 недійсна).
  • Простір відображення паролів з обох боків - 15 ширин (з пробілом з обох боків).
    • Ви можете припустити, що жодне слово lне буде довше цього.
  • Паролі мають лише алфавіт, тобто лише літери.

Приклад:

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

Якщо n = 2на тому самому прикладі:

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

Ці приклади були створені вручну, тому розподіл не випадковий, вибачте.


Це , найнижчим число байтів буде прийнятим переможцем. Я виграю це за 3 дні, якщо не надійде відповіді на загальну суму 250 РЄ.


Швидкий! 3 дні ніхто не відповів! (жартує). Це мій новий улюблений виклик мистецтва ascii-art.
nmjcman101

2
@ nmjcman101 який був твій останній улюблений?
Чарівний восьминіг Урна

Що означає NAMESточка 2-ї кулі? " Можна очікувати, що всі паролі мають однакову довжину, хоча це не має значення. " Або " Усі паролі в l повинні бути однакової довжини. " Можливо, я просто сліпий (знову ж таки!), Але я не бачу RACESв жодному з результатів - чи слід це вважати, що має бути можливість використання пароля? Чи Math.randomдостатньо випадкових (і їх еквівалентів) для цілей цього виклику?
Shaggy

2
Чи повинні бути не алфавітно-цифрові розпірки між двома паролями, чи це нормально, якщо вони генеруються прямо поруч (не перекриваються)?
HyperNeutrino

5
Потрібно, щоб у паролів була можливість обертання від 0x18 до 0x01?
Джонатан Аллан

Відповіді:


6

JavaScript (ES8), 575 568 564 байт

Збережено 3 байти завдяки @Shaggy

Приймає вхідний сигнал в вичинки синтаксис (r)(a), де R являє собою число залишилися спроб і це масив паролів.

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

Підсвітка синтаксису відключена спеціально. Не має поняття, що з цим робити.

Демо


Чи можете ви зберегти що-небудь за допомогою ES8 для заповнення таких спроб Attempts Remaining:${" X".repeat(r).padEnd(8)}:?
Кудлатий

1
@Shaggy Це дозволяє заощадити 3 байти. Спасибі!
Арнольд

Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:oof ... я повинен був перефразовувати, щоб зберегти байтинг, який не грав у гольф.
Чарівний восьминіг Урна

4

SOGL V0.12 , 225 байт

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

Спробуйте тут!
Очікує введення масиву на стеку і число, яке вводить вхід, тому →"додається в онлайн-програму для зручності використання.


4

Perl 5 , 588 560 + 1 (-a) = 589 561 байт

Виріжте 28 байт із пропозиціями, які зазначив Дом

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

Спробуйте в Інтернеті!

Раніше:

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

Спробуйте в Інтернеті!

Введення знаходиться в одному рядку, пробіл розділений: спочатку рядки, потім число

Як?

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

Гарна відповідь на складну проблему! Ви повинні мати можливість зберегти майже 30 байт, видаливши дужки навколо оператора повторення. Ви можете додати пробіл, щоб .він не використовувався як десяткова крапка. Також для отримання пунктуації ви можете використовувати щось на кшталт, (grep/[^\w,.`-]|_/,map{chr}33..125)і вам не потрібно дзвонити intв індекс масиву! Зміна whileциклу на постфікс та використання &&замість цього також ifмає зберегти декілька. Коли ви будуєте $s, якщо у вас є $s.=всередині карти замість того, щоб використовувати joinкраплі ще кілька. Сподіваюся, що це допомагає!
Дом Гастінгс

4

Python 3 , 585 байт

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

Спробуйте в Інтернеті!

-70 байт завдяки Джонатану Аллану
-9 байт завдяки мені (нарешті!)
-72 байти завдяки ноджагану



І ще 15.
notjagan

Ще 16 вилучено! (там має бути кращий спосіб зробити це, ніж купа коментарів)
notjagan

Ще 6 байт вимкнено напівверненням однієї з моїх інших змін (я дійсно повинен припинити коментувати).
notjagan

@notjagan Я не проти коментарів :) Дякую!
HyperNeutrino

2

JavaScript (ES8), 639 байт

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

Шестнадцяткові мітки знаходяться в малих літерах; якщо потрібна велика літера, це буде додатково 14 байт .toUpperCase().

Тест-фрагмент

Краще переглядати на CodePen .


Ви можете зберегти байт, скориставшись двома параметрами і перемістивши свої змінні в перший repeat.
Shaggy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.