방사선 경화 프로그램은 코드의 문자가 제거 된 경우에도 프로그램이 동일하게 작동하는 프로그램입니다. 이 질문을 위해, 언제 조사되는지를 탐지하는 프로그램을 작성할 것입니다.
프로그램 또는 기능, 작성시 어떤 단일 바이트를 제거하고, 생성 된 프로그램 출력 할 것이다 해당 바이트 만이 바이트. ( 다른 바이트를 출력하지 않는 한 해당 바이트를 여러 번 출력 할 수 있습니다 )
규칙 :
- 프로그램에는 2 바이트 이상의 고유 바이트가 포함되어야합니다. (단지 0의 해결책은 없습니다.)
- 원래 프로그램의 기능은 중요하지 않습니다
- 자신의 소스 코드를 읽을 수 없습니다.
- 코드는 고유 바이트 수에 따라 점수가 매겨지며, 가장 많은 양이 이깁니다. 예를 들어
abc
= 3 포인트,ababba
= 2 포인트가abc
이깁니다.- 타이 브레이커는 더 작은 바이트 수이며, 제출 시간이 빠릅니다.
행운을 빕니다!
답변
05AB1E , 9 7 바이트 (점수 3)
22'''rr
제거 '
'
제거 하면 22''rr
22가 스택의 첫 번째가 '
되고 스택 의 마지막 이 되고 두 번 뒤집 으면 결과가됩니다 '
.
제거 r
하나와 r
제거 22'''r
22 결과는 스택의 첫번째 것 인, A는 '
스택에 제 것 인, 및이 r
스택에 마지막 인. r
그러나 이것은 a '
문자로 시작하여 문자 그대로 문자열 "r"
(명령과 반대로 reverse stack
)으로 암시 적으로 인쇄됩니다.
제거 2
어떤으로 2
제거, 2'''rr
A가 발생합니다 2
, 스택에 1 일이되는 '
스택에 2 일이되는 마지막 r
결과 일단 반전 스택에있는 마지막 일 것 2
.
따라서이 답변은 유효합니다. 아무것도 제거하지 않으면 출력이되므로 '
관련이 없습니다. 이것은 2 이외의 다른 숫자에서도 작동합니다.
유효성 검사기를 만들면이를 사용하여 05AB1E *에서 경쟁 할 수 있습니다.
* 05AB1E에서 가능한 솔루션 수는 100 % 확실하지 않습니다 …
더 나쁘거나 같은 더 유효한 솔루션
- 1 포인트 (잘못된)
- 2 점
'''''''VV
,'''''''XX
또는'''''''<any command that pops a without pushing>x2
'
3 이상의 홀수 # 다음에s
1 이상의 짝수 # (EG'''''''''ssss
).'''..
1 이상의 기간과'
2 이상의 홀수
- 3 점
'\\'''rr
-같은 아이디어22'''rr
이지만\
‘마지막 스택 항목 제거’입니다.
답변
Brainfuck, 3 점
출력은 메모리 덤프를 통해서만 볼 수 있으므로 비경쟁적일 수 있습니다.
+++++++++++++++++++++++++++++++++++++++++++++,-
입력이 비어 있고 EOF가 셀을 변경하지 않은 상태로 가정합니다. 같은 출력에 메모리를 덤프 통역 사용 이 하나의 .
더하기를 제거하고 메모리는 “+”의 유니 코드 값이고, 그렇지 않으면 “,”의 유니 코드 값입니다. 그래도 답변보다 규칙 벤더가 더 많습니다. “-“와 거의 동일합니다. 유니 코드 문자 집합에서이 세 문자가 서로 뒤따른다는 사실을 남용합니다.
답변
배나무, 256 개의 고유 바이트, 975 바이트
불행히도,이 질문에는 어딘가에 NUL 바이트를 포함하는 최적의 솔루션이 필요합니다 (어딘가에 256 바이트를 모두 포함해야하기 때문에). 이것은 a) TIO 링크를 제공 할 수 없다는 것을 의미합니다 (TIO는 프로그램에서 NUL을 싫어하기 때문에 또는 적어도 내 브라우저가 대처할 수있는 타이핑 방법을 찾지 못했기 때문에) b) 프로그램을 문자 그대로 Stack Exchange에 붙여 넣을 수 없습니다. 대신, xxd
아래의 “코드 스 니펫”링크 뒤에 숨겨진 가역 16 진수 덤프를 배치했습니다 .
설명
이 프로그램은 세 개의 동일한 부분으로 구성됩니다. ( 복사 프로그램에서 여러 개의 동일한 부분을 연결하는 것은 저에게있어 주제입니다 .) 모든 Pear Tree는 통역사에게 프로그램의 어느 부분을 실행할지 알려주는 체크섬이 필요합니다. 체크섬을 실행하기 전에 체크섬이 시작된 프로그램의 일부를 회전 시키거나 인쇄합니다.a partridge
체크섬이 일치하지 않으면 합니다). 이 경우 세 부분 각각에 체크섬이 있으므로 조사되지 않은 부분이 시작 부분으로 이동합니다. 따라서 프로그램이 수정되지 않은 부분으로 구성되고 그 다음에 두 개의 다른 부분 (하나가 수정되었을 수 있음)으로 구성되어 있다고 가정 할 수 있습니다.
각 부분은 개행으로 시작한 후 다음 코드로 계속 진행합니다 (아래에 공백과 주석을 추가했습니다).
$z{$/}++; # In the hash table %z, set the key "\n" to 1
$/=$\=$@; # Turn off newline handling when reading ($/ = undef);
# Also don't add newlines when printing ($\ = undef)
# $@ is set to undef by default
!$z{$_}? # If the current character is not in the hash table %z
$z{$_}=1: # place it in the hash table %z
delete$z{$_} # else remove it from the hash table %z
for split//, # for each character in
<DATA>; # the text appearing from the line beneath __DATA__ to EOF
print # Print the following (no newline because $\ was undefined):
keys%z>5? # if the hash table %z contains more than 5 elements:
"\n": # a newline; otherwise
keys%z; # every key of %z, separated by spaces
__DATA__ # Start a string literal running from after this line to EOF
그 후에는 지금까지 프로그램에서 사용되지 않은 모든 옥텟 (순수하게 점수를 매기기 위해)의 사본과 체크섬이 나온다. (후행 줄 바꿈이 없습니다. 부분은 줄 바꿈으로 시작하지만 줄 바꿈으로 끝나지 않습니다.)
여기에는 세 가지 경우가 있습니다.
- 개행 문자 이외의 문자가 삭제되었습니다 . 이 경우 두 번째와 세 번째 부분에 홀수 번 표시됩니다. 즉
%z
, 홀수 횟수 에서 추가 및 / 또는 제거되어 최종적으로 해시 테이블로 끝납니다. 사실, 해시 테이블 의 유일한 키가 될 것입니다 (두 번째 부분의 개행 이후부터 세 번째 부분의 끝까지 문자열이 실행되고 해시 테이블은 단일 개행으로 시작됨) 그냥 저절로 인쇄됩니다. - 첫 번째 또는 세 번째 줄 바꿈이 삭제되었습니다 . 이 경우 프로그램이 누락 된 줄 바꿈의 세 번째 줄이되도록 회전하여 두 번째 및 세 번째 부분을 한 줄로 효과적으로 병합합니다. 통해 액세스되는 문자열 리터럴
<DATA>
에는 모든 문자가 여러 번 포함되므로 해시 테이블에는 원래 내용과 단일 줄 바꿈이 포함되어 인쇄됩니다. - 두 번째 줄 바꿈이 삭제되었습니다 . 이 경우, 프로그램은 회전하지 않으며 (첫 번째 파트에는 유효한 체크섬이 있으므로) 두 번째 파트는 첫 번째 파트와 같은 줄로 이동합니다.
<DATA>
아래 행에서만 읽기 시작__DATA__
하므로 세 번째 부분 만 표시됩니다. 여기에는 홀수 번 표시되는 5 개 이상의 문자가 있으므로 개행을 인쇄하는 특수한 경우를 트리거합니다.
확인
방사선으로 강화 된 거의 모든 항목을 검사해야하는 마지막 한 가지 배나무 프로그램은 삭제로 인해 코드의 원하지 않는 부분이 무작위로 올바르게 체크섬되고 코드가 잘못된 위치로 회전하는지 여부가 발생합니다. 우리가 32 비트 체크섬을 사용하고 있다고 가정하면, 이것은 불가능하지만 불가능하지는 않습니다. 다음과 같은 무차별 대입 스크립트를 사용하여 삭제가 발생하지 않도록했습니다.
use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length($program) - 1)) {
my $p = $program;
my $removed = substr $p, $x, 1, "";
alarm 4;
say Dumper($p);
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
if ($out ne $removed) {
print "Unexpected output deleting character $x ($removed)\n";
print "Output: {{{\n$out}}}\n";
print "Errors: {{{\n$err}}}\n";
exit;
}
}
say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
print "Unexpected output not mutating\n";
print "Output: {{{\n$out}}}\n";
print "Errors: {{{\n$err}}}\n";
exit;
}
say "All OK!";
확인 스크립트는이 프로그램이 올바르게 작동하는지 확인합니다.
답변
Stax , 11 바이트 (점수 4)
'''cc'~~'dd
4 점 이상의 점수로이 도전에 대한 첫 번째 (연대순으로) 답변을 얻는 것이 영광입니다. 어쩌면 점수가 더 높을 수도 있습니다.
Stax에서는 단일 문자로 구성된 문자열 리터럴이로 작성 '
되므로 '', 'c, 'd, '~
모든 문자열 리터럴도 마찬가지 입니다. 에 해당하는 명령 c
d
과 ~
의미는 메인 스택의 상단을 복제하고 메인 스택의 상단을 팝한 다음 메인 스택의 상단을 팝하고 입력 스택으로 푸시합니다. 이 문제의 경우, 입력 스택 출력에 영향을주지하고 중요하지 않으며, 따라서 우리는 말할 수 d
와~
동일하다.
설명
코드를 여러 부분으로 나누고 별도로 고려하는 것이 가장 좋습니다.
변조되지 않은 '''cc
경우 리터럴 '
과 리터럴 c
을 기본 스택으로 푸시하고 맨 위를 복제하므로 스택은 (에서 아래로) c,c,'
됩니다.
변조되지 않은 '~~
경우 리터럴을 푸시 한 ~
다음 팝업하여 입력 스택으로 푸시합니다. 기본적으로 기본 스택에는 아무런 문제가 없습니다.
변조되지 않은 'dd
경우 리터럴을 푸시 한 d
다음 주 스택에 대한 또 다른 no-op를 팝합니다.
프로그램이 끝나면 명시적인 출력이 수행되지 않기 때문에 메인 스택의 상단이 내재적으로 인쇄됩니다.
프로그램이있는 그대로 실행중인 경우 최종 스택은 여전히 c,c,'
이고 출력 c
됩니다.
첫 번째 부분이 ''cc
이면 리터럴 '
과 두 개의 복사 명령이 있으며 최종 스택은입니다 ',','
. 다른 두 부분이 작동하지 않으면 결과는'
.
첫 번째 부분이가 '''c
되면 결과는 기본적으로 변경되지 않은 부분과 동일하지만 c
복제되지 않습니다. 따라서 스택은입니다 c,'
. 두 번의 노 업 이후 스택의 맨 위는 c
입니다.
첫 번째 부분에서 방사선을 감지 할 수 있습니다.
두 번째 부분과 세 번째 부분은 정확히 같은 방식으로 작동합니다. 세 번째 부분을 예로 들어 보겠습니다.
세 번째 부분이 훼손된 경우 처음 두 부분은 그대로 유지되며 세 번째 부분을 실행하기 전의 스택은 c,c,'
세 번째 부분이가 'd
되면 리터럴 d
이 기본 스택의 맨 위로 밀리고 더 이상 수행되지 않습니다. 메인 스택의 상단은 이제d
이 출력됩니다.
세 번째 부분이가되면 dd
주 스택에서 두 개의 요소가 팝되고 이제 스택의 맨 위 '
가 출력됩니다.
따라서 우리는 세 번째 부분에서 방사선을 감지 할 수 있습니다. 같은 이유로 두 번째 부분에서 방사선을 감지 할 수 있습니다.
답변
05AB1E , 점수 2, 6 바이트
„"""„„
제거 된 문자를 가끔 두 배로 인쇄합니다. 을 포함하지 않습니다 '
.
작동 방식 :
첫 번째 제거 „
"""„„
먼저 빈 문자열 리터럴을 스택에 푸시합니다. 그런 다음 푸시„„
암시 적으로 인쇄되는 .
제거 "
„""„„
먼저 명령으로 ""
스택에 푸시 합니다 2-char string
. 그런 다음 또 다른 2 문자 문자열을 얻으려고 시도하지만 이것이 중단되고 (왜 그런지 잘 모르겠습니다) ""
인쇄됩니다.
두 번째 또는 세 번째 제거 „
„"""„
먼저 명령으로 ""
스택에 푸시 합니다 2-char string
. 그런 다음 „
암시 적으로 인쇄되는 을 누릅니다 .
답변
젤리 , 5 바이트, 점수 2
”””ḷḷ
어떤으로 ”
제거 :
””ḷḷ
문자 ”
는 1 바이트 문자 리터럴로 시작합니다. 이 프로그램은 ””
문자열을 생성하는 것으로 시작 합니다 ”
. ḷ
다이 애드가의 왼쪽 인수를 사용합니다. 문자열 ”
은의 두 인스턴스를 통해 전달됩니다 ḷ
.
어떤으로 ḷ
제거 :
”””ḷ
이 프로그램 ””
에서 문자 ”
를 ”ḷ
생성 한 다음 문자 를 생성하며이 ḷ
결과 만 출력됩니다.
다른 솔루션
- 같은 다른 많은 문자
a
또는o
대신에 일한 것ḷ
이 제출. ⁾⁾⁾⁾FFF
. 이것은 비슷한 방식으로 작동합니다.⁾
비슷”
하지만 그것은 시작 두 바이트 문자열 리터럴을. “조사 된”프로그램은 삭제 된 바이트를 두 번 출력하며 이는 주석에서 유효하다고 판명되었습니다.
다음 은 Magic Octopus Urn의 유효성 검사기입니다. 출력의 왼쪽 열은 삭제 된 문자이고 오른쪽 열은 결과 프로그램의 출력입니다.