수신 글리프 그리기


16

에서 위치 기반 AR 모바일 게임 삶의 방식 침투 플레이어는 아이템을 얻기 위해 포털라는 일을 해킹 할 수 있습니다. (Ingress에 관심이 있다면 더 많은 정보를 얻으려면 채팅에 나를 핑할 수 있습니다. 나를 믿으십시오. Pokémon보다 낫습니다. 다운로드가 끝나면 저항을 선택하십시오.)

해킹 출력을 크게 늘리는 방법은 글리프 해킹 미니 게임으로 플레이어는 6 각형 그리드에 글리프를 그려야합니다.

글리프 그리드

실제로 게임에서 실제로 사용되는 약 130 개의 이름을 가진 약 115 개의 글리프가 있습니다.

글리프

이 과제의 목적을 위해 다음과 같이 그리드의 각 점에 번호를 매 깁니다.

숫자 글리프 그리드

이 도전의 목적을위한 모든 글리프의 목록은 다음과 같습니다. 목록은 각 글리프를 가장자리 목록으로 포함하는 JSON 객체입니다.

{
"ABANDON": [[1, 6], [3, 4], [4, 8], [6, 10], [8, 10]],
"ACCEPT": [[3, 7], [3, 8], [7, 8]],
"ADVANCE": [[0, 9], [4, 9]],
"AFTER": [[1, 2], [1, 6], [2, 7], [6, 10], [7, 10]],
"AGAIN": [[4, 9], [6, 7], [6, 10], [8, 9], [8, 10]],
"ALL": [[0, 1], [0, 5], [1, 2], [2, 3], [3, 4], [4, 5]],
"ANSWER": [[6, 7], [6, 9], [7, 10]],
"ATTACK": [[0, 6], [0, 9], [2, 6], [4, 9]],
"AVOID": [[0, 5], [0, 6], [1, 6], [1, 7]],
"BALANCE": [[0, 10], [2, 3], [2, 7], [3, 4], [4, 8], [7, 10], [8, 10]],
"BARRIER": [[0, 10], [2, 7], [7, 10]],
"BEFORE": [[4, 5], [4, 8], [5, 9], [8, 10], [9, 10]],
"BEGIN": [[0, 8], [3, 7], [3, 8]],
"BODY": [[6, 9], [6, 10], [9, 10]],
"BREATHE": [[1, 6], [5, 9], [6, 10], [9, 10]],
"CAPTURE": [[1, 7], [3, 4], [4, 8], [7, 10], [8, 10]],
"CHANGE": [[3, 7], [3, 10], [8, 10]],
"CHAOS": [[0, 1], [0, 5], [1, 6], [3, 8], [4, 5], [6, 10], [8, 10]],
"CIVILIZATION": [[1, 6], [5, 9], [6, 7], [7, 8], [8, 9]],
"CLEAR": [[0, 10], [3, 10]],
"CLEAR ALL": [[0, 1], [0, 5], [0, 10], [1, 2], [2, 3], [3, 4], [3, 10], [4, 5]],
"COMPLEX": [[6, 9], [8, 10], [9, 10]],
"CONFLICT": [[2, 6], [4, 9], [6, 7], [7, 8], [8, 9]],
"CONTEMPLATE": [[0, 1], [1, 2], [2, 3], [3, 8], [6, 10], [8, 9], [9, 10]],
"COURAGE": [[4, 9], [7, 8], [8, 9]],
"CREATE": [[1, 6], [4, 8], [6, 10], [8, 10]],
"DANGER": [[0, 9], [3, 10], [9, 10]],
"DATA": [[0, 6], [3, 8], [6, 10], [8, 10]],
"DEFEND": [[1, 7], [3, 7], [3, 8], [5, 8]],
"DESTINY": [[3, 8], [6, 7], [6, 10], [7, 8], [9, 10]],
"DESTROY": [[2, 7], [5, 9], [7, 10], [9, 10]],
"DETERIORATE": [[4, 8], [8, 10], [9, 10]],
"DIE": [[2, 7], [4, 8], [7, 10], [8, 10]],
"DIFFICULT": [[1, 6], [6, 7], [7, 10], [8, 10]],
"DISCOVER": [[1, 2], [2, 3], [3, 4]],
"DISTANCE": [[0, 5], [4, 5]],
"EASY": [[3, 8], [6, 10], [8, 10]],
"END": [[0, 1], [0, 10], [1, 7], [3, 7], [3, 10]],
"ENLIGHTENED": [[0, 1], [0, 9], [1, 2], [2, 3], [6, 9], [6, 10], [9, 10]],
"ENLIGHTENMENT": [[0, 1], [0, 9], [1, 2], [2, 3], [6, 9], [6, 10], [9, 10]],
"EQUAL": [[6, 7], [6, 9], [8, 9]],
"ESCAPE": [[0, 1], [1, 6], [6, 9], [8, 9]],
"EVOLUTION": [[0, 10], [8, 9], [9, 10]],
"FAILURE": [[0, 10], [6, 7], [6, 10]],
"FEAR": [[1, 7], [6, 7], [6, 9]],
"FOLLOW": [[0, 6], [1, 2], [1, 6]],
"FORGET": [[4, 8]],
"FUTURE": [[1, 6], [2, 7], [6, 7]],
"GAIN": [[5, 8]],
"GROW": [[4, 9], [8, 9]],
"HARM": [[0, 6], [0, 9], [2, 7], [6, 10], [7, 10], [9, 10]],
"HARMONY": [[0, 6], [0, 9], [3, 7], [3, 8], [6, 10], [7, 10], [8, 10], [9, 10]],
"HAVE": [[3, 8], [7, 10], [8, 10]],
"HELP": [[5, 9], [7, 8], [8, 10], [9, 10]],
"HIDE": [[1, 6], [1, 7], [6, 9], [7, 8]],
"HUMAN": [[3, 7], [3, 8], [6, 7], [6, 9], [8, 9]],
"IDEA": [[1, 2], [1, 6], [2, 7], [4, 5], [4, 8], [5, 9], [7, 10], [9, 10]],
"IGNORE": [[2, 7]],
"IMPERFECT": [[6, 8], [6, 10], [8, 9], [8, 10], [9, 10]],
"IMPROVE": [[1, 6], [6, 10], [7, 10]],
"IMPURE": [[3, 10], [8, 9], [8, 10], [9, 10]],
"INSIDE": [[6, 7], [6, 9]],
"INTELLIGENCE": [[1, 6], [4, 8], [6, 10], [8, 9], [9, 10]],
"INTERRUPT": [[0, 10], [3, 10], [4, 5], [4, 8], [5, 9], [8, 10], [9, 10]],
"JOURNEY": [[1, 6], [2, 3], [3, 4], [4, 5], [5, 9], [6, 10], [9, 10]],
"KNOWLEDGE": [[3, 6], [3, 9], [6, 10], [9, 10]],
"LEAD": [[0, 5], [3, 8], [4, 5], [4, 8]],
"LEGACY": [[0, 1], [0, 5], [1, 6], [2, 7], [4, 8], [5, 9], [6, 7], [8, 9]],
"LESS": [[6, 10], [9, 10]],
"LIBERATE": [[0, 1], [1, 6], [4, 9], [6, 10], [9, 10]],
"LIE": [[6, 7], [6, 10], [7, 10], [8, 9], [9, 10]],
"LOSE": [[1, 7]],
"MESSAGE": [[1, 7], [4, 9], [7, 10], [9, 10]],
"MIND": [[3, 8], [3, 10], [8, 9], [9, 10]],
"MORE": [[7, 10], [8, 10]],
"MYSTERY": [[0, 6], [0, 9], [5, 9], [6, 9], [8, 9]],
"N'ZEER": [[0, 6], [0, 9], [0, 10], [3, 10], [6, 10], [9, 10]],
"NATURE": [[2, 7], [4, 8], [6, 7], [6, 9], [8, 9]],
"NEW": [[2, 7], [6, 7]],
"NO": [[6, 7], [6, 9]],
"NOT": [[6, 7], [6, 9]],
"NOURISH": [[3, 4], [3, 10], [4, 8], [8, 10]],
"NOW": [[6, 7], [7, 8], [8, 9]],
"OLD": [[5, 9], [8, 9]],
"OPEN": [[3, 7], [3, 8], [7, 8]],
"OPEN ALL": [[0, 1], [0, 5], [1, 2], [2, 3], [3, 4], [3, 7], [3, 8], [4, 5], [7, 8]],
"OUTSIDE": [[0, 5], [4, 5]],
"PAST": [[4, 8], [5, 9], [8, 9]],
"PATH": [[0, 10], [4, 8], [8, 10]],
"PEACE": [[0, 6], [0, 9], [3, 7], [3, 8], [6, 10], [7, 10], [8, 10], [9, 10]],
"PERFECTION": [[0, 10], [2, 3], [2, 7], [3, 4], [4, 8], [7, 10], [8, 10]],
"PERSPECTIVE": [[0, 6], [0, 9], [2, 7], [4, 8], [6, 10], [7, 10], [8, 10], [9, 10]],
"PORTAL": [[1, 2], [1, 6], [2, 7], [4, 5], [4, 8], [5, 9], [6, 9], [7, 8]],
"POTENTIAL": [[0, 10], [1, 2], [2, 7], [7, 10]],
"PRESENT": [[6, 7], [7, 8], [8, 9]],
"PURE": [[0, 10], [6, 7], [6, 10], [7, 10]],
"PURSUE": [[0, 6], [0, 9], [5, 9]],
"QUESTION": [[0, 6], [6, 9], [8, 9]],
"REACT": [[2, 7], [6, 9], [7, 10], [9, 10]],
"REBEL": [[1, 2], [1, 6], [5, 8], [6, 10], [8, 10]],
"RECHARGE": [[0, 5], [0, 10], [5, 9], [9, 10]],
"REPAIR": [[0, 5], [0, 10], [5, 9], [9, 10]],
"REPEAT": [[4, 9], [6, 7], [6, 10], [8, 9], [8, 10]],
"RESISTANCE": [[0, 9], [0, 10], [3, 8], [3, 10], [6, 9]],
"RESTRAINT": [[2, 3], [2, 7], [5, 9], [7, 10], [9, 10]],
"RETREAT": [[0, 6], [2, 6]],
"SAFETY": [[2, 6], [4, 9], [6, 9]],
"SAVE": [[1, 7], [7, 10], [8, 10]],
"SEARCH": [[6, 9], [6, 10], [7, 8], [8, 9]],
"SEE": [[0, 9]],
"SEPARATE": [[2, 7], [5, 9], [6, 7], [6, 10], [8, 9], [8, 10]],
"SHAPER": [[0, 6], [0, 9], [2, 7], [4, 8], [6, 7], [8, 9]],
"SIMPLE": [[7, 8]],
"SOUL": [[3, 7], [3, 10], [6, 7], [6, 10]],
"STABILITY": [[2, 7], [4, 8], [7, 8]],
"STAY": [[2, 7], [4, 8], [7, 8]],
"STRONG": [[6, 7], [6, 9], [7, 8], [8, 9]],
"STRUGGLE": [[0, 9], [0, 10], [3, 8], [3, 10], [6, 9]],
"SUCCESS": [[0, 10], [8, 9], [9, 10]],
"TECHNOLOGY": [[1, 6], [2, 7], [6, 10], [7, 10], [8, 9], [8, 10], [9, 10]],
"THOUGHT": [[1, 2], [1, 6], [2, 7], [4, 5], [4, 8], [5, 9], [7, 10], [9, 10]],
"TOGETHER": [[4, 8], [6, 9], [6, 10], [8, 10], [9, 10]],
"TRUTH": [[6, 7], [6, 10], [7, 10], [8, 9], [8, 10], [9, 10]],
"UNBOUNDED": [[0, 1], [0, 5], [1, 7], [2, 3], [3, 4], [4, 5], [6, 9], [6, 10], [7, 8], [8, 9]],
"US": [[3, 6], [6, 9]],
"USE": [[1, 7], [7, 10]],
"WANT": [[3, 7], [3, 8], [4, 8]],
"WAR": [[0, 6], [0, 9], [2, 6], [4, 9]],
"WEAK": [[5, 9], [6, 7], [6, 9]],
"XM": [[6, 7], [6, 9], [7, 10], [8, 9], [8, 10]],
"YOU": [[0, 7], [0, 8], [7, 8]],
"YOUR": [[0, 7], [0, 8], [7, 8]]
}

일부 글리프에는 여러 이름이 있습니다 (예 : NO, NOT, INSIDE . 당신은 그들 모두를 지원해야합니다.

기권: 모든 글리프의 좋은 목록을 찾을 수 없으므로 여러 소스를 결합하여 결국 해킹 된 JS 응용 프로그램에서 모든 소스를 그려서 목록을 얻었습니다. 나는 일부를 놓치고 게임에서 사용되지 않는 두 개의 별칭이있을 수 있습니다. 그래도 일부 글리프를 잘못 그리지 않기를 바랍니다.

오전 4 시가 아닌 다음날 아침 편집 : VICTORY가 누락 된 것을 이미 확인했습니다. 음, 그것은 최고의 골퍼에게 남았습니다.

도전

당신의 임무는 글리프의 이름을 받아서 그 글리프를 이미지로 출력하는 프로그램이나 함수를 만드는 것입니다.

이미지에는 격자 점과 해당 점을 연결하는 선이 있어야합니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다. 표준 규칙이 적용됩니다.

I / O

위의 JSON 객체의 키에있는 글리프 이름을 원하는 형식으로 입력으로 사용합니다. 다른 입력은 정의되지 않은 동작입니다.

글리프가 그리드에 렌더링 된 이미지를 일반적인 형식으로 출력합니다.

그리드 비율

이 비율은 반올림 등을 위해 5 픽셀까지 정확해야합니다.

  • 바깥 쪽 점 (0-5)은 정육각형을 형성해야합니다.
  • 중심점 (10)은 육각형의 중심에 있어야합니다.
  • 중간 점 (6-9)은 중심점과 해당 외부 점 사이의 중간 지점이어야합니다.
  • 그리드는 원본과 같은 방향이어야합니다.
  • 외부 육각형의 높이는 100 픽셀 이상이어야합니다.

다른 규칙

  • 배경 투명하거나 단색으로 채워져 .
  • 선과 점 배경과 서로 명확하게 구분 되어야합니다 . 그것들은 같은 단색 일 수 없습니다.
    • 예를 들어, 파란색 실선과 분홍색 점이 좋습니다.
    • 검은 색 실선과 검은 색 테두리가있는 흰색 점이 좋습니다.
    • 포인트로 빨간색과 흰색 줄무늬 라인과 축구가 좋습니다.
    • 녹색 선과 녹색 점은 좋지 않습니다 .
  • 지점의 반경 해야 라인의 폭보다 클 수.
  • 포인트 앞이나 뒤에 선을 그릴 수 있습니다 .
  • 이미지에 패딩을 배경색으로 포함 할 수 있습니다 .
  • 연속적인 라인을 결과에 영향을주지 않기 때문에 한 라인으로 결합 있습니다 .

이 이미지의 색상과 객체 너비는 게임의 모양과 다소 유사한 예일뿐입니다.

언 바운드

무한한 글리프

평화

평화 글리프

저항

저항 글리프


향수 (및 저항 제안 : P)를 찬성했습니다. 이 게임에 아직 시간이 있었으면 좋겠다! 내가 오랫동안 가지고 있었던 가장 재미있는 (그리고 운동)의 일부. 그리고 실제로 수동으로 JSON을 만들었습니까?
Carcigenicate

@Carcigenate No. 나는 그리드와 글리프의 이름을 부여하고 그것을 그리게하는 코드 조각을 작성하고 노드 목록으로 배열에서 글리프를 수집했습니다. 그런 다음 10 줄의 파이썬과 일부 찾기 및 바꾸기였습니다. 이 앱은 예제가 나오는 곳이기도합니다.
PurkkaKoodari

그래프 목록을 압축하는 것이 도전 과제에 큰 영향을 미치지 만, kolmogorov 태그가 수백 가지 이상의 다른 출력을 가지고 있기 때문에 여기서는 위업이라고 생각하지 않습니다.
Sefa

@ Pietu1998 오, 멋지다. 프로그래머가 그와 비슷한 것을 돕기 위해 프로그램을 작성했을 것이라고 믿었을 것입니다.
Carcigenicate

답변:


7

수학, 228 + 184 + 365 + 13 = 790 바이트

Graphics@{v=255#+##&~Fold~BinaryReadList@#~IntegerDigits~#2&;p=#~Partition~2&;c=p["c"~v~25-12][[#+1]]&;Array[Disk@*c,11,0],Red,Line[c/@<|Thread["a"~v~2293->First/@p@SplitBy["b"~v~12,#>10&]]|>@Mod[1##&@@ToCharacterCode@#,2293]]}&

위의 228 바이트 명령은 위의 글리프 이름 중 하나를 입력으로 사용하여 이미지를 반환하는 명명되지 않은 함수를 정의합니다. 예를 들어 다음은 다음에 대한 출력입니다 "UNBOUNDED".

언 바운드

이 명령은 각각 184, 365 및 13 바이트의 세 가지 이진 파일 "a"( "b", 및) "c"을 읽습니다 . 읽기 쉬운 버전 :

1  Graphics@{
2    v = 255#+##&~Fold~BinaryReadList@#~IntegerDigits~#2 &;
3    p = #~Partition~2 &;
4    c = p["c"~v~25-12][[#+1]] &;
5    Array[Disk@*c, 11, 0], Red, 
6    Line[c /@
7      <| Thread[ "a"~v~2293 -> First/@p@SplitBy["b"~v~12, #>10&] ] |>
8        @ Mod[1##& @@ ToCharacterCode@#, 2293]]
9  } &

2 행은 수제 압축 해제 기능을 정의합니다. 파일에서 바이트 스트림으로 읽습니다. # 이를 base-256 정수로 변환 한 다음 해당 정수를 base의 자릿수 목록으로 확장합니다 #2. 3 행과 4 행은 0에서 10까지의 정수를 해당 그리드 포인트의 좌표로 변환하는 함수 (제 3 바이너리 파일 사용)를 정의합니다. 이 모든 좌표는 –12와 12 사이의 정수로 선택되었으므로 압축이 편리합니다 (처음 제출할 때 보지 않았지만).

선 5는 그리드 점 (기본 색상은 검은 색)을 그린 다음 선의 빨간색으로 전환합니다. 7 행은 0과 2292 사이의 특정 입력 정수를와 같은 그리드 포인트 정수 목록으로 변환하는 연관 (처음 두 개의 2 진 파일을 사용하여)을 작성 {2, 3, 4, 5, 0, 1, 7, 8, 9, 6, 10}합니다. (이것은 각 모서리를 정확히 한 번 방문하는 "Eulerian 경로"입니다. 표의 모든 글리프에는 Eulerian 경로가 있으므로이 표현은 모서리 세트를 명시 적으로 나열하는 것보다 짧습니다.) ->7 행 후의 명령 v11을 사용할 때마다 12를 기준으로 정수를 읽은 다음 숫자 11이 나타날 때마다 나누면이 Eulerian 경로 목록이 작성 됩니다.

마지막으로 8 행은 모든 문자를 ASCII 코드로 변환하고 곱 모듈로 2293 (답이 모두 가장 작은 모듈러스)을 취함으로써 입력 문자열을 해시합니다. 이 정수는 위의 라인에서 연관으로 공급되어 적절한 Eulerian 경로를 생성하고 라인 6은 그리드 점 위에 결과 경로를 그립니다.

"a", "b"및 "c"파일의 16 진 덤프 순서 :

09d5f27cd2246e0cb06aa243b442d761ac3a5604439f1767a202c4d3fc4fc1b24ce59acfc65a05235cc46354af8820d6733001e1f25ea01479cee027d62e8b1be10891c693ed5887942ca461c461d458a7676bfcd866a70263ad1833b3e836895ce121153c451ad327086e2bd30d6bad7097a9e71c2fc67c2c57716e5ada6907d99f42702dfb8b88c6d26799aa01f42fb89394e00b0752825f2740903276e20ec405473f309cc978aea187da24749d0a44319cd7322dd542

02d9ebf5fc94183ce50f0fc84e88a27bd21a3b3665d54949608c75c86c4507eed3072e02657822bfb83dbca8a708e07d1382c2b6c3c8fcddc88fa7244281a918b3a8aa823048d4a7e070a336c1e5ab83ec4950fc1960f34c6b89c541c9401607882418cac7f79f4edb164b775ecbb97947470016cadea4d06f93a958713b8c23d11be3c9ce8a2824a458d151ac3cafc6d7bb1557e55868434bd5c0da4bd71e66a3f7711018ae5e7f2941a949a85b6e65aebcc2fe43a89cb0479fa9474fe5102cfbf7da8a455f46ac5409dfdc79970ed8dbfc6b84df78c9c19df4d16bda298dca445ad510bf32e14ca5c91ce58e7521492f6e79e05624ab4a4c02c66c22ef670a06d5c5a3dfdf8ccc8c40c353f3aecf17bbb5cb911baefa3ce80e41551376838c166153a1038d83e171077a3f260ccd70358917eeceb5722b58ad6900a40b5b1512b292fb7a7e0d2cbe2bac2a48a4e343e8f2a338808ec9957c64778aba412bec47bcabb2a2789f01c2d5fdd993

254c40dac61bb215386b7361a8

좋은 대답입니다! 그러나 데이터 파일의 16 진 덤프를 게시해야합니다.
PurkkaKoodari

완료 ... 그리고 그 동안 모든 관련 명령이 이미 있기 때문에 그리드 점 좌표 목록을 압축 할 수도 있음을 깨달았습니다.
Greg Martin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.