TAS 골프

코드 골프 트위스트 가 포함 된 툴 지원 스피드 런 스타일 에서이 과제의 목표는 선택한 프로그래밍 언어로 NES를위한 오리지널 Super Mario Bros 게임 의 세계 1-1 을 가능한 한 적은 바이트로 완료하는 것입니다. 아래에서 설명 할 형식으로 게임 내 컨트롤러 입력 만 사용합니다. 프로그램은 다음과 같은 문제를 위해 특별히 작성된이 형식의 행 목록으로 출력해야합니다 .stdout
up down left right start select A B
첫 번째 프레임부터 각 줄 바꿈은 특정 프레임에 대한 컨트롤러 1의 입력을 나타냅니다. 프레임 당 단추의 순서는 중요하지 않으며 줄 바꿈이 아닌 공백으로 분리 할 수 있습니다. 한 줄에 모두 또는 전혀 또는 일부 단추 이름을 포함 할 수 있습니다. 예를 들어, D- 패드를 3 프레임 동안 오른쪽으로 누른 다음 A를 누르는 간단한 Python 프로그램은 다음과 같습니다.
for _ in range(3): print('right')
print('A')
그리고 출력 (확인하기 위해 에뮬레이터에 공급할 것임)은 다음과 같습니다.
right
right
right
A
여기서 우리는 '성공'을 위의 세계 1-1 끝에서 깃발에 도달하는 것으로 정의합니다. 이 예제의 파이썬 제출에 대한 점수 (성공하지 않은 경우)는 44 바이트 또는 원래 길이의 Python 프로그램입니다.
현재 가장 빠른 TAS 기반으로 생성 한 작업 입력 파일의 예는 다음 Github Gist를 참조하십시오. https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 이 파일은 전체 게임을 완료합니다.
서브 프레임 입력 을 입력 할 방법이 없습니다 . Player 2의 컨트롤러에는 입력을 입력 할 수있는 방법이 없지만 레벨이나 게임을 완료하는 데 필요하거나 유용하지 않아야합니다.
사용되는 SMB의 버전은 원래 USA / Japan iNES ROM (md5sum 811b027eaf99c2def7b933c5208636de)입니다. USA 버전은 일본어 버전과 동일하므로 작동합니다. ROM은 일반적으로 레이블이 붙어 Super Mario Bros (JU) (PRG 0)있거나 비슷합니다.
제출물을 테스트하기 위해 프로그램을 실행하고 stdoutinput.txt 파일로 파이프 한 mario.lua다음이 과제에 대해 작성한 이 Lua 스크립트를 사용하여 FCEUX에로드합니다 .
for line in io.lines('input.txt') do
local t = {}
for w in line:gmatch("%S+") do
t[w] = true;
end;
joypad.set(1, t);
emu.frameadvance();
end;
while (true) do
emu.frameadvance();
end;
사용할 특정 명령은 fceux mario.nes --loadlua mario.lua입니다. 결국에는 종료해야하지만 프로그램에는 시간 제한이 없습니다.
이것은 도움이된다면 FCEUX 영화 (.fm2) 파일을 스크립트의 input.txt로 변환하기 위해 만든 작은 Bash 원 라이너입니다.
cat movie.fm2 | cut -d'|' -f 3 | sed 's/\.//g' | sed 's/R/right /g' | sed 's/L/left /g' | sed 's/D/down /g' | sed 's/U/up /g' | sed 's/T/start /g' | sed 's/S/select /g' | sed 's/B/B /g' | sed 's/A/A /g' | tail -n +13 > input.txt
참고로, 다음은 세계 1-1의 고해상도지도입니다 (전체 해상도를 위해 새 탭에서 이미지 열기) : (source : mariouniverse.com )
참고 : 언뜻보기에 이것은 주어진 input.txt 파일에서 Kolmogorov 복잡성 문제처럼 보일 수 있습니다. 그러나 실제로 문제는 (a) 내가 제공 한 input.txt가 가장 짧지 않고 (b)이 형식으로 SMB에 대해 가장 짧은 키 누르기를 만들려는 시도가 없었기 때문에 그 문제보다 더 복잡합니다. . TAS로 알려진 '가장 작은 버튼'은 버튼을 오랫동안 누르고 있기 때문에이 도전에서 원하는 출력에 길이를 더할 수 있기 때문에 다릅니다.