겨우 2팩까지 밖에 안한 주제에 내부 구현이 너무 궁금해서 코드를 뜯어봤음
정답이 큐빗 넣는 순서에 영향을 받는지, 같은 큐빗 2개가 정답이 될 수 있는지도 궁금했고
그래서 이걸 어떤 식으로 구현했는지 너무 궁금했다
코드를 직접 뜯어 본거기도 하고 내가 만든 회로도 있어서 어느정도 스포가 될 수 있으니 유의
모더 관점에서 이것저것 뒤적거리느라 내용은 좀 지저분한데 밑에 요약있음
일단 양자 해석기는 용광로로 구현되어 있기 때문에 레시피를 지정하지 않아도 아무 큐비트나 다 쳐먹도록 되어있음
양자 해석기 같은 건물은 설치할 때마다 랜덤한 스테이트를 가지고 시작함
저 initial_states는
이렇게 가질수 있는 모든 21종의 조합쌍 중 하나가 랜덤으로 지정되이고 그게 양자 해석의 답이됨
만약 답이 3-4라면 큐빗3(참큐빗)-큐빗4(탑큐빗) 순서로 넣는 큐빗4(탑큐빗)-큐빗3(참큐빗) 순서로 넣든 상관 없음
코드를 분석하면 transtions라는 테이블도 있는데 저 테이블의 내용을 일부 까보면 저런식으로 되어있음
키 값이 a-b 또는 a-b-c로 되어있는데
a-b는 initial_state 상태 중 하나임. 정답이 a-b로 정해진 상태이고 아직 아무 큐빗 입력이 없는 상태
이상태에서 c라는 큐빗이 입력된다면 state가 a-b-c로 전환됨
만약 state가 0-1일 때 3번 큐빗을 넣어서 consume-3 레시피가 동작한다면 스테이트는 0-1-3이 된다
state가 a-b-c 상태일 때 하나의 큐빗을 더 넣어준다면 이제 답이 맞냐 아니냐를 판단하게 됨
state가 0-1-0 이라면 이는 정답이 0-1이고 큐빗0이 한번 들어간 상태라는 뜻임
이때 consume-1이 발동하면 이건 정답이고 그 외에는 전부 오답임
state가 0-1-1 이라면 이는 정답이 0-1이고 큐빗1이 한번 들어간 상태라는 뜻임
이때 consume-0이 발동하면 이건 정답이고 그 외에는 전부 오답임
state가 0-1-2 이라면 이는 정답이 0-1이고 2 큐빗이 한번 들어간 상태라는 뜻임
이러면 추가로 입력된 큐빗이 뭐든간에 무조건 실패함
정답 판별에 실패했다면 실패보상으로 cube-qubits-failure-dummy(큐비트용기 1개)를 주면서 다시 state는 0-1로 돌아가게 된다.
즉 정답은 바뀌지 않은 채 처음 상태로 돌아가게 된다
정답이 바뀌지 않는 걸 응용하면 맞출때 까지 세이브 로드 신공을 발휘해서 정답을 맞추는 것이 가능하긴 하다
정답 판별에 성공했다면 성공 보상으로 cube-qubits-success-dummy(양자보정데이터)를 주고 state는 저 21개의 리스트중 하나로 다시 랜덤하게 변한다
이전과 같은 정답이 또 나올 수도 있다
state를 지속적으로 변경 시키기 위해서 울트라 큐브 모드는 매 1tick마다 양자해석기를 비롯한 모든 유사한 건물들의 상태를 스크립트를 통하여 체크함
따라서 이런 유형의 건물을 굉장히 많이 설치한다면 UPS에는 영향이 있을 것으로 추정됨
근데 뭐 이런 건물 도배 수준으로 설치하지는 않을테니 별로 상관 없으려나?
매 틱 마다 타겟이 되는 건물이 지금까지 생산한 레시피의 횟수를 저장해두는데
만약 이전 틱보다 횟수가 증가했다면 이건 레시피가 1회 동작했다는 것을 의미하고 위에 있는 transitions table을 참조하여 성공 여부를 체크하게 되어있음
주어진 조건에 맞게 state를 업데이트 시키고 그때의 보상인 product가 뭔지 확인하고 변수에 저장해둠
원래 용광로는 출력 인벤토리가 꽉찰때까지 무한하게 동작하는데
임의의 큐빗을 1회 컨슘하는 레시피 자체는 생산품이 아예 없음
따라서 원래대로라면 큐빗을 아무리 많이 소모해도 출력창이 꽉차질 않으니 출력버퍼가 차있든 안차있든간에 기계가 계속 돌면서 무한하게 소모를 할 수가 있는데
그걸 막기위해 출력 인벤토리를 검사해서 만약 더이상 템을 넣을 수 없는 상태라고 판단되면 스크립트가 강제로 해당 양자해석기를 비활성화 해버림
요로코롬 작동을 멈춰버린다
출력 인벤토리가 정상적으로 비어져 있고 위에서 임시 변수에 저장해둔 product 가 있다면
저 출력 인벤토리에 결과물을 쏘옥 내보내 준다
추가로 재미있는 연구가 하나 있는데
원래는 양자 해석이 성공하거나 실패 둘 중 하나지만
양자얽힘이라는 연구를 하게 되면 부분 정답이라는 결과가 생기게 됨
저걸 연구하고 난 후의 transitions 테이블은 이따구로 생겼는데
정답이 0-1이고 1을 한번 입력해준 상태에서
0을 넣으면 정답이 되기 때문에 정답 state로 넘어가지만
그 외의 큐빗을 넣으면 부분정답으로 취급해서 기존에 큐빗용기를 준 것 과는 다른게 6종의 큐빗 중 랜덤하게 아무거나 하나 뱉게 됨
정답이 0-1이고 2를 한번 입력해준 상태에서
0 또는 1을 넣으면 마찬가지로 부분 정답 취급해서 랜덤 비트 1개를 지급해주고
그 외의 큐빗을 넣으면 완벽한 오답으로 취급해서 빈 큐비트 용기를 지급해줌
이게 의미하는게 무엇인가
원래 이 연구를 하기 전에는 21개의 입력쌍을 무한하게 순환시켜가면서 돌리면 그만이였지만
이 연구를 한 후에는 부분 정답인 상황을 우리가 알아챈다면 무작위로 갑을 대입하는 것보다는 직전의 결과를 응용해서 더 적은 횟수로 정답을 맞출 수 있게 됨
예시 하나 들자면
0-1을 넣어본다 -> 오답이 나온다 -> 아 0과 1은 절대 안쓰이니 2,3,4,5만을 이용해야겠군
2-3을 넣어본다 -> 부분 정답이 나온다 -> 어 부분정답이니 2 또는 3중에 하나는 정답에 쓰이겠군
2-2를 넣어본다 -> 오답이 나온다 -> 2가 안쓰이니 3은 무조건 쓰이는군
답은 3-4 또는 3-5
이렇게 알고리즘적으로 1/21의 확률이던걸 획기적으로 단축할 수 있게 됨
야구게임 하는 느낌이네
근데 이걸 회로로 어케 구현하냐고?
양자 얽힘 포함 디코딩은 별로 고려하고 싶지 않고 걍 기본 공정으로다가 회로 한번 짜봤음
https://factoriobin.com/post/WfbYQDA8
한번 찍어서 맞출 확률이 1/21이기 때문에 1~21회 찍으면 맞고 평균 10회마다 맞추게 되어있음
1058개의 큐빗을 입력했을 떄 529회 정도의 시행을 했을거고 이때 45번의 정답 480번의 오답이 나왔으니 얼추 10회당 1회정답 맞게 나온 것 같음
사용한 회로는 아래 글의 작품 2번 응용함
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=55856
<span style="font-size:10pt;"><span style="font-size:10pt;">[회로 대회] Lookup table 구현하기 수상식 </span> <span style="font-size:10pt;"></span> <span style="font-size:10pt;"><span style="font-size:10pt;"><span style="font-size:10pt;">참가자가 그래도 5명은 되지 않을까 기대했지만 3명밖에 없었다고 한다.. 참가해준 사람들의 회로 해설 및 코멘트 진행합니다내 회로도 몇개 들어가있음 작품1https://factoriobin.com/post/49zv</span></span>gall.dcinside.com더 압축할 수야 있었겠지만 귀찮아
잘 돌아가는거 확인했으니 만족함
아 그리고 이것저것 테스트 하면서 느낀 건데 출력 인벤토리를 제때 제때 안비우면 간혹 동작 안해야 하는데도 계속 동작하면서 큐비트를 날려먹는 경우도 목격을 하긴했음
특히 양자얽힘 연구 이후 더 자주 발생할 것으로 보임
살짝 버그성인것 같고 이게 나중 가면 잘 해결될지는 모르겠는데 혹시 모르니 어지간해선 제때 제때 출력을 비우는 것을 추천함
요약
0. 코드 분석을 통해 어떤 매커니즘으로 양자를 해석했는지 알아보았음
1. 양자 해석 정답은 같은 큐빗2개가 정답일 수도 있고 넣는 순서를 가리지 않음 즉 6개 중 2개를 고르는 중복 조합이고 전부 21종에 대해서 고려하면 됨
2. 무지성으로 21가지의 조합을 순환하며 입력으로 넣는 회로를 짜면 양자 해석 손쉽?게 가능
3. 하지만 양자 얽힘 연구를 하고 나면 회로를 써서 더 효율적으로 정답 유추가 가능. 다만 회로 구현 난이도는 은근 높아보임
4. 양자해석기 출력 인벤토리 제대로 안비워주면 큐빗 손실 날 수도 있음
결국 사이클에 진입하면서 SR신호를 굴릴거니까 0-1에서 시작하는 순서도를 그려서 회로로 구현하면 될듯..? 처음 공정 시작할때 S신호를 넣어준다음 성공하면 R신호를 넣어서 처음부터 다시 하게끔 해주고
0-1 실패면 2-3을 선택, 반이면 0-0을 선택 이런식으로... 근데 뭐가 젤 효율적인 알고리즘인진 고민해 봐야겠네
어차피 실패의 경우 하위 그룹에 대해 재귀적인 실행을 해주면 되니 패스하고 1. 0-1넣었을때 반일경우 0/1중 참 하나 존재 2. 0-0을 넣으면 0/1사이에서 참을 가를 수있음. 3. 23을 넣으면 23/45중에 참이 어딨는지 가를 수있음. 4. 23이 참일때 0-2를 넣어보면 5. 0-2/0-3으로 확정 가능 무조건 5번 안에 굴러가게 할 수 있는거 같기도하고
실패도 함 계산해보면 1. 0-1 넣었을때 실패 일경우 2345중 2개 존재 2. 2-3 넣었을때 반일경우 (23)에서 1개, (45)에서 1개 확정 3. 2-2 넣었을때 (23)그룹에서 하나 확정(2가 참이라 가정) 4. 2-4 넣었을때 거짓이면 5. 2-5 확정
확통 까먹은지 좀 되서 확률 계산은 못하겠는데 대충 5번 이내에 뽑을 수 있을듯. 대신 회로는 좀 거대해지긴 할거 같은데
아 DLC 나오면 복귀하려 했는데 팩갤 글보다보면 팩토리오 겁나 마렵네 울트라큐브 함 해볼까
얽힘 업뎃됐네보네
번역모드 버전업완료
개추
키야ㅑㅑㅑ 개추 저거써야지