다시 오신 것을 환영합니다! 3 번째 CodeBots 도전 과제를 발표하게되어 기쁩니다. 이것은 제작에 오랜 시간이 걸렸습니다. 이 과제는 짧은 버전, 긴 버전 및 추가 세부 정보의 3 가지 섹션으로 나뉩니다.
짧은 버전
각 참가자는 24 명령 프로그램을 작성합니다. 이 봇은 전 세계로 이동하여 코드를 다른 봇에 복사하는 한편 다른 봇도 동일한 작업을 수행하지 못하게합니다. 가능한 명령 중 하나는 no-op Flag
입니다. 봇이 Flag
다른 봇보다 더 많은 것을 가지고 있다면 Flag
포인트를 얻습니다. 당신은 가장 많은 포인트를 가지고 승리.
위의 모든 것은 지난 두 가지 과제에 해당했습니다. 이번에는 봇이 여러 줄의 코드를 동시에 실행할 수 있습니다.
긴 버전
API
모든 봇에는 정확히 24 줄이 있으며 각 줄의 형식은 다음과 같습니다.
$label command parameters //comments
레이블과 설명은 선택 사항이며 각 명령에는 다른 매개 변수 수가 있습니다. 대소 문자를 구분하지 않습니다.
매개 변수
매개 변수는 입력되며 다음 형식 일 수 있습니다.
- 0에서 23 사이의 값입니다.
- 변수 :
A
,B
,C
,D
- 더하기를 사용하는 값 :
A+3
또는2+C
- 부호를 사용하여 지정된 코드 줄
#
(#4
5 번째 줄#C+2
을 나타내는 반면으로 계산 된 줄을 나타냄C+2
) $label
코드 줄을 지정 하는 대신 사용할 수 있습니다 .- 에 의해 지정된 상대의 변수 또는 코드 라인
*
. 상대는 당신이 직면하고있는 광장의 봇입니다. (*B
상대방의B
가치를*#9
나타내며 상대의 10 번째 줄 을 나타냅니다). 해당 사각형에 아무도 없으면 명령이 실행되지 않습니다.
명령
V 이동
봇을 움직 North+(V*90 degrees clockwise)
입니다. 움직임은 방향을 바꾸지 않습니다.
V 회전
봇을 V*90 degrees
시계 방향으로 돌립니다.
폭스 바겐 복사
에 어떤 사본 V
에 W
. V
줄 번호 인 경우 줄 번호 W
여야합니다. V
변수 또는 값인 경우 변수 W
여야합니다.
깃발
아무것도하지 않습니다.
스타 TV
변수에 연결된 새 스레드를 시작합니다 V
. 즉시, 그리고 매번 턴마다 스레드는 명령을 온라인에서 실행합니다 V
.
V
이미 스레드에 연결되어 있으면 이 명령은 작동하지 않습니다. 경우 V
상대의 변수, 다음 상대는 그 변수에 부착 된 스레드를 시작합니다.
V를 중지
V
이 턴이 끝날 때 변수 에 연결된 스레드를 중지합니다 .
V 잠금
광고 또는 가변 방지 V
에 사용되는 임의의 방법 이라는 것을 제외 실 Lock
. Lock
동일한 스레드 에 의한 후속 호출이 잠금 해제 V
됩니다. 상대의 변수 또는 행에서는 잠금을 호출 할 수 없습니다.
Cond VW 인 경우
테스트 Cond
합니다. 조건이 true이면 스레드 포인터를 줄 번호로 V
, 그렇지 않으면 줄 번호로 이동합니다 W
. 그러면 해당 라인이 즉시 실행됩니다.
조건문이 될 수있다 X=Y
, X<Y
, !X
, 또는 ?X
:
X=Y
두 줄이 같은 유형이고 같은 봇에서 왔는지 테스트하거나 두 값이 같은 양인지 확인합니다.X<Y
의 값X
이보다 작은 지 여부를 테스트합니다Y
.!X
변수 또는 행X
이 잠겨 있는지 테스트합니다 (잠긴 경우 true를 리턴 함)?X
주어진 변수에 스레드가 연결되어 있는지 테스트
추가 세부 사항
멀티 스레드 상호 작용
동일한 유형의 작업이 동시에 실행됩니다. 조치는 다음 순서로 실행됩니다.
자물쇠. 여러 스레드가 변수 잠금을 시도하면 모두 실패합니다. 스레드가 변수를 잠금 해제하는 동안 다른 변수가 잠금을 시도하면 변수는 잠금 해제 상태로 유지됩니다.
스타트. 여러 스레드가 변수에서 스레드를 시작하려고하면 단일 시작으로 계산됩니다.
부. 두 스레드가 모두 같은 변수에 복사되면 변수는 임의의 값으로 끝납니다. 둘 다 같은 줄에 복사하면 둘 다 작동하지 않습니다. 스레드가 다른 스레드가 복사하는 동일한 변수에 복사하면 후자의 스레드가 임의의 값을 복사합니다. 두 스레드가 모두 동일한 변수에서 복사하는 경우 모두 정상적으로 작동합니다.
만약. 모든 조건은 동시에 테스트 된 후 스레드 변수가 업데이트됩니다. 를 실행하면
If
우선 순위가 높은 작업이 추가 될 수 있습니다. 우선 순위가 높은 작업은을 지나서 이동하기 전에 실행되고If
우선 순위가 낮은 작업은If
.움직임. 동일한 봇에서 여러 번 이동하면 봇이 모든 이동의 합을 이동합니다. 여러 봇이 같은 지점에있게되면 시작 지점으로 돌아갑니다.
회전. 같은 봇을 여러 차례 켜면 합산됩니다.
중지. 같은 변수에 여러 정지 명령이 단일 정지로 계산됩니다.
기타 세부 사항
초기 스레드가 D
변수에 연결되기 시작 합니다.
If
( If
문장 자체가 지적)로 되풀이 하면 봇이 아무것도하지 않습니다.
잠금 후 스레드가 중지되면 해당 잠금이 잠금 해제됩니다
잠긴 변수 또는 행을 사용하는 작업은 아무 것도 수행하지 않습니다.
봇이 24 줄보다 짧은 경우 나머지 줄은 Flag
시작 스레드에도 연결된 변수에 대한 쓰기를 수행하면 스레드가 다음 차례를 시작할 때 실제로 스레드가 새 값에서 실행을 시작하게됩니다.
봇은 다음과 같은 패턴으로 환상 세계에 배치됩니다.
B...B...B...
..B...B...B.
B...B...B...
언어 참조로 주석이 달린 몇 가지 샘플 봇 을 추가 했습니다 .
컨트롤러는 여기에 있습니다 . 나는 오랜 시간 동안 노력했지만 여전히 버그가 있습니다. 사양과 컨트롤러가 모순되면 사양이 정확합니다.
스코어 보드
1. 771 LockedScannerBot
2. 297 CopyAndSelfFlag
3. 289 DoubleTapBot
4. 197 ThreadCutterBot
5. 191 TripleThread
6. 180 ThickShelled
7. 155 Attacker
8. 99 RandomMover
9. 90 BananaBot
10. 56 LockedStationaryDoubleTap