코 틀린에서의 골프 팁


22

구글이 최근 안드로이드 개발에 대한 공식 코 틀린 (Kotlin) 지원을 발표 한 것을 감안할 때 , 나는 비교적 새로운이 JVM 언어에 대한 훌륭한 골프 팁을 커뮤니티에 조사하는 것이시기 적절하다고 생각했다.

Kotlin은 JVM 형제 중 고유 한 기능 조합을 포함하여 골프에 잠재적으로 매력적입니다.

그렇다면 Kotlin 프로그램에서 마지막 몇 바이트를 어떻게 압축합니까? 답변 당 하나의 팁을 부탁드립니다.


2
Kotlin의 더 긴 이름을 짧게하지만 많은 것을 추가하지 않는 골프 언어에 관심이 있습니까? 나는 일반적인 1 글자를 만들고 문자열 문자 수를 짧게하고 작은 따옴표 만 1 인용 부호로 추가 할 생각입니까?
jrtapsell

* 공통 기능
jrtapsell

Kotlin 골프 관심이 그다지 높지 않은 것 같습니다 :( data.stackexchange.com/codegolf/query/793250/top-kotlin-golfers
jrtapsell

더 많은 Kotlin 솔루션을 제출할 계획입니다! 나는 당신의 프로젝트도 확인해야합니다.
Tyler MacDonell

답변:


4

확장 기능

확장 함수는 내장 메소드의 이름과 그 체인을 줄이는 데 실제로 도움이 될 수 있습니다.

fun String.c() = this.split("").groupingBy{it}.eachCount()

그러나 이것은 다음과 같은 경우에만 도움이됩니다.

A) 호출이 정의를 취소하기에 충분히 길다

B) 전화가 반복됩니다

방법보다는 람다 사용

람다는 return 키워드를 사용하지 않고 반환하여 바이트를 절약 할 수 있습니다

코 틀린

여기에서 시작한 프로젝트 는 예쁜 Kotlin 코드를 사용하고 테스트 및 TIO 링크가있는 게시물을 자동으로 제공합니다.


4

+대신에 사용toString

예상대로 문자열 연결을 위해 연산자를 String오버로드합니다 +.

print("Hel" + "lo")

그러나 확인 워드 프로세서 것은 그것을 받아들이는 우리에게 Any?뿐만 아니라, String. 명시된 바와 같이 :

이 문자열을 지정된 다른 객체의 문자열 표현과 연결하여 얻은 문자열을 반환합니다.

즉, 연결하기 전에 오른쪽 String + anything을 호출해야합니다 .toString(). 이것은 우리가 단축 할 수 있습니다 it.toString()""+it최악의, 거대한 최상의 8 바이트 절감과 6 바이트를.


fold대신에 사용joinToString

위와 관련하여 호출 map한 다음 joinToStringfold대신 사용하여 단축 할 수 있습니다 .

list.map{it.repeat(3)}.joinToString("")
list.fold(""){a,v->a+v.repeat(3)}

TIL 폴드는 좋은 것입니다
Quinn


1

매개 변수에 Int 정의

이것은 가치가있을 수있는 매우 구체적인 유스 케이스가있을 것입니다. 그러나 최근 질문에서 골프를 쳤을 때 변수에 함수에서 정의하는 대신 선택적 매개 변수로 정의하여 몇 바이트를 절약 할 수 있다는 것을 알았습니다.

질문에 대한 나의 대답의 예 :

함수에서 변수를 정의 :

fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}

변수를 매개 변수로 정의 :

fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)

왜냐하면 그것들을 정의하기 위해 같은 바이트 수 var a=와 같은 길이 이기 때문에 a:Int=(이 경우에만 해당 Int) 그러나 이제 함수에 한 줄만 있기 때문에 드롭 할 수 {}있고 단일을 드롭 할 수도 있습니다 ;(다른 하나는 로 대체 됨 ,)

따라서 Int를 정의 해야하는 함수가 있고 함수에 int를 정의하지 않은 경우 1 라이너가되는 경우 매개 변수로 수행하면 몇 바이트가 절약됩니다.


0

to중위 기능

s 라는 두 값 to을 만드는 표준 infix 함수가 Pair있습니다. s mapOf()를 정의하는 데 일반적으로 사용 Map되지만 잠재적으로 Pair()생성자 보다 훨씬 짧을 수 있습니다 .

Pair(foo,bar)   //constructor
foo to bar      //best case 
(foo)to(bar)
((foo)to(bar))  //worst case

0

람다 인수의 파괴

Pair<*,*>람다 를 수락하고 싶다고 가정 해보십시오. 일반적으로 이것을 처리하는 것은 성가신 일입니다. 예를 들어 다음은 a를 가져와 Pair두 값이 같은지 확인 하는 람다입니다 .

{it.first==it.second}

이것은 길고 서투른입니다. 다행히, 코 틀린 당신은 어떤 destructable 유형 destructure 할 수 있습니다 (모든 유형을 그 구현의 componentN()같은 방법 Pair, Triple등) 람다에 대한 인수로는. 따라서 다음과 같이 다시 작성할 수 있습니다.

{(a,b)->a==b}

F #과 같은 방식으로 튜플과 일치하는 패턴과 비슷하며 많은 경우에 해당됩니다. 그러나 Kotlin의 다양한 유형은 구조 조정을 지원합니다 ( MatchResult유용합니다).

그래도 더 많은 논증을 취할 수 있습니다. 람다가 Pair추가 가치 를 가져야한다고 가정 해보십시오 . 람다 서명을 다음과 같이 작성하면됩니다.

(a,b),c->  // pair first
a,(b,c)->  // pair second
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.