팩토리오에서 n진수 디스플레이를 만들어보자.

https://wiki.factorio.com/Arithmetic_combinator

https://wiki.factorio.com/Tutorial:Circuit_network_cookbook

https://forums.factorio.com/viewtopic.php?f=193&t=19825&sid=1bc80166742c245337c903251d778ff6&start=60#p282391

를 읽고 오면 도움이 될 것이다.


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 에서 정의한 용어를 사용하겠음.)


viewimage.php?id=2bbcd332eac031a9&no=24b0d769e1d32ca73fed83fa11d02831dd6ec24037e3c20ed8a76d8570d8aa356597316bdad7b541a62d809dd3763d85ae388e32012dd4d28cbb5fb7422bce08c405763b

*은 곱셈 연산이다.

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

그러므로

viewimage.php?id=2bbcd332eac031a9&no=24b0d769e1d32ca73fed83fa11d02831dd6ec24037e3c20ed8a76d8571d0aa35887fc197db59c4a3d8cdb28386bf868345c4bc3603225cf9530b723f5fb7e4fcc5d6f95b

가 된다.


이를 저번에 만든 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 사이의 숫자만 받아들이도록 되어 있고 그 숫자들 중 어떤 숫자가 입력되더라도 두 조명의 켜짐/꺼짐 상태가 같으면 신호값이 다를 이유가 없는 것이다.


viewimage.php?id=2bbcd332eac031a9&no=24b0d769e1d32ca73fed83fa11d02831dd6ec24037e3c20ed8a76d8570d8aa356597316bdad7b541a62d809dd3763d85ae388e32012dd4d284e50eba4122c95f5fee1a90

아래와 같은 15세그먼트 디스플레이를 쓴다고 해 보자.

신호가 15개 필요할 것 같지만 사실 11개면 충분하다.


viewimage.php?id=2bbcd332eac031a9&no=24b0d769e1d32ca73fed83fa11d02831dd6ec24037e3c20ed8a76d8570d8aa356597316bdad7b541a62d80f0bd7e3681b7cb7c768229fbe23d207c594aaf0dbe827d93

출처: 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

굳이 신호를 줄이고 싶지 않다면 일정신호 조합기를 많이 사용함으로써 조명 수백개를 각각 조정할 수도 있을 것이다.


viewimage.php?id=2bbcd332eac031a9&no=24b0d769e1d32ca73fed83fa11d02831dd6ec24037e3c20ed8a76d8570d8aa356597316bdad7b541a62d80f0bd7e3681b7cb7c768229fbe73f20290e1eaa0dbecbf2ad

청사진: https://pastebin.com/gzducmDZ

내가 만든 디스플레이. 현재 (1신호) 1234567890개가 입력되고 있고 1234567890이 그대로 출력되는 것을 볼 수 있다.

맨 왼쪽 자리는 모듈로 연산을 하지 않는데, 백억의 자리는 32비트 정수에서 존재할 수가 없기 때문이다.

일정신호 조합기가 모든 산술연산 조합기를 거쳐가게 만들면서 산술연산 조합기의 수를 줄였고, 맨 오른쪽에 있는 일정신호 조합기와 조명의 빨간 네트워크는 색 신호를 내 보낸다.

맨 오른쪽 자리는 나눗셈 연산을 하지 않는데, (어떤 정수)/1은 (어떤 정수) 가 그대로 나오기 때문이다.


55분 걸림. 오늘은 여기까지.