참가자가 그래도 5명은 되지 않을까 기대했지만 3명밖에 없었다고 한다..
참가해준 사람들의 회로 해설 및 코멘트 진행합니다
내 회로도 몇개 들어가있음
작품1
https://factoriobin.com/post/49zvya71
내가 가장 처음에 만든버전
9조합기, 3틱
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=33953
윗글의 8. 신호 고르기 3을 상당히 참조하는 방식임
원하는 신호만 음수로 바꿔버려서 필터링하고 원하는 값을 얻는 방식인데 원 소스는 5틱이 걸렸지만 그걸 좀더 손봐서 3틱으로 줄인 구조
1번에서는 서로 다른 42개 신호에 대해 1~42 번호를 매겨줌
2번에서는 노란별=점신호를 하고 있는데 만약 점신호가 20인 값이 들어온다면 20의 값을 하고 있는 J신호만 1 출력으로 나갈 수 있다
아 그리고 점신호=점신호이기 때문에 점신호 자기 자신도 1의 출력을 내보냄
3번에서는 각 신호에 대해 -0x80000000을 곱해주고 있음. 그래서 출력은 J신호 -0x80000000, 점신호 0x80000000이 됨
4번에서는 각 신호에 대해 원하는 출력값을 하나하나 적어놨음
3번과 4번의 출력이 합산되는데 이때 J신호=4-0x80000000, 점신호=0x80000000, 그 외의 신호는 양수값인 상태
이 값이 5번으로 들어감
5번에서는 음수만이 출력으로 나갈 수 있게 해놨음 그래서 출력은 J신호에 대해 4-0x80000000, 점신호에 대해 -0x80000000이 나가게 됨
근데 출력을 노란별로 안하고 점신호로 해놨기 때문에 이 값이 합쳐침
(4-0x80000000)-0x80000000 = 4
이렇게 원하는 출력이 나오게 됨
3틱이나 걸리기도 하고 모든 정의역 범위만큼 상수조합기를 써야하기 때문에 영 좋지는 않다
작품2
https://factoriobin.com/post/msTinKbU
17조합기, 1틱
치역의 범위가 1~8 이라는 점을 이용한 회로
제일 위에 상수조합기는 출력이 1이 되어야하는 입력값들이 각기 다른 신호로 설정되어있고
제일 아래 상수조합기는 출력이 8이 되어야 하는 애들을 묶어놓았음
비교조합기는 초록별=점신호를 걸어놔서 점신호가 하나라도 겹치는 애들이 있다면 정보신호가 출력으로 나가게 해놨다
왼쪽 상수조합기들에는 전부다 -2.1G의 정보신호가 걸려 있는데 얘네들은 서로 각각 다른 값이다
제일 위는 -0x80000000+1, 그다음은 -0x80000000+2 ... 마지막은 -0x80000000+8
만약 입력 점신호가 20이라면 위에서 4번째 조합기만 아무거나=20 조건을 만족하기 때문에 이 때의 출력은 -0x80000000+4를 내보낼 것이고 오른쪽 상수조합기에서는 또 -0x80000000을 내보내고 있기 때문에 이 값이 서로 상쇄되서 최종 출력 정보신호 4를 얻게 된다.
처음에는 왜 굳이 0x80000000차이나는 값을 세팅했지라고? 했는데 정의역과 치역의 범위가 겹쳐서더라고ㅋㅋ
그저 범위가 겹치지 않도록 준 offset 값이 0x80000000인거고 작품1에서 0x80000000 사용한 것과는 좀 다른 용도인셈
비록 아래의 나올 다른 작품들에 비해 조합기를 좀더 쓰긴했지만 그래도 1틱만에 원하는 답을 얻었고 나도 이런 발상은 또 상상 못했던지라 마음에 드는 답안임
참가상 페레로로쉐 받아가세요
내가 처음 문제조건을 걸 때는 입력을 무조건 점신호, 출력을 무조건 점신호로 내라고 적어뒀었는데 이 조건이 그대로 남아 있었으면 이런 회로에서 조금 난감했을 거임
점신호는 이미 조건판별에 써먹었는데 출력도 점신호로 나간다? 그럼 이 비교문 자체가 의미가 없어져버리기때문 ㅋㅋ
만약 조건을 유지했다면 정보신호로 나간걸 또 점신호로 바꾸는 과정에서 1틱이 추가 됐어야 했을것이고 이는 별로 취지에 맞지 않는 것 같아서 정보신호가 출력으로 나와도 되도록 조건을 변경했었음
작품3-1
https://factoriobin.com/post/eYIGKKqy
매우 많은 조합기,1틱
시행착오중에 나온거라지만 그래도 보기에는 재밌네
LUT에서 출력이 증가하거나 감소하는 구간마다 조합기를 달아서 누적될 값을 설정하는 식
출력 값이 잘 변하지 않는 회로였다면 꽤나 유리한 방식이였겠지만 테이블이 너무 와리가리했다 ㅋㅋ
작품3-2
https://factoriobin.com/post/oPMkTS_a
참으로 심플하다
비교 조합기에서는 아무거나=점신호 를 수행하고 출력으로는 정보신호를 1 로 내보내주고 있는데
만약 입력 점신호가 20이라면 20의 값을 가지고 있는 빠른투입기,선별투입기,묶음투입기만이 조건을 만족하고 그래서 각각 1을 출력으로 내보내서 3의 값을 얻게됨
아, 점신호=점신호니까 이것도 1의 출력이 나가서 최종 출력은 4가 나오게 된다
좀 아쉬운점이 있다면 1~21의 입력일 때는 값이 5 이하정도였지만 22~42의 입력일 때는 죄다 6이상의 값들이라서 얘네들 떄문에 일정신호기 사용량이 팍 늘었다는 점?
2등했으니 싸이버거 받아가세요
작품4
4번은 또 내가 만든거임
대회 글 올리고 나서 조금 고민하다가 만든 회로
https://factoriobin.com/post/oYRKj-HH
6조합기 1틱
작품3이랑 거의 똑같음
다만 차이점이 있다면 입력이 22 이상이면 상수 5를 더하게 해줬다는 점?
테이블을 이렇게 바꿔버린셈
덕분에 상수조합기를 꽤나 줄일 수 있었다
대회글 올리자마자 3시간만에 작품3 나온거 봤을때는 조금 식겁했음 ㅋㅋ
작품5-1
https://factoriobin.com/post/3gH1YDo5
6조합기 3틱
유일하게 이진연산을 활용한 회로
0신호 17 = 1<<4+1 = 0b000001_0001
1신호 33 = 2<<4+1 = 0b000010_0001
...
J신호 324 = 20<<4+4 = 0b010100_0100
...
하늘색신호 678 = 42<<4+372+6 = 0b101010_0110
정의역과 치역을 하나의 숫자로 묶어버린 모습
2번에서는 점신호를 <<4를 해주고 있다
이 값과 1번 상수조합기들에서 나오는 값이 3번 회로로 가서 xor 되어버리는데
만약 처음 입력신호가 20=0b010100 이였다면 <<4를 하면서 320=0b010100_0000 이 된다
이 값을 상수 조합기와 xor 한다면
0신호 : 0b000001_0001 ^ 0b010100_0000 = 0b010101_0001 >=16
1신호 : 0b000010_0001 ^ 0b010100_0000 = 0b010110_0001 >=16
...
J신호 : 0b010100_0100 ^ 0b010100_0000 = 0b000000_0100 <16
...
하늘색신호 : 0b101010_0110 ^ 0b010100_0000 = 0b111110_0000 >=16
J신호만이 상위 비트가 xor 과정에서 상쇄되어서 전부 0이 되고 그래서 혼자 16보다 작은 숫자가 나오게 된다!
4번에선 이걸 필터링해서 출력으로 내보내면 끝
3번회로에서 점신호^점신호도 하긴할텐데 어짜피 자기 자신과의 xor 결과는 0이기 때문에 출력에는 영향을 끼치지 않는다
3틱이 사용되긴 했지만 그래도 재미있는 회로
작품 5-2
https://factoriobin.com/post/j5tEryoV
작품3-1처럼 출력의 값이 변화하는 구간을 확인하는 방식이다
일단 입력이 1일 때는 1번회로에서는 아무것도 조건을 만족하지 못하기 때문에 출력이 아무것도 안나온다
아 점신호<=점신호는 만족하기 때문에 출력이 1이 나오긴 하게 된다
3번회로에서는 12개 신호에 대해서 모두 조건을 만족하기 때문에 점신호1 이 12개 나오고 점신호>=점신호 또한 만족함으로 13의 출력이 나온다
1번,3번의 출력을 합치면 14가 되는데 입력이 1일 때는 출력값이 1이여야하기 때문에 5번에서 -13을 더해주어 보정한다
입력이 차차증가하면서 8이 될때까진 출력이 변화하지 않다가 9가되면 1번 회로에서 조건을 만족하는 신호가 하나 생긴다(0 신호)
그래서 출력이 1 증가해서 2가 된다
입력이 10이 되면 1번회로에서 조건을 만족하는 신호가 2개 더 생긴다(1,2 신호) 그렇기에 출력은 2증가해서 4가 된다
입력이 13이 되면 이번엔 2번 회로에서 조건을 만족하는 신호가 2개 줄어드게 된다(1,2 신호) 그렇기에 출력은 2 감소해서 2가 된다
작품3-1에서는 값이 증가하거나 감소하는 구간이 생길 때마다 "조합기"가 하나씩 추가 되었지만
작품5-2에서는 그런 구간이 생길 때마다 상수조합기 내부에서 "신호"가 추가 되는셈
그렇기에 조합기의 개수를 극단적으로 줄일 수 있었던 것
아웃풋이 단순 증가함수였으면 나도 비슷한걸 시도해봤을 것은데 오르락 내리락하는걸 보고 난 적용해볼 생각조차 하지 못했었다
막상 알고나면 간단한건데 왜 이 발상을 못 떠올렸을까? 진짜 콜럼버스의 달걀이네
아무튼 제가 만들었던 6조합기보다 1개 더 줄였기 때문에 상품은 싸이플렉스버거세트 또는 배라쿼터입니다
뭐 받을지 말해주삼
-- 이 회로는 한글 디스플레이 회로에 성공적으로 이식되었음 --
1등을 제외한 나머지는 방명록 비밀글로 상품전달했으니 확인ㄱㄱ
그리고 대회 기간은 지났기는 했다만 만약 더 해보고 싶은 사람 있다면 추가로 제출도 받으려고 함
다음주 일요일까지는 참가하기만 하면 참가상은 계속 주려고 하니 지각자들의 열렬한 참가바람
당연하지만 이전에 제출과는 뭔가 다른 무언가가 있어야 인정됨. 틱 수는 느려도 전혀 상관 없어
그리고 벨트/투입기 쓴 버전도 보고 싶다고 ㅋㅋ
4조합기 버전은 찌꺼기 신호가 남아서 반려되었나 보네 상품은 배라 쿼터로 받겠습니다 ㄳㄳ
+) 저거 아이디어는 임의의 수열을 증가수열과 감소수열의 합으로 표현하는 알고리즘 문제를 풀어봐서 떠올릴 수 있었음ㅋㅋ 관심 생기면 알고리즘 분야 츄라이 츄라이
찌꺼기는 자칫하면 뒷회로로 퍼질수 있으니 없어야하는게 맞다고 생각했음 ㅋㅋ 방명록 확인 ㄱㄱ
수령했슴다 ㄳㄳ
저거 구현하고 싶었는데 방법이 안떠올랐는데 디게 참신해서 좋았다
해당 댓글은 삭제되었습니다.
이런것도 재밌는 주제 생기면 해보고싶긴한데 떠오르는게 별로없네 ㅋㅋ
싸이버거 잘 받았습니다. 21에 갑자기 1돼서 그냥 구현했는데 22부터는 전부 5 이상이었네
나처럼 이게 뭐에 쓰는 테이블인지 사전에 알고만 있었다면 금방 눈치챘을듯? ㅋㅋ
학회보는거같네
이런 회로 구성이나 알고리즘 짜는거 직접 해보고싶은데 어떤 영역이나 과목을 공부해야하나요
기본적으로 프로그래밍 언어(c 자바 파이썬 자바스크립트 등등)와 디지털논리회로 같은걸 깔고 가는게 좋을거고 알고리즘은 뭐 백준 같은데서 코딩문제 이것저것 풀어보는게 도움되지 않을까? 근데 팩토리오 회로는 또 팩토리오만의 특징이 있는지라 이런건 그냥 예시 보면서 감 익히는것 말곤 없는것같아
알려주셔서 감사합니다.
페레로로쉐 잘 받았습니다 그냥 기대 안하고 참가해봤는데 이게 되네 ㄷㄷ 덕분에 재밌었음