Kotlin으로 500자 생활 게임을 프로그래밍하려다가 좌절했어요.

입문


Qiita의 Mastodon 서비스Qiitadon는 500글자까지 입력할 수 있는 문장으로 코드 블록 & 표기가 떨어지는 것에 대응하고 있다고 들었습니다. 신나게 공부하던 Kotlin이 Tic Tac Toe(세 번째 줄)를 만들었지만 500글자를 받았을 때 좌절한 것은 8년 전, 다른 8일 전이었습니다.

이 투고 이후에도 Smalltalk에서 세 번째 줄에 500개의 문자 프로그래밍을 하려다 좌절하면Smalltalk에서 세 번째 줄에 500자 프로그래밍을 하다가 좌절, 500개 문자 이하로 억제된 자바스크립트 버전의 텍스트452바이트 텍스트에 대해 물어보니 열정이 충만하기 때문에 시간을 내서 만든 코드의욕과 상관없는 기술력 때문에 500자 안에 들어갈 수 없고, 논평을 하지 않아도 1000자가 넘는다.의욕이 뭐예요?
이런 느낌은 500글자 이내로 받는 일이 좌절되어 코드를 다음 식량으로 노출하고 싶었다.글자 수를 조절하기 위해 가독성이 떨어졌으니 용서해 주십시오.
예를 들면 Kotlin 좋아요!이곳을 코드 뒤에 정리해라.

코드

import java.lang.Thread.sleep
fun main(args: Array<String>) {
    val W = 10;//盤面の横幅
    val H = 10;//盤面の縦幅
    var d = arrayOf(//盤面データ。生きているセルを"o"でマーク。ここ書き換えてください。横1-8、縦1-8までが有効な盤面
            "+--------+".toCharArray(), //1
            "|  o  o  |".toCharArray(), //2
            "|  o  o  |".toCharArray(), //3
            "|oo oo oo|".toCharArray(), //4
            "|  o  o  |".toCharArray(), //5
            "|  o  o  |".toCharArray(), //6
            "|oo oo oo|".toCharArray(), //7
            "|  o  o  |".toCharArray(), //8
            "|  o  o  |".toCharArray(), //9
            "+--------+".toCharArray())//10

    while (true) {//生命には終わりがないため、無限ループ
        var v = Array(W, { IntArray(H) })//周辺環境計算用盤面データ
        for (i in d) println(i)//盤面表示

        println()
        fun recr(x: Int, y: Int) {//盤面判定用の再帰関数
            if (d[y][x].equals('o'))
                for (i in -1..1) for (j in -1..1) if (i or j != 0) v[y + i][x + j]++ //周辺セル情報の計算
            if (x < W - 2) recr(x + 1, y)//右のセルに移動して再帰的に判定
            else if (y < H - 2) recr(1, y + 1)//直下左端のセルに移動して再帰的に判定
            d[y][x] = if (v[y][x] == 3 || (v[y][x] == 2 && d[y][x].equals('o'))) 'o' else ' '//周辺情報をもとにセルの生死判定
        }
        recr(1, 1)
        sleep(1000)
    }
}

해설


제목에 기재된 것처럼 생활 게임을 설치했다.생활게임은 단순한 규칙으로 세대교체할 뿐 왠지 생명의 기운이 느껴지는 환경게임이다.시작하면 기본적으로 보기만 해요.
생활 게임에 대한 해설은 위키백과에 대해 잘 알고 있으니 저쪽을 참조하세요.( 생활 게임 - 위키백과 )

실행 예

+--------+
|  o  o  |
|  o  o  |
|oo oo oo|
|  o  o  |
|  o  o  |
|oo oo oo|
|  o  o  |
|  o  o  |
+--------+

+--------+
|        |
|  o  o  |
| o oo o |
|  o  o  |
|  o  o  |
| o oo o |
|  o  o  |
|        |
+--------+

+--------+
|        |
|  oooo  |
| o oo o |
| oo  oo |
| oo  oo |
| o oo o |
|  oooo  |
|        |
+--------+

+--------+
|   oo   |
|  o  o  |
| o    o |
|o      o|
|o      o|
| o    o |
|  o  o  |
|   oo   |
+--------+

+--------+
|   oo   |
|  oooo  |
| o    o |
|oo    oo|
|oo    oo|
| o    o |
|  oooo  |
|   oo   |
+--------+

+--------+
|  o  o  |
|  o  o  |
|oo oo oo|
|  o  o  |
|  o  o  |
|oo oo oo|
|  o  o  |
|  o  o  |
+--------+

+--------+
|        |
|  o  o  |
| o oo o |
|  o  o  |
|  o  o  |
| o oo o |
|  o  o  |
|        |
+--------+

Kotlin 좋다!


이번 코드로 Kotlin 좋아요!느낀 점을 총결하였다.

국부 함수


Kotlin은 국부 함수를 지원하며 함수에서 함수를 정의할 수 있습니다.
이번에는 로컬 함수로 반면의 단원 판정을 귀속적으로 실시하고 호출 전에 주변 환경의 판정을 하고 호출 후에 단원의 생사 판정을 한다.디스크 정보는 국부 함수에서 얻는다.홀가분하네.
        fun recr(x: Int, y: Int) {//盤面判定用の再帰関数
            if (d[y][x].equals('o'))
                for (i in -1..1) for (j in -1..1) if (i or j != 0) v[y + i][x + j]++ //周辺セル情報の計算
            if (x < W - 2) recr(x + 1, y)//右のセルに移動して再帰的に判定
            else if (y < H - 2) recr(1, y + 1)//直下左端のセルに移動して再帰的に判定
            d[y][x] = if (v[y][x] == 3 || (v[y][x] == 2 && d[y][x].equals('o'))) 'o' else ' '//周辺情報をもとにセルの生死判定
        }
        recr(1, 1)

if 문장은 표현식


Kotlin의 if 문은 표현식입니다.따라서 결과를 변수에 대입할 수 있다.
이번에는 if문으로 판면 단원격의 생사 판정을 판정하고 결과를 판면 정보에 대입한다.
            d[y][x] = if (v[y][x] == 3 || (v[y][x] == 2 && d[y][x].equals('o'))) 'o' else ' '//周辺情報をもとにセルの生死判定

끝내다


아직 Kotlin의 장점을 끌어내지 못했어요.
우리의 전투는 이제 막 시작되었다!
엔누7 선생님의 차기작을 기대해 주세요.
그럼 안녕!

보충하여 기록하다


@shiracamus 선생은 코드 최적화를 진행하여 500개의 문자 이하의 판을 제작하였다.감사합니다.(댓글창 참조)
· @sumim 씨는 Smalltalk에 500자 이하의 형식으로 설치되어 Qiita의 Mastodon 서비스Qiitadon게시물에 의해 설치되었다.기대하다

좋은 웹페이지 즐겨찾기