인챈트를 조합, 정렬하여 출력하는 프로그램입니다.




사용을 원하는 인챈트를 선택한 후 실행 합니다.




예 ) 밸런스 -5, 크리티컬 3, 공격력 300 이상의 조합을 밸런스를 기준으로 내림차순 정렬( n/a : 정렬 안 함 )




선택되어 있는것이 기본값입니다. 출력량이 많다면 약 15 ~ 30%,
출력량이 적은 경우 약 4배의 속도( 첫번째 이미지에서 출력량을 200으로 한 경우 24초 -> 6초 ).

- 무기 인챈트 조합 128개, 머리 9, 가슴 20, ... 
  방패를 제외하더라도 모든 경우의 수는 4.4158206468e+154415조 8206억 4680만 ) 입니다. 
  따라서 많이 선택하면 기다릴 수 있는 시간을 초과 하거나 결과를 출력하지 못하는 경우가 발생할 가능성이 커집니다.
  
- 사실 그 전에 메모리 문제로 계산을 못하는 경우가 발생합니다( 4,199,040 개의 조합까지는 작동하는 것을 확인 )
  해결 방법 : 밸런스와 크리티컬, 공격속도의 제한을 충분히 높게 둬서 정해준 조건을 만족 할 수 있는 인챈트의 
  조합이 메모리의 한계에 도달하지 못하게 만들면 됩니다( 420~500만 사이로 추측 ).
  
  근본적으로 이해하는 것이 좋을것 같아서 복잡하지만 자세히 설명하면 프로그램은 아래의 과정으로 실행 됩니다.
  a. 선택한 인챈트를 확인
  b. 모든 조합을 찾아 저장. 단, 사용자가 설정한 조건을 만족해야 한다.
  c. 정렬
  d. 지정한 출력량 만큼 출력

  b. 단계에서 메모리에 저장 할 수 있는 양을 초과하게 되는데 이때 충분한 제한을 주면 
  저장하는 양을 줄일 수 있어 응답없음 또는 프로그램 창이 뿌옇게 되더라도 메모리 초과로 실패하는 경우가 
  해결 됩니다. 

- 최대한 줄여도 너무 느려 결과를 확인 할 수 없는 경우, 일부분을 하나의 인챈트로 확정하는 것이 도움이 됩니다.
  인챈트를 하나도 선택하지 않는 것은 한개를 선택한 것과 같은 계산 시간이 필요합니다.
  열망, 마음, 활력, 강인한, 호기심 많은, 꾸준한, 견고한, 보호막 등 은 이 프로그램에서 필요한 인챈트가 아닙니다.
  특정 부위에 공격속도, 크리티컬, 밸런스와 관계없는 인챈트를 선택하는 것은 낭비입니다.

- 첫번째 이미지에 대한 결과입니다( i3-4130, 마영전 실행 중 ) 
  공격속도 순으로 정렬하여 모두 출력( All )
  오래 걸리는 경우 응답없음 이라고 표시됩니다. 
  조합 가능 317,520개, 총 소요 시간 8분 30초, 출력량을 200으로 설정하면 6초가 걸립니다.
  조합 가능한 숫자가 많아지면 대부분의 시간을 계산이 아닌 파일을 만드는데 소모하게 됩니다.
  악세사리 중 장신구 접두만 두개가 선택되어 있는데 하나만 선택한다면 8분 30초 에서 2분 16초가 됩니다.
  경우의 수의 감소 보다 빠르게 시간이 줄어듭니다.
  
- 목록에 없는 인챈트를 사용하고 있는 경우 선택하지 않습니다.
  예 ) 대항, 새싹, ...

- 최대한 적은 수의 인챈트를 선택해야 속도가 빨라집니다.
  예 ) 보호 와 낙인 중 하나만 선택
       고요한 선언 이 체크 되었다면 되뇌는 메아리 는 같은 공격속도, 크리티컬, 밸런스를 갖으므로 나중에 확인
       자스민, 초승달의 는 밸런스가 남는 경우에 선택하여 확인
       마음 은 한 곳에만 확정
       견고한, 꾸준한 등 공격속도, 크리티컬, 밸런스에 영향을 미치지 않는 인챈트는 선택하지 않음

- 실행시 elist1.txt ~ elist999.txt 의 파일명 중 사용되지 않았으며 가장 작은 숫자의 파일명으로 만들어 출력합니다.
  예 ) 1, 2, 3, 4, 5 가 존재 할때 2 를 지우고 실행하면 2, 6, 7, ... 순으로 파일을 만듭니다
  1 ~ 999 의 모든 파일명이 존재하는 경우 실행되지 않습니다

- 출력 후 같은 위치에 만들어지는 elist~.txt, 는 삭제하셔도 됩니다.

- 현란한 의 생명력 감소 40, 보호막 의 스태미나 회복 등의 특정 옵션은 표기하지 않습니다.

- 힘, 지능은 공격력 또는 마법 공격력에 포함되지 않습니다.

- 오류 : 가끔 선택하지 않은 ( 이전에 결과로 출력된 )인챈트의 조합이 나타날때가 있습니다.
         잘못 출력된 txt 파일을 닫은 후, 새로 생성된 elist?.txt 을 직접 열어서 옳은 결과를 확인할 수 있습니다.
         코드는 잘못된 부분이 없다고 생각되어 수정을 못했습니다.

- 특정 인챈트의 능력치가 잘못된것 같다면 첨부된 enchant_data.txt 파일을 통해 확인할 수 있습니다.
  enchant_data.txt 파일은 삭제해도 사용에 문제가 없습니다.



사용 예

- 첫번째 : 남은 인챈트를 통해 얼마나 밸크합을 얼마나 더 올릴 수 있는지 확인

1. 현재 상태는 다음과 같습니다. 밸런스 73, 크리티컬 106, 공격속도 30, 밸크합을 최대한 증가시키려고 합니다.
   수호, 대항, 새싹 같이 목록에 없는 경우는 제외하고 사용중인 인챈트만을 선택하여 아래와 같이 결과를 확인합니다.
   자신이 사용중인 인챈트만을 사용하므로 단 하나의 결과가 출력됩니다.

[번쩍이는 용맹][균형 잡힌 여정][꾸준한 보호][n/a 여정][호기심 많은 활력][의미있는 활력][의미있는 활력]
공격력:   660 (  649 ), 공격속도:   8, 크리티컬:  15, 밸런스:   5, 크리티컬 저항:   0, 방어력:   820
   
   위의 결과 처럼 인챈트가 하나도 없는 부위는 출력되지 않습니다. 하나만 있는 경우 없는 곳은 n/a 로 표시 됩니다.

2. 인챈트가 되지 않은 또는 바꾸려는 곳에 사용 가능한 인챈트를 적당히 선택하고 실행합니다.
   현재 다리 방어구가 [n/a 여정] 따라서 균형잡힌과 깨달음의 만 선택 합니다.
   ( 자동으로 불가능한 조합은 출력하지 않지만 시간이 절약됩니다. 예) 모험가의 노블, 고요한 메아리 )
   손, 발은 목록에 없는 인챈트가 모두 되어 있으므로 선택되지 않은 상태로 두겠습니다( 예 ) 수호의 대항 ).
   신속한을 쓸만한 상태가 아니므로 신속한은 제외 합니다.
   벨트에는 은은한, 의미있는, 열망 선택, 반지2에는 죽은자의, 초승달의, 열망 선택
   목걸이와 아티팩트에는 의미있는, 열망 선택

   아래는 가능한 12가지 경우 중 밸크합 순으로 정렬한 결과 중 가장 높은 밸크합을 가진 경우입니다.

[번쩍이는 용맹][균형 잡힌 여정][꾸준한 보호][깨달음의 여정][호기심 많은 활력][의미있는 활력][은은한 열망][의미있는 활력][죽은자의 열망][의미있는 열망][의미있는 열망]
공격력:   900 (  889 ), 공격속도:  13, 크리티컬:  19, 밸런스:  11, 크리티컬 저항:   3, 방어력:  1620
   
   첫번째 결과를 두번째 결과와 비교해 증가하는 값을 구합니다.
   -> 밸런스 79, 크리티컬 110, 공격속도 35

- 두번째 : 지정한 밸런스와 크리티컬을 만족하는 최대 공격속도의 조합 구하기

   현재 상태: 밸런스 78, 크리티컬 107, 공격속도 36 
   레지나 3파트에는 인챈트가 되어 있으므로 나머지는 경갑을 쓰면서 밸런스 90, 크리티컬 115 이상이며,
   그 중 공격속도가 가장 높은 인챈트를 찾으려고 합니다. 

[번쩍이는 용맹][시간의 보호][기억하는 원정][n/a 열망][죽은자의 열망][n/a 마음]
공격력:   330 (  319 ), 공격속도:   6, 크리티컬:  18, 밸런스:   7, 크리티컬 저항:  12, 방어력:   940 


   목표 밸런스 90 - 현재 밸런스 78 = 12, 12를 현재 인챈트에서 얻은 밸런스 7과 더해 19를 제한으로 설정합니다.
   같은 방법으로 크리티컬은 115 - 107 = 8, 8 + 18 = 26
   두가지 조건을 만족하는 경우 중 공격속도 순으로 정렬하기 위해 체크버튼을 선택합니다.

   경갑으로 할 예정이니 머리, 손, 발에는 플레이트 인챈트를 제외하고 모두 선택
   악세사리는 접미는 모두 열망, 나머지 부분은 의미있는, 신속한, 은은한, 죽은자의, 초승달의, 황혼의를 모두 선택

   아래는 조건을 만족하는 566개의 조합 중 최대 공격속도 21을 가지는 12개의 조합중 하나입니다.

[번쩍이는 용맹][깨달음의 열의][시간의 보호][기억하는 원정][고요한 열의][고요한 치명][의미있는 열망][의미있는 열망][은은한 열망][죽은자의 열망][죽은자의 열망][의미있는 열망][신속한 마음]
공격력:  1095 ( 1108 ), 공격속도:  21, 크리티컬:  27, 밸런스:  19, 크리티컬 저항:  11, 방어력:  1300

   -> 밸런스 90, 크리티컬 126, 공격속도 51

  * 밸크합 205를 원한다면 밸런스와 크리티컬을 각각 지정하지 않고 '밸런스 + 크리티컬' 만을 지정해도 됩니다.
  위의 예에서는 19 + 26 = 45, 물론 밸런스와 크리티컬의 상한을 초과하는 경우는 스스로 제외해야 합니다.



<문제1> 결과를 얻기 위해 가장 중요한 것을 보기에서 고르시오(100점).

 마영전 및 다른 작업을 종료하고 실행한다.
 필요없는 인챈트는 선택하지 않고, 출력량을 늘리지 않는다.
 정렬 기능을 사용하지 않는다.
 풀옵 호스트가 가능하도록 컴퓨터를 업그레이드 한다.
 던전보다는 마을에서 실행하는 것이 더 빠르다.









<정답>  필요없는 인챈트는 선택하지 않고 출력량을 늘리지 않는다.
   가장 중요한 내용을 한줄로 요약해봤습니다. 

   틀린것은 없지만 ③ 번은 혹시나 하는 마음에 추가로 설명합니다. 
   정렬 기준을 정하지 않으면 의미없는 순서로 출력됩니다. 
   따라서 정렬을 하여야 의미있는 결과를 쉽게 찾을수 있습니다.



아래는 프로그램 사용과 관계없는 내용 입니다.

의지에 의한 크리티컬 상승 : ... 800 / 934 / 1067 / 1200 / 1334 / 1467 / 1600 / 1734 / 1867 / 2000
- 아이콘 이미지 : http://www.inven.co.kr/board/powerbbs.php?come_idx=2028&l=27038
- 무기 접두, 접미, ... 의 순으로 14 번의 단계를 재귀로 계산하며 정렬은 퀵소트를 사용합니다.
- 재귀 함수는 Cython 이며 나머지는 Python 입니다( 옵션 해제시 순수한 Python 으로 가동 ).
- 수정이나 참고를 위해 코드가 필요한 경우 보내드립니다.
- 메모리 초과로 인해 결과를 출력 안 하는 문제는 수정 한다면 이번달 내에 할 예정입니다.
- 애완동물 리스트( P )에서 애완동물 아이콘을 더블클릭하면 아이콘 이동이 가능합니다.