나는 Kotlin으로 500자를 프로그래밍하려다가 좌절되었다

입문


Qiita 신규 서비스Qiitadon 500글자까지 입력할 수 있는 문장은 코드 블록 & 표기가 떨어지는 것에 대응하고 있다고 합니다. 현재 학습 중인 Kotlin으로 투고하고 싶은 것은 8년 전, 다른 8일 전이라고 합니다.

일과 가족이 한자리에 모이는 데 시간이 없는 상황에서 마침내 프로그래밍된 코드는 과연 500글자의 제한이 엄격하다.댓글을 빼도 800여 글자다.Qiitadon에 투고할 수 없습니다.
나는 이미 좌절했다. 나는 코드를 폭로해서 다음 식량으로 삼고 싶다.글자 수를 조절하기 위해 가독성이 떨어졌으니 용서해 주십시오.
Kotlin 좋다!이런 부분은 코드 다음에 정리한다.

코드

import java.awt.Point

fun readl(): Int {//123のどれかの文字を入力受け付けるよ
  var ax : String? = readLine();var a=-1
  if(ax!=null && ax.length==1) a = "123".indexOf(ax[0], 0, false)
  return a+1
}
fun Point.read(){//Pointクラスに拡張関数を追加するよ
  while(x<1){print("x?"); x=readl()}
  while(y<1){print("y?"); y=readl()}
}
fun main(args:Array<String>) {
  var p =0//プレイヤー 0 or 1
  var ban =0//3x3の盤
  val ptn= arrayOf(86016,1344,21,66576,16644,4161,65793,4368)//勝利判定パターン
  while(ban.toString(2).count{it.equals('1')}<9) {//盤が全部うまっていたらゲーム終了するよ
    println("["+p+" turn]")//どっちの番か表示しようね
    /* 盤の表示 */
    for(i in 8 downTo 0){//上位ビットから表示
      print(".ox"[(ban shr i*2 ) and 0b11])//盤を2bitずつシフトで移動して、該当箇所を表示 0b00="."/0b01="o"/0b11="x"
      if(i % 3 ==0) println()//3文字表示したら改行
    }
    val pnt=Point();pnt.read()//マークする座標を入力するよ
    val point=(0b1 shl (6*(3-pnt.y)) shl ((3-pnt.x)*2)) shl p//座標を盤に変換するよ
    if((ban and point== 0) && ((ban shr (1-p) )and (point shr p)==0)){//マークしようとした座標は空いてるよね
      ban = ban or point//空いていたら、盤上にマークするよ
      if(ptn.find{it and (ban shr p) == it}!=null) {println("" + p + " won!");break}//勝利判定するよ
      p= p xor 1//次の人どうぞ
    }
  }
  println("game end")//ループを抜けたってことはゲーム終了だ。お疲れ様。
}

해설


당신은 이미 알고 있습니다. 이 코드는 일찍이 세계 대전의 폭발을 막는 전설적인 게임 TIC TAC TOE의 이른바 세 번째 배열을 실현했습니다.
1칸은 2bits로 Int형 바둑판에 두 명의 유저가 교체하여 표시한다. 세로, 가로, 비스듬한 3글자와 도형이 일치하면 승리한다.

실행 예

[0 turn]
...
...
...
x?2
y?2
[1 turn]
...
.o.
...
x?
(略 3目並ぶかマスが埋まるまで続く)

Kotlin 좋다!


겨우 Kotlin이 좋아서!이런 곳을 총결하였다.

확장 함수


Kotlin에서 기존 클래스에 함수를 추가할 수 있습니다.이번엔 자바야.awt.Point에 확장 함수read()가 추가되었습니다. 이 확장 함수read()는 x와 y에서 표준 입력에서 입력한 값을 입력합니다.
import java.awt.Point
//略
fun Point.read(){//Pointクラスに拡張関数を追加するよ
  while(x<1){print("x?"); x=readl()}
  while(y<1){print("y?"); y=readl()}
}
fun main(args:Array<String>) {
//(略)
    val pnt=Point();pnt.read()//マークする座標を入力するよ
//(略)
}

빈 안전


Kotlin은 null을 허용하는 변수와 null을 허용하지 않는 변수를 구분합니다.변수를 정의할 때 null 허용형임을 알기 때문에 이 변수에 대한 null 대책을 잊지 않습니다.아니면 대책을 세우지 않으면 번역은 통과할 수 없다.
이번에 표준 입력을 얻기 위해 사용하는 readline()은 String입니까?반환 유형의 함수이기 때문에 변수도 String?에서 설명한 대로 해당 매개변수의 값을 수정합니다.유형 이름 다음의 "?"null 허용형 기호 아니야?String?null 허용형이기 때문에 나중에 null 검사를 하지 않으면 컴파일이 잘못됩니다.
  var ax : String? = readLine();var a=-1
  if(ax!=null && ax.length==1) a = "123".indexOf(ax[0], 0, false)

연산자


Kotlin도 다른 언어처럼 논리 연산을 할 수 있다.
이번에는 바둑판의 표기와 판정에서shr,shl,and,or,xor를 사용했다.다음은 이번에 사용한 연산자의 기술례를 총결하였다.
연산자
설명
예제 설명
연산 후
shr
오른쪽으로 옮기다
0b10 shr 1
0b01
shl
왼쪽으로 옮기다
0b01 shl 1
0b10
or
논리 및
0b1001 or 0b1010
0b1011
and
논리적
0b1001 and 0b1010
0b1000
xor
다른
0b1001 xor 0b1010
0b0011
infix 표기법을 사용하여 0b10.그 특징은shr(1)가 아니라 0b10shr1로 기술할 수 있다.

람다식


Kotlin은 람다식을 사용할 수 있어 매우 편리하다.이번에는 문자열count 함수를 계수하는 조건입니다{it.equals('1')} 람다식으로 전달한다.
  while(ban.toString(2).count{it.equals('1')}<9) {//盤が全部うまっていたらゲーム終了するよ
발췌한 코드는 9칸짜리 바둑판이 모두 채워지면 게임의 순환에서 퇴출되는 곳으로 판정된다.

텍스트 작업


이번 프로그램은 다음과 같은 문자열 조작을 진행했다.
      print(".ox"[(ban shr i*2 ) and 0b11])//盤を2bitずつシフトで移動して、該当箇所を表示 0b00="."/0b01="o"/0b10="x"
문자열 요소는 []에서 그룹처럼 액세스할 수 있습니다.
발췌한 코드는 바둑판에 표시된 문자열인'.ox'에서 반 변수에 2bits로 기록된 표시 정보(0b00: 없음, 0b01: 유저 0, 0b10: 유저1)를 인덱스로 텍스트를 추출하여 표시합니다.

끝내다


이 기사는 전혀 드러나지 않았지만 Kotlin이 프로그래밍을 할 때, 아, 이거 편해!잘 음미할 수 있는 좋은 언어입니다.꼭 한번 써보세요.
그럼 안녕!

좋은 웹페이지 즐겨찾기