Standard ML로 AtCoder 시작

개시하다


이 기사는 Standard ML(SML)에서 AtCoder를 시작하려는 사람들을 위해 쓴 것이다.먼저 말하자면 제목은 웅장한 느낌인데 2021년 1월 5일까지 SML 환경 구축과 표준 입력만 기재했다.기분이 좋으면 좀 더 쓰고 싶어요.
또한fetburner의Standard ML로 AtCoder에 등록하면 풀어야 할 과거 문제 10문제를 정선해 봤습니다. 정보량이 매우 많다.여기 기사 꼭 참고해주세요.
말하자면 Standard ML은 뭔가요?이런 분들은 구글에 가보세요.이른바 함수형 프로그래밍 언어의 일종이지만, 매우 미나적인 언어이다.체계적이고 망라적으로 배우고 싶은 사람은 귀중한 SML 입문서프로그래밍 언어 Standard ML 시작를 참고하세요.

SML 환경 구축


AtCoder에서 사용하는 SML 처리 시스템MLton은 매우 강력한 최적화 컴파일러이지만 실제 AtCoder 문제를 해결할 때 대화적인 환경Standard ML of New Jersey(SML/NJ)을 사용하는 것은 매우 간단하다.
어떤 것이든 Ubuntu라면 포장 관리자로 간단하게 설치할 수 있으니 Ubuntu를 사용하세요.(참고로 저는 SML/NJ입니다. 공식 사이트에서 원본 코드를 다운로드하고 설치했습니다. MLton: 공식 사이트에서 이진 정보를 다운로드했습니다.)
// MLtonをインストールする場合
$ sudo apt install mlton

// SML/NJをインストールする場合
$ sudo apt install smlnj
다음 테스트 파일(hello.sml)을 사용하여 설치되었는지 확인하세요.
hello.sml
val _ = print "Hello World!\n"
파일이 완성되면 터미널에서 다음 명령을 실행하십시오.Hello World!를 입력합니다.
// MLtonをインストールした場合
$ mlton hello.sml
$ ./hello
Hello World!

// SML/NJをインストールする場合
$ sml hello.sml
Standard ML of New Jersey ~~~
Hello World!

도전 AtCoder


SML 환경도 구축되었으니 AtCoder 에 도전하십시오!그다음에 코드를 자유롭게 쓰는 거예요!어떤 프로그래밍 언어를 사용하든지 가장 큰 난관은 표준 입력이라고 말하고 싶다.
솔직히 표준 입력을 돌파할 수만 있다면 이후에는 주요 함수형 프로그래밍 언어와 크게 다르지 않을 것이다.

기본 입력


AtCoder의 입력은 대체적으로 공백 구분자나 줄 바꾸기 구분자로 제공되기 때문에 자바의 Scanner가 가지고 있는next 방법처럼,next 함수를 호출할 때마다 다음 영패를 자르면 매우 편리하다.
따라서 TextIO 구조의 scanStream 함수를 이용하여next 함수를 만든다.canStream 함수의 유형은 다음과 같습니다.
scanStream: ( (Char.char, StreamIO.instream) StringCvt.reader ->
              ('a, StreamIO.instream) StringCvt.reader ) ->
            instream ->
            'a option`
유형에서 볼 수 있듯이'reader가 reader로 되돌아오는 함수를 받아들이고 instream을 받아들이고'a 되돌아오기'를 선택한다.이른바'reader를 받아서reader로 되돌아오는 함수'는scan 함수를 가리키며 이를 다른 부품으로 제작한다.또한, instream은 이번 표준 입력을 위해 TextIO를 사용합니다.stdIn입니다.
따라서 TextIO.scanStream scan TextIO.stdIn에서scan 함수를 사용하여 표준 입력에서 영패를 잘라내고 선택할 수 있는 포장을 사용합니다.
그리고 scan 함수만 하는데 이번 목적은 공백으로 구분하는 것이기 때문에 StringCvt 구조의 splitl 함수, skipWS 함수와Char 구조의 isSpace 함수를 이용하여 퍼즐처럼 조립합니다.
코드에 상기 내용을 기술했다면 다음과 같습니다. (nextInt 함수도 기술했습니다.)
(* fn : (char,'a) StringCvt.reader -> (string, 'a) StringCvt.reader *)
fun scan reader stream = SOME (StringCvt.splitl (not o Char.isSpace) reader (StringCvt.skipWS reader stream))

(* fn : unit -> string *)
fun next () = valOf (TextIO.scanStream scan TextIO.stdIn)

(* fn : unit -> int *)
fun nextInt () = valOf (TextIO.scanStream (Int.scan StringCvt.DEC) TextIO.stdIn)
그리고 정의된 함수를 이용하면 간단하게 입력할 수 있다.

총결산


여러분도 2021년부터 Standard ML을 시작하세요!

좋은 웹페이지 즐겨찾기