안녕하세요, 월드 2의 일종으로 ! (다른 모든 문자) , 있도록하는 프로그램을 작성 세 이러한 프로그램의 인쇄 "안녕하세요, 세계!"전체 프로그램, 1, 3, 5, 등 프로그램의 문자 와 2, 4, 6, 기타
프로그램이 다음과 같은 경우 :
abc
def
"Hello, World!"를 출력해야합니다.
acdf
과
b
e
"Hello, World!"가 내장 된 솔루션이 없습니다.
안녕하세요, 월드 2의 일종으로 ! (다른 모든 문자) , 있도록하는 프로그램을 작성 세 이러한 프로그램의 인쇄 "안녕하세요, 세계!"전체 프로그램, 1, 3, 5, 등 프로그램의 문자 와 2, 4, 6, 기타
프로그램이 다음과 같은 경우 :
abc
def
"Hello, World!"를 출력해야합니다.
acdf
과
b
e
"Hello, World!"가 내장 된 솔루션이 없습니다.
답변:
PROG.COM MS-DOS 에뮬레이터 ( 예 : DOSBox) 에서 다운로드 하여 실행하십시오 .
B3 B4 B3 02 90 B3 B3 B4 02 B3 B4 B3 02 90 B3 B2
B3 48 90 B3 B3 B2 48 B3 B2 B3 48 90 B3 CD B3 21
90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 65 90 B3
B3 B2 65 B3 B2 B3 65 90 B3 CD B3 21 90 B3 B3 CD
21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2 6C B3
B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3
21 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 2C
90 B3 B3 B2 2C B3 B2 B3 2C 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 20 90 B3 B3 B2
20 B3 B2 B3 20 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 77 90 B3 B3 B2 77 B3 B2 B3
77 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 72
90 B3 B3 B2 72 B3 B2 B3 72 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2
6C B3 B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 64 90 B3 B3 B2 64 B3 B2 B3
64 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 21 90 B3 B3 B2 21 B3 B2 B3 21 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 CD B3 20
90 B3 B3 CD 20 B3 CD B3 20 90
LEFT.COM 및 RIGHT.COM도 다운로드 할 수 있습니다.
하나의 매개 변수 0xCD로 0xAB opcode 명령 을 실행하려면 다음을 작성하십시오.
코드를 실행하고 16 진수를 얻으십시오. 이진수로 변환
cat prog.hex | xxd -r -p > PROG.COM
print=="partisn't";
"ran" >="partisn't" ;
print((""" "HHeelllloo,, wwoorrlldd!! """[" ) #2">"1":: 3- 1] [ 1:-1 ]))
pit=print;"a">"ats'";pit(" Hello, world! "[ 2>1: -1 :1])
rn="ats'"
rn =print
rn("""Hello, world!""")#""":3 ][1- )
아마도 훨씬 짧아 질 수는 있지만 파이썬에서 작동하게 된 것을 기쁘게 생각합니다. 첫 번째 부분에 대한 vroomfondel의 답변 과 유사합니다 .
""""""
print("Hello, world!")
""""""#
""""
pprriinntt((""HHeelllloo,, wwoorrlldd!!""))
#"""
"""pit"el,wrd"
"""
""
print("Hello, world!")#"
"""
rn(Hlo ol!)"""#""
print("Hello, world!")
""
! """!!ddllrrooWW oolllleeHH"!!"" >~o <> o <
아니면 그냥 문자 :
"!dlroW olleH"!">o<
아니면 이상한 문자 :
!""!dlroW olleH!" ~ >o<
온라인으로 시도하십시오 : original , evens , odds .
원래 버전은 " !!ddllrrooWW oolllleeHH
"를 스택으로 푸시 한 다음, 물고기가 사이 >~o <
에 튀어 오릅니다. 그러면 글자를 삭제하고, 두 개를 인쇄하고, 두 개를 삭제하고, 두 개를 인쇄하고, 두 개를 삭제합니다. 두 개의 반 프로그램은 표준 문자열 인쇄 프로그램입니다. 까다로운 부분이 결합 된 "
및 !
올바르게 세 프로그램에서 문자열 모드에서 전환 할 수 있습니다.
120 x""!!ddllrrooWW ,,oolllleeHH""cckk,,@@
이상한 것만 :
10x"!dlroW ,olleH"ck,@
짝수 만 :
2 "!dlroW ,olleH"ck,@
전체 프로그램 :
120 Push 1, push 2, push 0.
x Pop 0 (y) and 2 (x) and set the instruction pointer's movement
delta to (x,y). That is, run the remainder of the code
by skipping every other cell.
"!dlroW ,olleH" Push the code points of the output.
ck, Print 13 characters from the top of the stack.
@ Terminate the program.
홀수 프로그램에서는 2
없어 졌으므로 10x
실제로는 아무것도하지 않습니다 ( (1,0)
어쨌든 델타를 기본값으로 설정합니다). 프로그램의 나머지 부분은 동일합니다.
짝수 프로그램에서, 우리 2
는 완전히 무시할 수있는 시작 부분을 밀어 넣습니다 . 프로그램의 나머지 부분은 이전과 동일합니다.
PPrriinntt[[""HHeelllloo,, WWoorrlldd!!""]]Print@"Hello, World!"
경고를 표시하고 인쇄 Hello, World!
하고를 반환합니다 Null PPrriinntt[["" HHeelllloo, Null, "" WWoorrlldd!!]]
. REPL이 아닌 프로그램으로 실행하면 리턴 값이 인쇄되지 않습니다.
짝수 문자를 제거한 후 :
Print["Hello, World!"]Pit"el,Wrd"
인쇄 Hello, World!
하고를 반환합니다 "el,Wrd" Null Pit
.
홀수 문자를 제거한 후 :
Print["Hello, World!"]rn@Hlo ol!
인쇄 Hello, World!
하고를 반환합니다 Null ol! rn[Hlo]
.
Евгений Новиков 의 솔루션에서 영감을 얻은이 방법을 사용하면 세 가지 변형에 대한 "분리 된"코드로 건너 뛸 수 있습니다. 여전히 lodsb; lodsb
중심점으로 사용하는 스마트 변형을 사용하려고 합니다 (따라서 모든 변형에 대해 하나의 문자열 상수 만 필요합니다)
EB 14 00 00 8A 8A 17 16 01 01 B4 B4 09 09 CD CD
21 21 CD CD 20 20 8A 1f 01 B4 09 CD 21 CD 20 48
65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 00 48 48 65
65 6c 6c 6c 6c 6f 6f 2c 2c 20 20 57 57 6f 6f 72
72 6c 6c 64 64 21 21 00 00
어린 시절부터 올바르게 기억한다면 COM의 작은 모델부터 시작 DS=CS=SS
하여 코드는에서 시작됩니다 CS:0100h
. 코드가 제로 메모리 블록에로드되었다고 보장되지는 않습니다 (보증 된 경우 2 바이트를 삭제할 수 있음).
긴 코드의 분해는
JMP *+14h
; 20 irrelevant bytes
MOV DX,message
MOV AH,09h
INT 21h; print string pointed to by DS:DX
INT 20h; exit program
message:
DB "Hello, World!\0"
DB "HHeelllloo,, WWoorrlldd!!\0\0"
홀수 코드의 분해
JMP *+00h
MOV DX,message
MOV AH,09h
INT 21h; print string pointed to by DS:DX
INT 20h; exit program
; some irrelevant bytes
message:
DB "Hello, World!\0"
짝수 코드의 분해 :
ADC AL,00h
MOV DX,message
MOV AH,09h
INT 21h; print string pointed to by DS:DX
INT 20h; exit program
; some irrelevant bytes
message:
DB "Hello, World!\0"
8A
0116에서이해야 BA
하는 대신, 문자열은 종료된다 $
,하지 NULL.
G |`
HHeelllloo,, WWoorrlldd!!
$_&
(.)\1t?
$1
홀수 위치 :
G|
Hello, World!
_
()1?$
짝수 위치 :
`
Hello, World!$&
.\t
1
전체 프로그램 :
G |`
이것은 전혀 아무것도하지 않습니다. 는 |
기존 구성 옵션이 아닙니다. 는 G
이것을 그렙 단계를 만들지 만,이 grepped 할 것도 정말없는이 아무것도하지 않도록 정규식, 어떤 비어 있습니다. 이 단계의 목적은 메인 "Hello, World!"앞에 두 개의 줄 바꿈을 두는 것입니다. 그들 중 하나는 항상 감소에서 살아남을 수 있습니다. 이것을 grep stag로 만드는 이유는 라인의 패리티를 상쇄해야하고 grep 스테이지에는 단일 라인 만 필요하기 때문입니다.
HHeelllloo,, WWoorrlldd!!
이것은 (빈) 작업 문자열을 각 문자가 두 배로 필요한 출력으로 바꿉니다.
$_&
이것은 아무것도하지 않습니다. 정규 표현식 은 문자열의 끝에 a _
와 a 를 일치 시키려고 시도합니다 &
. 물론 불가능합니다. 줄 바꿈을 없애기 위해 축소 버전의 문자가 필요합니다.
(.)\1t?
$1
마지막으로, 우리는 대체하여 중복 문자를 제거 (.)\1
와 함께 $1
. 는 t?
사용되지 않습니다하지만 다시 감소 버전에서 필요합니다.
홀수 프로그램 :
G|
Hello, World!
는 G
빈 입력과 일치하지 수 있지만, 우리는이 이유는 |
다른 빈 일치 할 수 있도록. 빈 작업 문자열을 원하는 출력으로 바꿉니다.
_
()1?$
밑줄이로 바뀌지 ()1?$
만 문자열에 밑줄이 없으므로 아무 것도 수행하지 않습니다.
짝수 프로그램 :
`
Hello, World!$&
는 `
우리가 다시 출력 작업 문자열을 대체하기 위해 빈 정규식을 사용하므로 그냥 빈 구성 문자열을 의미한다. 이번에는 삽입 $&
하지만 일치하는 항목이므로 비어 있습니다. 물론 아무것도하지 않습니다.
.\t
1
이것은 문자 뒤에 탭이있는로 대체 1
되지만 탭이 없으므로 아무 것도 없습니다.
----[[[[
print("Hello, World!")
--[[
---- ] ]
---- ] ]
pprriinntt((""HHeelllloo,, WWoorrlldd!!""))
----]]
대안 1 :
--[[
rn(Hlo ol!)-[
--]]--
print("Hello, World!")--]
대체 # 2 :
--[[pit"el,Wrd"
-[--
--]]print("Hello, World!")
--]
발전기 스크립트 : 온라인으로 사용해보십시오!
{---- }
mmaaiinn==ppuuttSSttrr""HHeelllloo,, WWoorrlldd!!""----}main=putStr"Hello, World!"
온라인으로 사용해보십시오! 구문 강조 표시가 처리하기에 주석 남용이 너무 많은 것 같습니다. {- ... -}
인라인 또는 여러 줄 주석 인 반면 --
줄 주석을 시작합니다.
홀수 문자 :
{--}
main=putStr"Hello, World!"--mi=uSrHlo ol!
짝수 문자 :
--
main=putStr"Hello, World!"--}anptt"el,Wrd"
<<<Hello\ world!||eecchhoo HHeelllloo\\ wwoorrlldd!!
기본 프로그램은 첫 번째 명령문을 성공적으로 실행하므로 부울 이후의 명령문 ||
은 무시됩니다.
홀수 / 짝수의 <<<Hello\ world!
경우 종료되지 <<heredoc
않거나 <file
stdin 에서 제공됩니다. 어느 쪽이든은이 ||
되고 |
, 그래서 첫 번째 명령에 의해 출력에 파이프와 무시는 무엇이든 echo
.
;;\\
pr[Hello, World!]er "|
pprr[[HHeelllloo,, WWoorrlldd!!]]
;;\\
|
(프로그램에는 줄 바꿈이 있습니다)
제거 된 두 가지 버전 :
;\p[el,Wrd]r"
pr[Hello, World!]
;\|
과
;\
rHlo ol!e |
pr[Hello, World!];\
(프로그램에는 줄 바꿈이 있습니다)
무엇에 대한 설명 pr
및 er
수행, 볼 이 게시물을 . 이 경우 er
단어 결정 프로 시저 이름이 제공됩니다.
\
로고 의 is 이스케이프 문자는 주석이 끝난 후 개행을 이스케이프하므로 rHlo ol!e |
제거 된 두 번째 프로그램의 두 번째 줄 ( )을 주석으로 만듭니다.
//**
alert`Hello, World`//**//aalleerrtt``HHeelllloo,, WWoorrlldd``
홀수 문자 :
/*aetHlo ol`/*/alert`Hello, World`
짝수 문자 :
/*
lr`el,Wrd/*/alert`Hello, World`
다른 답변에 대한 내 수정 버전.
l
되었습니다 HHeelllloo
.
60 바이트 코드 + 1 -p
.
$ _ =$ _ =q";HHeelllloo,, WWoorrlldd!!";;;q##;s/;|.\K.//g##
$_="Hello, World!";q#s;.K/g#
$_= q;Hello, World!;;#;/|\./#
L @""H!edlllroo,W W,oorlllde!H"" ~@"!dlroW ,olleH"
룬 문자는 흐름 제어 문자를 무작위로 제거하면 추적이 큰 고통을 겪지 만 다른 모든 문자와 같이 예측 가능한 방사선을 생성하므로 일반적으로 방사선 처리에 능숙하지 않습니까? 쉽고, 우리는 서로 반대로 바뀌어 인터리브 된 두 개의 프로그램을 인코딩 한 다음 기본 실행을 위해 세 번째 사본에 고정하고 하나의 문자로 실행되는 프로그램을 제어합니다. 프로그램 2에서 세 번째 사본은 볼 수없는 쓰레기이며 프로그램 3에서는 따옴표를 유지하여 인쇄하지 않고 튀어 나올 수 있습니다.
프로그램 1은이 부분 만 실행합니다.
L @"!dlroW ,olleH"
프로그램 2는이 부분 만 실행합니다.
" H e l l o , W o r l d ! " @
이처럼 :
"Hello, World!" @!lo olH
프로그램 3은이 부분 만 실행합니다.
L @ " ! d l r o W , o l l e H " ~ " d r W , l e "
이처럼 :
L@"!dlroW ,olleH"~"drW,le"
"drW,le"
부분이 실행되지만,이 ~
즉시 원하는 출력을 유지, 그 스택에서 팝.
순전히> <> 응답을 변환하면 프로그램이 더 짧아지고 45 바이트의 무게가 나타납니다.
! ```!!ddllrrooWW oolllleeHH`!!`` R~$ LR $ L
그러나 Runic에는> <>에는 최대 스택 크기 10 + IP 마나 (처음 10)의 제한이 있습니다. 또한 !!ddllrrooWW oolllleeHH
24자를 포함하여 R
명령 실행 직전에 만료 될 때까지 IP가 마나를 흘리게 하여 기본 프로그램에 대한 출력이 없습니다.