낙진 터미널 해킹


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

이것은 순수 ASCII 형식의 RobCo Fallout 터미널 설계를위한 매우 기본 (빈) 템플릿입니다.

  • 먼저이 템플릿을 생성하십시오.
  • 그런 다음 문자열 목록 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.
|    |_____________________________________________|    |
|                                                       |
\_______________________________________________________/ 
       \_______________________________________/        

이 예제는 수동으로 제작되었으므로 배포가 무작위 화되지 않았습니다. 죄송합니다.


이것은 이며 가장 낮은 바이트 수는 허용 된 승자가됩니다. 총 250 REP에 대한 답변이 제출되지 않은 경우 3 일 후에 보상이 적용됩니다.


빨리! 3 일 동안 아무도 대답하지 않습니다! (교육). 이것이 제가 가장 좋아하는 아스키 아트 챌린지입니다.
nmjcman101

2
@ nmjcman101 가장 좋아하는 것은 무엇입니까?
Magic Octopus Urn

뭐라고합니까 NAMES번째 글 머리 기호의 의미? "이 암호는 중요하지 않지만 모든 암호 의 길이는 동일 해야합니다 . "또는 " l의 모든 암호는 길이가 같아야합니다. "? 그것은 단지 장님이 될 수도 있지만 (다시!) RACES두 출력에서 볼 수 없습니다 -암호를 사용하지 않을 가능성이 있음을 의미합니까? 가 Math.random이 문제의 목적을 충분히 무작위 (균등)?
Shaggy

2
두 암호 사이에 영숫자가 아닌 스페이서가 있어야합니까, 아니면 서로 바로 생성되는 경우 (겹치지 않음) 괜찮습니까?
HyperNeutrino

5
암호는 0x18에서 0x01까지 오른쪽으로 줄 바꿈 할 수 있어야합니까?
Jonathan Allan

답변:


6

자바 스크립트 (ES8), 575 568 564 바이트

@Shaggy 덕분에 3 바이트 절약

구문 무두질에서 입력을 받고, (r)(a)여기서, r은 나머지 시도의 수이고 , A는 암호의 배열이다.

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)}있습니까?
Shaggy

1
@Shaggy 3 바이트를 절약합니다. 감사!
Arnauld

Welcome to ROBCO Industries (TM) Termlink'!Password Required#}'!Attempts Remaining:oof ... 비 골프 랭스 바이트를 절약하기 위해 비난을 받아야합니다.
매직 문어 Urn

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 , 588560 + 1 (-a) = 589561 바이트

Dom이 지적한 제안으로 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루프를 postfix로 변경하고 &&대신 사용 if하면 몇 가지를 저장해야합니다. 건물을 지을 때 방울 을 사용 하는 대신 맵 안에 $s있다면 몇 방울 더 떨어집니다. 희망이 도움이됩니다! $s.=join
Dom Hastings

4

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

온라인으로 사용해보십시오!

Jonathan Allan 덕분에 -70 바이트-
나 자신 덕분에 -9 바이트 (마지막!)
notjagan 덕분에 -72 바이트




16 개 더 제거! (여러 가지 의견
보다이

다른 변경 사항 중 하나를 절반으로 되 돌리면 6 바이트 가 더 줄어 듭니다.
notjagan

@notjagan 나는 의견을 상관하지 않습니다 :) 감사합니다!
HyperNeutrino

2

자바 스크립트 (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))

16 진 레이블은 소문자입니다. 대문자가 필요한 경우에 대한 추가 14 바이트가됩니다 .toUpperCase().

테스트 스 니펫

CodePen 에서 더 잘 볼 수 있습니다.


2 개의 매개 변수를 카레하고 변수를 첫 번째로 이동하여 바이트를 절약 할 수 있습니다 repeat.
Shaggy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.