팩토리오에서 n진수 디스플레이를 만들어보자.
https://wiki.factorio.com/Arithmetic_combinator
https://wiki.factorio.com/Tutorial:Circuit_network_cookbook
를 읽고 오면 도움이 될 것이다.
n진 디스플레이란 인풋으로 어떤 수가 들어오면, 그 수를 n진수로 변환하여 디스플레이 장치에 표시하는 장치이다.
이게 어떻게 만들어지는지 이해하려면 먼저 산술연산 조합기의 SET들에 대해 알아야 한다.
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=1760
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=10372
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=13800
등등을 읽고 왔으면 바로 다음 문단으로 넘어가도 된다.
(https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=10372 에서 정의한 용어를 사용하겠음.)
*은 곱셈 연산이다.
INPUT x VAR = OUTPUT 이 되게 한다.
/은 나눗셈 연산이다.
INPUT / VAR = OUTPUT 이 되게 한다.(소숫점 아래는 버린다)
+는 덧셈 연산이다.
INPUT + VAR = OUTPUT 이 되게 한다.
-는 뺄셈 연산이다.
INPUT -VAR = OUTPUT 이 되게 한다.
^는 지수 연산이다.
(INPUT)^(VAR) = OUTPUT 이 되게 한다.
<<와 >>는 시프트 연산이다. (https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=16603 참조)
여기서 가장 중요한 것은 %(모듈러 연산)인데, 이는 나눗셈과 비슷하지만 나머지가 아니라 몫은 버린다.
예를 들면 32 나누기 6은 5...2이므로
32/6=5, 32%6=2가 된다.
이를 응용해 보자.
숫자 27894를 예시로 들면,
27894/10000 = 2
27894/1000 = 27
27894/100 = 278
27894/10 = 2789
27894/1 = 27894
그러므로
가 된다.
이를 저번에 만든 7세그먼트 디스플레이에 넣으면 된다.
상수값을 1, 10, 100... 등이 아닌 n, n^2, n^3.. 등으로 정하면 n진수가 될 것이다.
n이 10 이상일 때에는 새로운 숫자를 만들어야 한다.(일반적으로 알파벳이 사용된다)
n이 32 이상이 될 수는 없는데, 팩토리오는 32비트 정수를 사용하므로 시프트 연산으로는 32진수 이상의 진법을 나타낼 수가 없기 때문이다.
https://en.wikipedia.org/wiki/Hexadecimal - 위키백과 십육진법 항목
7세그먼트 디스플레이에 대해 추가로 설명을 더 하겠다.
a열 b행의 조명이 받아들이는 신호값과 m열 n행의 조명이 받아들이는 신호값이 굳이 다를 필요는 없다.
이 디스플레이가 0-9 사이의 숫자만 받아들이도록 되어 있고 그 숫자들 중 어떤 숫자가 입력되더라도 두 조명의 켜짐/꺼짐 상태가 같으면 신호값이 다를 이유가 없는 것이다.
아래와 같은 15세그먼트 디스플레이를 쓴다고 해 보자.
신호가 15개 필요할 것 같지만 사실 11개면 충분하다.
출처: https://forums.factorio.com/viewtopic.php?f=193&t=19825&sid=1bc80166742c245337c903251d778ff6&start=60#p282391 by DaveMcW
이를 계산해 주는 프로그램을 이미 팩토리오 포럼의 누군가가 짜 놓았다.
https://forums.factorio.com/viewtopic.php?f=193&t=19825&sid=1bc80166742c245337c903251d778ff6&start=60#p282391 by Yamanqui
굳이 신호를 줄이고 싶지 않다면 일정신호 조합기를 많이 사용함으로써 조명 수백개를 각각 조정할 수도 있을 것이다.
청사진: https://pastebin.com/gzducmDZ
내가 만든 디스플레이. 현재 (1신호) 1234567890개가 입력되고 있고 1234567890이 그대로 출력되는 것을 볼 수 있다.
맨 왼쪽 자리는 모듈로 연산을 하지 않는데, 백억의 자리는 32비트 정수에서 존재할 수가 없기 때문이다.
일정신호 조합기가 모든 산술연산 조합기를 거쳐가게 만들면서 산술연산 조합기의 수를 줄였고, 맨 오른쪽에 있는 일정신호 조합기와 조명의 빨간 네트워크는 색 신호를 내 보낸다.
맨 오른쪽 자리는 나눗셈 연산을 하지 않는데, (어떤 정수)/1은 (어떤 정수) 가 그대로 나오기 때문이다.
55분 걸림. 오늘은 여기까지.
모듈러연산은 10으로 나눌때는 %다음에 10생략함? (27894/100)%10 = 8 - dc App
분명히 썼는데 자꾸 지워지네 다시 수정함
디씨가 자꾸 %다음에 = 있는걸 뱉어내서 그냥 스샷찍어서 넣음
굳 - dc App