목록취미 (24)
안 쓰던 블로그
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이 왔다고 판단하고 출력하면 된다 물론 입력값에 음수가 없다는 위험한 전제가 있어야 하지만. 어쨌든 여기서는 음수가..
0이 들어올 때까지 들어온 값의 합을 저장하다가 0이 들어오면 합을 S에, 값의 길이를 L에 출력한다 한 노드 당 한 개씩 있는 ACC와 BAK을 활용해야 한다 ACC는 새로운 값이 오면 무조건 덮어씌워지므로 1. 값을 받는 노드 2. 합을 저장하는 노드 3. 길이를 저장하는 노드 이렇게 다 따로 해줘야 한다 맨 처음에 입력을 받아서 ACC값에 넣고 왼쪽, 아래, 오른쪽으로 보낸다 그냥 MOV LEFT, RIGHT, DOWN 으로 하면 다음 값을 받아서 넘어가니까 꼭 ACC에 저장한 뒤 그 값을 넘겨야 한다 내 코드에서는 값을 받아오는 노드 기준으로 오른쪽 3개가 길이 저장 왼쪽 3개가 더할 값 저장 아래 2개가 합을 저장하는 작업을 수행한다 합을 저장하는 작업을 하는 노드를 자세히 보면, UP에서 오는..
Solve SIGNAL AMPLIFIER in fewer than 100 cycles 원래 단순하게 풀면 160사이클씩 나오는 신호증폭기 문제를 100사이클 이하로 풀어야 하는 도전과제다 근데 이미 코드가 값을 받는다->두배->옮긴다 가 전부라 아니 여기서 뭘 더 줄여? 라고 생각할 수도 있는데 '병렬처리' 개념만 알면 쉽게 풀린다 1. 값을 ACC에 저장한다 2. 자기 자신을 더한다(두 배) 3. ACC값을 넘긴다 이 3사이클을 동시에 2개의 노드에서 실행한다 그러면 2개의 노드는 각자 다른 숫자를 두 배 하는 작업을 한다 예를 들어 첫 번째 수인 66을 오른쪽 노드가 두 배 작업을 하고 있을 때 아래 노드는 이미 그 다음 수인 34를 두 배 작업을 하고 있는 것 한 번에 두 개씩 처리하니 사이클이 약..
Solve SELF-TEST DIAGNOSTIC in over 100,000 cycles 맨 첫번째 문제를 100000사이클 이상을 돌려서 풀면 된다 (그냥 풀면 80정도 나옴) 루프문을 돌려서 100000번 수행하도록 만든다 어셈에서 루프는 goto문으로 작성한다 ACC에 999저장하고 LOOP1: 을 해놓고 SUB1을 한다. 그러면 한 번 돌 때마다 ACC값을 -1한다 JNZ는 ACC값이 0이 아니면 LOOP1으로 돌아간다 즉, ACC값이 0이 될 때까지 계속 그 안을 돈다 그 짓을 999번 하고 300번 더 한다 이 코드를 한 1시간 넘게 돌리면 세 번의 사이클+랜덤 숫자까지 다 사이클 101482번이 나온다 사실 딱 맞추게 돌리려면 283번인가를 돌리면 되는데 그냥 넉넉하게 해봤다 아무튼 기다리다..
IN.A와 IN.B에서 값을 받는다 OUT.P에 IN.A-IN.B 값을 쓴다 OUT.N에 IN.B-IN.A 값을 쓴다 두 값을 따로 저장하는 방법도 있지만 쉬운 난이도에서 그렇게까지 할 일이 없다 아웃값을 보면 P와 N은 부호만 다른 값이라는 걸 확인할 수 있다 처음에 A값을 ACC에 저장, B값을 바로 빼버린다 그러면 ACC에는 A-B가 있다. 이 값을 바로 P에 보내면 P는 되고, 이 값을 NEG로 부호를 반전해서 N에 보내면 N도 완료된다