[TIS-100] segment 31904

비얌·2023년 12월 25일
0

어셈블리 게임

목록 보기
15/15
post-thumbnail

결과

아래처럼 풀어서 통과했다!

< 통계 >

  • cycle count statistics: 409
  • node count statistics: 8
  • instruction statistics: 36

문제

문제는 아래와 같다.

  • sequences are zero-terminated
  • read a sequence from IN
    • IN에서 읽는다
  • write the sum to OUT.S
    • OUT.S로는 합이 나와야 한다.
  • write the length to OUT.L
    • OUT.L로는 길이(횟수)가 나와야 한다.

풀이

가장 첫번째 줄의 왼쪽부터 노드 1, 노드 2, 노드 3이라고 하자.

노드 1은 합을 계산하고, 노드 3은 횟수를 계산한다.

노드 2는 인풋이 들어오면 0인지 아닌지 판단한다.

인풋이 0이 아닐 때

횟수 계산

노드 3으로 1을 보낸다. 노드 3에서는 1을 받으면 아래의 명령어를 통해 횟수에 1을 더한다.

간단한 ADD 1이라는 명령어 한줄이 아닌 이유는 BAK에 횟수를 저장하기 위해서이다. ACC는 노드 2로부터 가져온 값이 0인지 아닌지를 판단하는데 쓰이기 때문이다.

SWP
ADD 1
SAV

합 계산

노드1로 인풋 값을 두번 보낸다. 같은 줄이지만, 노드 1에서 둘을 받는 위치가 다르다. 첫번째 줄은 노드 1에서 받은 값이 0인지 아닌지를 판단하는데 쓰인다. 그리고 두번째 줄은 합을 구하기 위해 쓰인다.

MOV ACC, LEFT
MOV ACC, LEFT

인풋이 0이 아닐 때, 노드 1에서는 아래와 같은 명령어를 통해 합을 구한다. 이번에도 BAK에 합을 저장하기 위해 단순히 ADD RIGHT라는 명령어가 아니라 SWP, SAV를 썼다.

SWP
ADD RIGHT
SAV

인풋이 0일 때

노드 2는 0을 노드 1과 노드 3으로 보낸다. 그리고 노드 1과 노드 3은 0이 들어오면 계산을 중단하고 각각 OUT.S와 OUT.L로 결과를 내보낸다.

어려웠던 점

이 문제를 풀며 가장 어려웠던 점은 변수를 2개 사용하는 것이었다.

그래서 처음에 값을 누적하는 것을 구현하지 못해 아래처럼 누적되어야하는 값은 모두 오류가 났다.

하지만 이 점은 SWP와 SAV를 활용함으로써 해결할 수 있었다!

개선하고 싶은 점

  • 나는 노드를 8개 썼는데, 통계로는 6개를 쓴 사람이 가장 많아서 어떻게 하면 6개의 노드로 통과할 수 있는지 시도해보고 싶다.
  • 명령줄을 너무 많이 쓴 것 같다. 좀 더 간결하게 줄여보고 싶다.

회고

통계를 보면 이번 문제는 간신히 푼 것 같다😂 그래도 오랜만에 풀어서 기쁘니까 블로깅해봤다!

profile
🐹강화하고 싶은 기억을 기록하고 공유하자🐹

0개의 댓글