[task] | instruction_following [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | IsLastPage 속성의 데이터 타입과 읽기 전용 속성을 명시하여 1문장으로 설명하세요. [answer] | `IsLastPage`는 `boolean` 타입의 읽기 전용([ReadOnly]) 속성입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | code [pass] | ⏳ 미판정 [title] | table [question] | table.sort 의 comp 인수를 사용해 숫자 배열을 오름차순과 내림차순으로 정렬하는 로직을 포함하는 스크립트를 작성해줘 [answer] | mLua 스크립트에서 `table.sort` 함수의 `comp` 인수를 사용하여 숫자 배열을 오름차순과 내림차순으로 정렬하는 로직은 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { -- 오름차순 정렬 local ascList = {5, 2, 8, 1, 9} table.sort(ascList, function(a, b) return a < b end) log("오름차순: " .. table.concat(ascList, ", [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string concat(table table, string sep = "", integer i = 1, integer j = #table) [Static]** 테이블의 요소를 연결하여 문자열을 만듭니다. 각 요소 사이에 배치되는 구분 기호를 지정할 수 있고 범위를 지정할 수 있습니다. - **void insert(table table, any value) [Static]** table 끝에 값을 추가합니다 - **void insert(table table, integer pos, any val
[task] | code [pass] | ⏳ 미판정 [title] | os [question] | os.clock() 함수를 사용하여 OnBeginPlay()와 OnUpdate() 사이에서 경과된 CPU 시간을 측정하고, 특정 임계값을 초과하면 log()로 성능 경고 메시지를 출력하는 스크립트를 작성해줘 [answer] | mLua 스크립트에서 `os.clock()`은 프로그램이 사용한 CPU 시간의 초 단위 근삿값을 반환합니다. 이 값을 `OnBeginPlay()`에서 초기값으로 저장하고, `OnUpdate()`에서 현재값과 비교하여 경과 시간을 계산할 수 있습니다. 참고 문서에 명시된 `os.clock()`과 표준 생명주기 메서드(`OnBeginPlay`, `OnUpdate`) 및 `log()` 함수를 사용하여 요청하신 로직을 구현한 스크립트는 다음과 같습니다. ```lua Property: [None] number startClock = 0 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **any date(string format, integer time) [Static]** 형식 문자열에 따라서 날짜와 시간을 담은 문자열 또는 테이블을 반환합니다. - **any date(string format) [Static]** 형식 문자열에 따라서 날짜와 시간을 담은 문자열 또는 테이블을 반환합니다. - **any date() [Static]** 날짜와 시간을 담은 문자열을 반환합니다. - **number clock() [Static]** 프로그램이 사용한 CPU 시간의 초 단위 근
[task] | code [pass] | ⏳ 미판정 [title] | string [question] | 문자열에서 "old"를 "new"로 치환하고 치환 횟수를 로그로 출력하는 로직을 포함하는 스크립트를 작성해줘 [answer] | `string.gsub` 함수를 사용하여 "old"를 "new"로 치환하고, 반환되는 치환 횟수를 로그로 출력하는 로직입니다. ```lua Method: [server only] void OnBeginPlay() { local originalString = "This is an old string with old word." local replacedString, count = originalString:gsub("old", "new") log(replacedString) log(co [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | MoveToNextPageAndWait 메서드가 호출될 때 스크립트 실행 상태가 어떻게 변하는지 코드 주석으로만 출력하세요. [answer] | ```lua -- MoveToNextPageAndWait 메서드 호출 시 스크립트 실행이 일시 중단됩니다. ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | code [pass] | ⏳ 미판정 [title] | string [question] | 플레이어 입력 문자열을 소문자로 변환하여 "start"와 비교하는 로직을 포함하는 스크립트를 작성해줘 [answer] | ```lua Method: [client only] void OnBeginPlay() { -- 예시: 어떤 식으로든 입력된 문자열을 소문자로 변환하여 "start"와 비교하는 로직 local userInput = "START" -- string.lower() 메서드를 사용하여 소문자 변환 local lowerInput = string.lower(userInput) if lowerInput == "start" then log("플레이어 입력이 'start'와 일치합니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | GetCurrentPageDatas 메서드의 반환 타입과 페이지당 최대 항목 수를 표로 정리하세요. [answer] | `GetCurrentPageDatas` 메서드의 반환 타입과 페이지당 최대 항목 수는 다음과 같습니다. | 항목 | 내용 | | :--- | :--- | | **반환 타입** | `table<string>` | | **페이지당 최대 항목 수** | 1,000개 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | single_turn [pass] | ⏳ 미판정 [title] | PolygonShape [question] | Shape의 Position 프로퍼티와 PolygonShape의 Points 좌표가 함께 움직일 때, 각 값이 서로 어떤 관계를 갖는지 설명해 줄 수 있나요? [answer] | 참고 문서에 따르면 `PolygonShape`은 `Shape`를 상속받으며, 두 프로퍼티의 관계는 다음과 같습니다. 1. **Position**: `Shape`에서 상속된 프로퍼티로, **모양의 월드 좌표상 위치**를 나타냅니다. 2. **Points**: `PolygonShape` 고유 프로퍼티로, 다각형을 이루는 점들의 **월드 좌표상 위치**를 나타냅니다. 따라서 `Points`에 저장된 좌표 값들은 로컬 좌표가 아닌 **월드 좌표(World Coordinates)** 기준입니다. `Position` 프로퍼티가 변경되어 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 관련 기능에 활용하는 다각형 모양을 나타냅니다. # Properties - **float Angle** 회전된 각도입니다. - **List<Vector2> Points** 다각형을 이루는 점들의 월드 좌표상 위치입니다. ##### inherited from Shape: - **Vector2 Position** 모양의 월드 좌표상 위치입니다. # Constructors - **PolygonShape(Vector2 position, List<Vector2> points, float angle)** 지정한
[task] | single_turn [pass] | ⏳ 미판정 [title] | string [question] | string.gmatch()가 반환하는 반복자 함수를 while 루프와 함께 사용해서 문자열 내의 모든 패턴을 추출하는 코드를 작성하려면 어떻게 해야 하나요? [answer] | mLua는 Lua 5.3 기반이므로 `string.gmatch`는 표준 Lua 문법을 따릅니다. `string.gmatch`는 반복자 함수를 반환하므로, `while` 루프와 함께 호출하여 문자열 내의 모든 패턴 일치 부분을 순차적으로 추출할 수 있습니다. 다음은 `string.gmatch`를 `while` 루프와 결합하여 문자열에서 모든 숫자 패턴을 추출하는 예제입니다. ```lua Method: [server only] void OnBeginPlay() { local testString = "id:100, name:a [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | code [pass] | ⏳ 미판정 [title] | table [question] | table.concat 로 아이템 목록을 쉼표로 구분된 문자열로 변환해 log 로 출력하는 스크립트를 작성해줘 [answer] | `table.concat` 함수를 사용하면 테이블의 요소를 지정된 구분 기호로 연결하여 하나의 문자열로 만들 수 있습니다. 아이템 목록을 쉼표(`,`)로 구분하여 출력하는 스크립트는 다음과 같습니다. ```lua Property: [None] table ItemList = {"Sword", "Shield", "Potion"} Method: [server only] void OnBeginPlay() { -- table.concat(table, separator) -- ItemList 테이블의 요소를 쉼표(,)로 구분 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string concat(table table, string sep = "", integer i = 1, integer j = #table) [Static]** 테이블의 요소를 연결하여 문자열을 만듭니다. 각 요소 사이에 배치되는 구분 기호를 지정할 수 있고 범위를 지정할 수 있습니다. - **void insert(table table, any value) [Static]** table 끝에 값을 추가합니다 - **void insert(table table, integer pos, any val
[task] | code [pass] | ⏳ 미판정 [title] | table [question] | table.keys 와 table.values 를 사용하여 유저 정보 테이블의 키와 값을 각각 추출하여 log 로 출력하는 스크립트를 작성해줘 [answer] | `table.keys`와 `table.values`는 각각 테이블의 키 목록과 값 목록을 반환하는 정적(Static) 함수입니다. 아래 스크립트는 `OnBeginPlay`에서 유저 정보 테이블을 정의한 후, `table.keys`로 키를, `table.values`로 값을 추출하여 `log`로 출력합니다. ```lua Method: [server only] void OnBeginPlay() { -- 유저 정보 테이블 정의 (키: 유저ID, 값: 레벨) local userInfo = { ["user001 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string concat(table table, string sep = "", integer i = 1, integer j = #table) [Static]** 테이블의 요소를 연결하여 문자열을 만듭니다. 각 요소 사이에 배치되는 구분 기호를 지정할 수 있고 범위를 지정할 수 있습니다. - **void insert(table table, any value) [Static]** table 끝에 값을 추가합니다 - **void insert(table table, integer pos, any val
[task] | two_turn [pass] | ⏳ 미판정 [title] | string [question] | `string.pack`와 `string.unpack`를 사용하여 바이너리 데이터를 처리할 때 `string.packsize`는 언제 사용해야 하며, 어떤 형식 문자열은 사용할 수 없나요? [answer] | `string.packsize`는 `string.pack`으로 바이너리 데이터를 생성하기 전에, 해당 형식 문자열이 생성할 바이너리 문자열의 크기를 미리 알아야 할 때 사용합니다. 사용할 수 없는 형식 문자열 옵션은 가변 길이 옵션인 `'s'`와 `'z'`입니다. 이 옵션들을 형식 문자열에 포함하면 `string.packsize`에서 사용할 수 없습니다. [followup] | `string.packsize`로 크기를 확인한 후, `string.pack`으로 데이터를 패킹하고 `string.unpack`로 다시 해제하는 과정의 코드 예시를 보여주세요. [followup_answer] | ```lua Method: [server only] void OnBeginPlay() { local formatString = "i4i4" local size = string.packsize(formatString) log(size) local packedData = string.pack(formatString, 100, 200) local value1, value2 = string.unpack(formatString, packedData) log(value1) [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | single_turn [pass] | ⏳ 미판정 [title] | string [question] | string.format()으로 형식화된 문자열을 만들 때, 숫자나 다른 문자열을 인자로 전달하는 구체적인 문법은 어떻게 되나요? [answer] | `string.format()`은 형식 문자열에 포함된 플레이스홀더(예: `%d`, `%s`)를 실제 값으로 치환하여 최종 문자열을 생성하는 함수입니다. 첫 번째 인자로 형식 문자열을, 두 번째 인자부터는 해당 플레이스홀더에 채워질 값(숫자, 문자열 등)을 순서대로 전달합니다. ### 주요 포맷 스펙ifier (플레이스홀더) * `%d`: 정수 (Integer) * `%s`: 문자열 (String) * `%f`: 실수 (Float) ### 사용 예시 아래는 `string.format()`을 사용하여 숫자와 문자열을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | single_turn [pass] | ⏳ 미판정 [title] | utf8 [question] | utf8.codes 함수를 사용할 때 유효하지 않은 바이트열을 만나면 어떤 오류가 발생하며, 반환되는 값은 무엇인가요? [answer] | `utf8.codes` 함수를 사용할 때 유효하지 않은 바이트열을 만나면 오류를 던집니다. 정상적으로 동작할 경우 이 함수는 문자열 `s`의 모든 문자에 대해 반복할 수 있도록 다음 세 가지 값을 반환합니다. 1. 반복자 함수 (`func`) 2. 현재 문자열 (`string`) 3. 현재 바이트 위치 (`integer`) 반환되는 코드 포인트는 반복자 함수를 호출할 때마다 얻어집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Properties - **string charpattern [Static]** 패턴 "[\0-\x7F\xC2-\xF4][\x80-0xBF]*"입니다. 유효한 UTF-8 문자열이라면 정확히 한 개의 UTF-8 바이트 열에 일치합니다. # Functions - **integer... codepoint(string s, integer i = 1, integer j = i) [Static]** 바이트 위치 i와 j 사이에서 시작하는 모든 문자에서 코드 포인트를 반환합니다. - **func, string, integer c
[task] | single_turn [pass] | ⏳ 미판정 [title] | utf8 [question] | utf8.offset 함수의 세 번째 인자 i를 생략할 경우 기본값은 어떻게 처리되고, 이 함수는 문자열의 몇 번째 문자 인코딩 시작 위치를 반환하나요? [answer] | `utf8.offset` 함수의 세 번째 인자 `i`를 생략할 경우, 기본값은 **1**로 처리됩니다. 이 함수는 문자열 `s`에서 **n 번째 문자**의 인코딩이 시작되는 바이트 위치를 반환합니다. ```lua local str = "Hello" -- 세 번째 인자 i를 생략하면 기본값 1로 동작 local offsetPos = utf8.offset(str, 2) -- "H" (1번째) 다음인 "e" (2번째)의 시작 위치를 반환 ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Properties - **string charpattern [Static]** 패턴 "[\0-\x7F\xC2-\xF4][\x80-0xBF]*"입니다. 유효한 UTF-8 문자열이라면 정확히 한 개의 UTF-8 바이트 열에 일치합니다. # Functions - **integer... codepoint(string s, integer i = 1, integer j = i) [Static]** 바이트 위치 i와 j 사이에서 시작하는 모든 문자에서 코드 포인트를 반환합니다. - **func, string, integer c
[task] | single_turn [pass] | ⏳ 미판정 [title] | utf8 [question] | utf8.len 함수가 유효하지 않은 바이트열을 발견했을 때 반환하는 두 번째 값인 '첫 번째 위치'는 어떤 의미의 위치를 가리키나요? [answer] | `utf8.len` 함수가 유효하지 않은 바이트열을 발견했을 때 반환하는 두 번째 값인 '첫 번째 위치'는 **문자열 `s` 내에서 유효하지 않은 바이트가 시작되는 바이트 인덱스(위치)**를 가리킵니다. 즉, UTF-8 인코딩 규칙에 맞지 않는 바이트 시퀀스가 처음으로 나타나는 문자열 안의 위치(1부터 시작하는 인덱스)를 반환합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Properties - **string charpattern [Static]** 패턴 "[\0-\x7F\xC2-\xF4][\x80-0xBF]*"입니다. 유효한 UTF-8 문자열이라면 정확히 한 개의 UTF-8 바이트 열에 일치합니다. # Functions - **integer... codepoint(string s, integer i = 1, integer j = i) [Static]** 바이트 위치 i와 j 사이에서 시작하는 모든 문자에서 코드 포인트를 반환합니다. - **func, string, integer c
[task] | code [pass] | ⏳ 미판정 [title] | string [question] | 사용할 API: string lower(), string equals() [answer] | `string lower()`와 `string equals()`를 함께 사용할 때 가장 유용한 시나리오는 **대소문자를 구분하지 않고 문자열을 비교**하는 것입니다. `string lower()`는 문자열을 소문자로 변환하고, `string equals()`는 두 문자열이 완전히 일치하는지 확인합니다. 이 두 함수를 조합하면, 입력된 텍스트의 대소문자 차이를 무시한 상태의 비교를 수행할 수 있습니다. 아래는 이 두 API를 사용하여 사용자가 입력한 명령어가 대소문자 관계없이 "help"인지 확인하는 mLua 스크립트 예시입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | single_turn [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | GetCurrentPageDatas 메서드가 반환하는 테이블에는 최대 몇 개의 항목이 들어올 수 있나요? [answer] | `GetCurrentPageDatas()` 메서드가 반환하는 테이블에는 최대 **1,000개**의 항목이 포함될 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | code [pass] | ⏳ 미판정 [title] | string [question] | string.find와 string.sub를 사용하여 입력된 문자열에서 "Maple"이 처음 등장하는 위치부터 5글자까지 잘라내는 로직을 구현하는 스크립트를 작성해줘 [answer] | 사용자 질문에 따라 `string.find`와 `string.sub`를 사용하여 "Maple"이 처음 등장하는 위치부터 5글자까지 자르는 로직을 구현합니다. 1. `string.find(s, "Maple")`을 호출하여 "Maple"이 처음 나타나는 시작 인덱스(`startIdx`)를 찾습니다. 2. 찾지 못했다면(`nil` 반환) 로그를 출력하고 종료합니다. 3. 찾았다면, 시작 위치(`startIdx`)부터 5글자까지 자르기 위해 끝 인덱스(`endIdx`)는 `startIdx + 4`가 됩니다. (시작 포함 5글자) 4 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 반환합니다. - **string, integer gsub(string s, string pattern, any repl, integer n) [Static]** s에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **string, integer gsub(string s, string pattern, any repl) [Static]** s에서 모든 pattern
[task] | code [pass] | ⏳ 미판정 [title] | string [question] | 문자열에서 숫자 패턴([0-9]+)을 찾아 모든 일치 부분을 리스트로 저장하는 로직을 포함하는 스크립트를 작성해줘 [answer] | `string.gmatch` 함수를 사용하여 문자열에서 `[0-9]+` 패턴에 일치하는 모든 부분을 반복적으로 추출할 수 있습니다. `gmatch`는 반복자 함수를 반환하며, 이를 `for` 루프에 사용하면 모든 일치 부분을 순서대로 가져올 수 있습니다. 아래는 숫자 패턴을 찾아 리스트에 저장하는 mLua 스크립트 예시입니다. ```lua Property: [None] table NumberList = {} Method: [server only] void OnBeginPlay() { self.NumberList = {} [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | code [pass] | ⏳ 미판정 [title] | math [question] | math.rad 함수와 math.sin 함수를 사용하여 OnUpdate 메서드에서 매 프레임마다 self.Entity.TransformComponent.Position의 Y 좌표를 1초 주기로 0에서 100 사이의 사인파 형태로 변동시키는 스크립트를 작성해줘 [answer] | mLua에서 `math.rad`와 `math.sin`은 Lua 5.3의 `math` 라이브러리 함수로, 스크립트 본문에서 `math.rad(...)`, `math.sin(...)` 형태로 직접 호출할 수 있습니다. 1초 주기의 사인파를 만들려면, 경과 시간(`elapsedTime`)을 1초로 나누면 0~1 사이 값이 됩니다. 이 값을 2π(= 2 * math.pi)를 곱하면 0~2π 라디안 범위의 각도가 되어, `math.sin`으로 계산하면 -1~1 사이의 값이 나옵니다. 이를 50으로 곱하고 50을 더하면 0~100 범위의 사 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Properties - **integer mininteger [Static]** 정수 중 값이 가장 작은 정수입니다. - **integer maxinteger [Static]** 정수 중 값이 가장 큰 정수입니다. - **number pi [Static]** π 값입니다. - **number huge [Static]** 수가 가장 큰 실수 값입니다. # Functions - **integer ceil(number x) [Static]** x보다 크거나 같은 가장 작은 정수 값을 반환합니다. - **numb
[task] | two_turn [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | LogStorageService의 PurchaseLogPages에서 구매 기록을 조회하는 기본 방식이 어떻게 되나요? [answer] | `LogStorageService`에서 월드 상품 구매 기록을 조회하는 기본 방식은 비동기 호출을 통해 `PurchaseLogPages` 객체를 획득한 후, 페이지 단위로 데이터를 순회하는 것입니다. 구체적인 실행 흐름은 다음과 같습니다. 1. **페이지 객체 획득**: `_LogStorageService:GetPurchaseLogPagesAsync(fromDate, toDate, callback)`를 호출하여 시작일(`fromDate`)과 종료일(`toDate`)을 지정하고, 결과를 담은 `PurchaseLogPages` 객 [followup] | MoveToNextPageAndWait() 호출 시 스크립트가 중단되는 Yield 동작이 다른 로직에 미치는 영향과 예외 처리 방법은 무엇인가요? [followup_answer] | `MoveToNextPageAndWait()` 메서드는 `[Yield]` 속성을 가지며, 호출 시 스크립트 실행이 중단됩니다. 다음 페이지 데이터가 준비될 때까지 코드의 흐름이 일시 정지되며, 데이터가 준비된 후에야 `MoveToNextPageAndWait()` 호출 이후의 코드가 계속 실행됩니다. ### Yield 동작이 다른 로직에 미치는 영향 1. **동시성 보장**: 페이지 이동 요청을 한 후, 해당 페이지의 데이터가 실제로 로드되기 전에 `GetCurrentPageDatas()`를 호출하면 빈 데이터나 이전 페이지의 [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | single_turn [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | LogStorageService의 PurchaseLogPages에서 IsLastPage 속성이 읽기 전용인 이유는 무엇인가요? [answer] | `IsLastPage` 속성이 읽기 전용(ReadOnly)인 이유는, 이 값이 현재 페이지가 조회 결과의 마지막 페이지인지 여부를 나타내는 **상태 정보**이기 때문입니다. 페이지 탐색은 `MoveToNextPageAndWait()` 메서드를 호출할 때 서버 내부적으로 진행되며, 다음 페이지로 이동한 후 서버가 더 이상 조회할 데이터가 없음을 감지하면 `IsLastPage` 값이 자동으로 `true`로 설정됩니다. 따라서 스크립트 작성자가 이 값을 직접 수정하여 페이지 상태를 임의로 변경할 수 없도록 되어 있으며, 오직 서버의 조 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | two_turn [pass] | ⏳ 미판정 [title] | table [question] | table.concat를 사용해 테이블을 문자열로 변환할 때 구분자 설정이 어떻게 되는지? [answer] | `table.concat` 함수는 테이블의 요소를 연결하여 하나의 문자열을 만듭니다. 이때 각 요소 사이에 배치되는 구분 기호를 설정할 수 있습니다. 구분자 설정은 두 번째 인수로 전달하며, 기본값은 빈 문자열(`""`)입니다. 따라서 구분자를 지정하지 않으면 모든 요소가 붙어서 하나의 문자열이 됩니다. **함수 시그니처** `string concat(table table, string sep = "", integer i = 1, integer j = #table)` * `table`: 변환할 테이블 * `sep`: 요 [followup] | mLua 환경에서 table.concat를 호출할 때 기본 인자값이 적용되는지 확인하고, 특정 범위의 요소만 연결하는 코드 예시를 보여주세요. [followup_answer] | mLua 환경에서 `table.concat`는 표준 Lua 5.3 함수를 그대로 사용합니다. 따라서 함수 시그니처에 명시된 기본 인자값이 정상적으로 적용됩니다. **기본 인자값** `string concat(table table, string sep = "", integer i = 1, integer j = #table)` * **`sep` (구분자)**: 두 번째 인수로 전달하지 않으면 기본값인 빈 문자열(`""`)이 적용됩니다. 즉, 구분자 없이 모든 요소가 붙어 하나의 문자열이 됩니다. * **`i` (시작 인덱스) [scores] | [judge_reason] | [source_doc] | # Functions - **string concat(table table, string sep = "", integer i = 1, integer j = #table) [Static]** 테이블의 요소를 연결하여 문자열을 만듭니다. 각 요소 사이에 배치되는 구분 기호를 지정할 수 있고 범위를 지정할 수 있습니다. - **void insert(table table, any value) [Static]** table 끝에 값을 추가합니다 - **void insert(table table, integer pos, any val
[task] | single_turn [pass] | ⏳ 미판정 [title] | string [question] | string.upper()와 string.lower()의 인스턴스 메서드와 정적 메서드([Static])의 차이는 무엇이며, 각각 언제 사용해야 하나요? [answer] | `string.upper()`와 `string.lower()`는 대소문자 변환 기능을 제공하며, 사용 방식에 따라 **인스턴스 메서드**와 **정적 메서드(Static)**로 나뉩니다. ### 1. 인스턴스 메서드 (Instance Method) 기존에 선언된 `string` 타입 변수에 대해 콜론(`:`)이나 점(`.`) 연산자를 사용하여 호출합니다. * **`string upper()`**: 해당 문자열 변수 자체를 대문자로 변환하여 반환합니다. * **`string lower()`**: 해당 문자열 변수 자체를 소문 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string upper()** 문자열을 대문자로 변환하여 반환합니다. - **string lower()** 문자열을 소문자로 변환하여 반환합니다. - **string, integer gsub(string pattern, any repl, integer n)** 문자열에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **strin
[task] | single_turn [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | PurchaseLogPages 기능은 왜 임시 제공으로 분류되어 사용을 권장하지 않는다고 명시되어 있나요? [answer] | 제공된 문서에는 `PurchaseLogPages` 기능이 임시 제공으로 분류되어 사용을 권장하지 않는 이유에 대한 구체적인 설명이 포함되어 있지 않습니다. 문서에는 해당 기능이 "임시 제공 기능이며 사용을 권장하지 않습니다"라는 사실만 명시되어 있을 뿐, 그 배경이나 사유는 기재되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | code [pass] | ⏳ 미판정 [title] | string [question] | string.reverse와 string.len을 조합하여 주어진 문자열의 길이를 구한 후 그 문자열을 역순으로 변환하여 반환하는 함수를 작성하는 스크립트를 작성해줘 [answer] | `string.reverse`와 `string.len`을 조합하여 문자열의 길이를 구하고 역순으로 변환하는 로직을 수행하는 스크립트입니다. 메이플스토리 월드(mLua) 스크립트 형식에 맞춰 `Method` 블록 내에 함수를 정의하고, `OnBeginPlay`에서 테스트용 문자열을 사용하여 동작을 확인하도록 작성했습니다. ```lua Method: [server only] void OnBeginPlay() { local testString = "HelloWorld" local length, reversed = sel [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 반환합니다. - **string, integer gsub(string s, string pattern, any repl, integer n) [Static]** s에서 모든 pattern을 repl로 치환한 문자열과 총 치환 횟수를 반환합니다. n은 최대 치환 횟수입니다. 인덱스와 길이는 byte 단위이나, 문자열은 가변 길이 인코딩이므로 다국어 사용에 유의가 필요합니다. - **string, integer gsub(string s, string pattern, any repl) [Static]** s에서 모든 pattern
[task] | single_turn [pass] | ⏳ 미판정 [title] | PurchaseLogPages [question] | PurchaseLogPages를 통해 구매 기록을 조회할 때 서버 사이드에서만 실행할 수 있는 메서드는 무엇인가요? [answer] | `PurchaseLogPages`에서 서버 사이드에서만 실행할 수 있는 메서드는 `GetCurrentPageDatas()`와 `MoveToNextPageAndWait()`입니다. * **GetCurrentPageDatas()**: 현재 페이지의 구매 기록 목록을 반환합니다. * **MoveToNextPageAndWait()**: 다음 페이지로 이동하며, 이 메서드 실행 중에는 스크립트가 일시 정지됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | LogStorageService에서 검색한 월드 상품 구매 기록을 페이지 단위로 조회합니다. 임시 제공 기능이며 사용을 권장하지 않습니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 결과의 마지막 페이지인지 여부를 나타냅니다. # Methods - **table<string> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 내용을 반환합니다. 한 페이지에는 최대 1000개의 항목이 포함될 수 있습니다. - **void MoveT
[task] | single_turn [pass] | ⏳ 미판정 [title] | utf8 [question] | utf8.char 함수에 정수를 여러 개 전달하면 각각의 UTF-8 바이트열이 어떻게 조합되어 최종 문자열이 생성되나요? [answer] | `utf8.char` 함수는 0개 이상의 정수를 인수로 받아, 각 정수를 해당 코드 포인트에 대응하는 UTF-8 바이트열로 변환합니다. 이렇게 변환된 바이트열들은 인수로 전달된 순서대로 모두 이어 붙(concatenate)어 하나의 문자열로 최종 생성됩니다. 예를 들어, `utf8.char(65, 66)`을 호출하면: 1. 정수 `65`는 'A'에 해당하는 UTF-8 바이트열로 변환됩니다. 2. 정수 `66`는 'B'에 해당하는 UTF-8 바이트열로 변환됩니다. 3. 두 바이트열이 순서대로 이어 붙여져 최종 문자열 `"AB"`가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Properties - **string charpattern [Static]** 패턴 "[\0-\x7F\xC2-\xF4][\x80-0xBF]*"입니다. 유효한 UTF-8 문자열이라면 정확히 한 개의 UTF-8 바이트 열에 일치합니다. # Functions - **integer... codepoint(string s, integer i = 1, integer j = i) [Static]** 바이트 위치 i와 j 사이에서 시작하는 모든 문자에서 코드 포인트를 반환합니다. - **func, string, integer c
[task] | code [pass] | ⏳ 미판정 [title] | table [question] | table.insert 와 table.remove 를 활용해 스택 구조를 구현하여 값을 넣고 빼는 동작을 OnUpdate 에서 시뮬레이션하는 스크립트를 작성해줘 [answer] | `table.insert`와 `table.remove`는 기본적으로 테이블의 **끝(end)** 인덱스를 다루므로, 이를 활용하면 스택(Stack)의 LIFO(Last-In, First-Out) 구조를 자연스럽게 구현할 수 있습니다. `table.insert(stack, value)`는 스택의 **Push** 동작에, `table.remove(stack)`는 스택의 **Pop** 동작에 해당합니다. 아래는 `OnUpdate`에서 특정 시간 간격으로 값을 넣고, 다시 빼는 동작을 시뮬레이션하는 mLua 스크립트입니다. ```lu [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Functions - **string concat(table table, string sep = "", integer i = 1, integer j = #table) [Static]** 테이블의 요소를 연결하여 문자열을 만듭니다. 각 요소 사이에 배치되는 구분 기호를 지정할 수 있고 범위를 지정할 수 있습니다. - **void insert(table table, any value) [Static]** table 끝에 값을 추가합니다 - **void insert(table table, integer pos, any val