목록TIS-100 (8)
안 쓰던 블로그
문제: 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이..
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로..
Solve SEQUENCE COUNTER without using the SWP instruction 그냥 풀면 이렇게 풀린다 https://foxtrotin.tistory.com/200 원래는 BAK에 값을 저장하다가 0이 오면 출력하는 방법으로 풀었는데 BAK을 쓰지 않는다면 ACC만 쓰면 된다 ACC만 쓰려면 0이 올 때까지 수를 그냥 ACC에 계속 누적하다가, 0이 오면 출력하는 방법으로 하면 되긴 할텐데 그러면 ACC에 새로운 값이 들어오면 누적값이 없어지는 거 아니야? 할 수도 있음 의외로 되게 간단한 방법이 있는데 0이 오면 터무니 없는 음수 값을 ACC에 더하고, 0이하라면 0이 왔다고 판단하고 출력하면 된다 물론 입력값에 음수가 없다는 위험한 전제가 있어야 하지만. 어쨌든 여기서는 음수가..