목록취미/TIS-100 공략 (12)
안 쓰던 블로그
문제: 1,2,3,4번 입력이 주어질 때 0->1로 바뀌면 해당 번호 출력. 하나도 없으면 0 출력 처음에는 2개씩 묶어서 입력받고 0->1로 바뀌면 해당 번호 아래로 보내고, 아니면 0보내고 아래서는 모두 0이면 0출력, 아니면 번호 출력을 했는데 아래에서 입력을 4번이나 처리하니까 순서가 밀리는 문제가 생김 어떻게 해결하냐면 1번 세그먼트 기준으로, 1. 현재 입력이 0이었으면 다음 입력이 1일 때까지 계속 0보낸 뒤 입력만 받음 2. 그러다가 현재 입력이 1이면 0->1인 경우이므로 1을 보낸 뒤 다음 입력을 받음. 다음 입력이 0이면 (1)로, 아니면 1->1인 경우이므로 0보내고 계속 반복 3. 1번, 2번 세그먼트와 3번 4번 세그먼트를 각각 더함, 그리고 그 둘을 더해서 그냥 출력(0이면 0..
처음에는 위에 사진처럼 sum에다가 3을 더하려고 했는데 무조건 3개씩 보는 게 아니라서 만약 1 1 0 0 0 1 이렇게 들어오면 1 1 0은 출력 0 1 0 0 출력 0 0 0 0 출력 1 0 0 1 출력 0 이렇게 하나씩 띄워야 되니까 너무 복잡해졌음 로직을 잘 보면(1을 그냥 1이상의 수라고 침) 1. 숫자가 들어온다 0? 1? 2. 0이면 +1누적, 다음 숫자를 받고 0? 1?을 한다 3. 1이면 0출력하고 0? 1? 4. 0이 3번이면 1출력. 누적 -1 그러니까 굳이 sum으로 하지 않아도 if(0? 1?) if(0? 1?) if(0? 1?) 이렇게 3중 if문으로 바로 처리할 수 있음 전체 코드 1. 0이 들어올 때까지 계속 0을 출력한다 2. 0이 아닌 수가 들어오면 다음 수를 받고 0이..
UNCONDITIONAL Solve SIGNAL COMPARATOR without using the JGZ, JLZ, JEZ, or JNZ instructions. 문제는 값을 하나 받아서 0보다 크면 G로 0이면 E로 0보다 작으면 L로 OUT시킨다 OUT값이 1이 아니면 0을 출력해야 한다 원래 풀이 근데 여기서 0을 비교하는 조건 GZ, JLZ, JEZ, JNZ을 쓰지 않는 게 도전과제 조건이다 그럼 뭐 써야 하냐 JRO는 조건에 없으니 JRO를 쓰면 된다 JRO n은 명령어와 n줄 떨어진 행으로 이동한다 JRO 0은 모듈 실행 정지 JRO -1은 이전 행 실행 JRO 2는 다음 행 무시하고 다다음 행 실행 JRO ACC는 ACC만큼 떨어진 행 실행 처음에 입력을 받는데 5+입력값으로 받는다 왜 그..
https://foxtrotin.tistory.com/206 TIS-100 SEQUENCE REVERSER (SEGMENT 42656) 공략 0이 들어오면 0전까지 쌓인 수를 거꾸로 출력 즉 1 2 3 4 5 0이면 5 4 3 2 1 0을 출력하라는 말 고급 언어에서 이런 경우 1. 입력 받고 0인지 판단 2. 0이 아니면 스택에 값을 넣음. 길이+1 3. 0이면 스택에 foxtrotin.tistory.com 이 문제를 스택을 쓰지 않고 푸는 도전과제다 도전 과제 달성률이 2.4%로 처참해서 도전 정신을 불러일으킴ㅋㅋ 1. 0이 들어오기 전까지 값을 받는다 2. 들어온 값을 반대로 출력한다 이걸 스택을 쓰지 않고 하는 방법은 뭐가 있을까? 입력값이 5개를 넘는 케이스가 없는 것 같은데, 각 BAK마다 값..
0이 들어오면 0전까지 쌓인 수를 거꾸로 출력 즉 1 2 3 4 5 0이면 5 4 3 2 1 0을 출력하라는 말 고급 언어에서 이런 경우 1. 입력 받고 0인지 판단 2. 0이 아니면 스택에 값을 넣음. 길이+1 3. 0이면 스택에 있는 값을 길이만큼 전체 출력 순서겠고, 어셈으로 바꿔보면 1. 입력 받고 0인지 판단 2. 0이 아니면 스택에 값을 넣음. BAK에 길이+1 3. 0이면 입력 일시 정지. 스택에 있는 값을 길이BAK만큼 전체 출력 4. 출력이 끝나면 입력 다시 실행 입력을 잠시 멈추는 코드가 필요하다 안 그러면 출력하는데 다른 값을 출력하게 되니까ㅋㅋ 1번 노드에서 1번 과정을 한다 0이 아니면 계속 아래로 값을 보내고, 0이면 오른쪽에서 값이 들어올 때까지 대기한다 2번 노드에서는 위에서..
IN.A > IN.B면 IN.A-IN.B-0 순서대로 출력 IN.A < IN.B면 IN.B-IN.A-0 순서대로 출력 그냥 IN.B-IN.A하고 양수면 BA0 음수면 AB0 순서대로 출력하면 되는데 한 가지 주의할 점은 값을 두 번 쓰기 때문에 두 번 넘겨줘야 한다 로직은 그냥 두 값을 빼고 양수면 B가 더 크므로 UP-LEFT 순으로 보내고 음수면 A가 더 크므로 LEFT-UP순으로 DOWN에 보낸다 DOWN은 두 번 출력하고 0출력한다 근데 이 작업을 하는 중에는 MOV UP, ACC에서 UP에서 넘어온 값을 하나 쓰고 SUB LEFT에서 LEFT에서 넘어온 값을 하나 쓴다 근데 L: R:로 분기했을 때 MOV에서 LEFT, UP값을 한 번 더 써서 DOWN으로 넘긴다 이 때 만약 LEFT, UP에서..
IN.S값이 -1이면 IN.A값 출력 IN.S값이 1이면 IN.B값 출력 IN.S값이 0이면 IN.A+IN.B값 출력 한 노드에서 3가지 경우를 다 처리할 수 있는데 -1일 때, 1일 때, 0일 때 이렇게 3번 분기를 만들면 한 칸에 명령어줄이 부족해서 다 안 들어간다 2가지 경우만 하고 나머지일 때~ 이런 식으로 else문처럼 분기해야 한다 시작하자마자 왼쪽/오른쪽에서 값을 받는다 -1이면 L로 분기, 0이면 ZERO로 분기, 이도저도 아니면 그냥 아래 명령어 실행 L로 분기하면 LEFT값을 DOWN으로 보내주고, RIGHT를 NIL로 보낸다 ZERO로 분기하면 LEFT+RIGHT값을 DOWN으로 보내준다 이도저도 아니면(1이면) RIGHT값을 DOWN으로 보내주고, LEFT를 NIL로 보낸다 NIL로..