Ruby 3.0의 출시 - 1일차 - 복구 보고

11736 단어 adventofcoderuby
Ruby 3.0이 출시된 지 얼마 되지 않아 1년 중 가장 즐거운 시기입니다. 우리는 어떤 재미있는 새로운 기능이 있는지 시험해 보도록 하겠습니다.
이 시리즈에서는 Ruby 2.7 및 3.0의 몇 가지 기능과 사용 방법solve Advent of Code problems에 대해 설명합니다.해결 방안 자체가 가장 효과적이라는 뜻이 아니라 기능의 새로운 용도를 보여줘야 한다.
나는 이 문장들을 날짜별로 분류할 것이다. 왜냐하면 매 문장은 점점 길어지고 그 안에 관련되기 때문에 나는 10분 이상의 문장을 자주 발표하는 것을 좋아하지 않는다.
여기까지 말하고 시작합시다!

00일째 - 주자 스크립트
루비 게시물에서 베이스를 볼 줄은 몰랐네요, 그렇죠?도착했습니다.
I'm using this script 매일 코드를 빠르게 실행해야 한다. 모든 우수한 Bash처럼 코드는 좀 무섭고 무섭다.
#!/bin/bash

# Ha, here we are using Bash.

# Find something which starts with the number. I name the actual
# scripts decently, this not so much
matching=`find . -type f -name "$1_*.rb" | head -n 1`

# Then peel the extension off of it
name=`basename $matching .rb`

# ...and throw it to Ruby, with the input from the inputs dir with the same
# name, except a txt extension
ruby ./"$name".rb ./inputs/"$name".txt
입력은 ./inputstxt 파일에 있으며 Ruby 출력과 이름이 같습니다.물론 나는 그것을 깨끗이 정리할 수 있지만, 중요한 것은 루비를 보는 것이다. 그래서 우리는 그 화제로 돌아가자.

Day 01 - 서비스 현황 보고
첫 번째 문제에 대해 우리는 입력 파일에서 두 개의 총수 2020 의 숫자를 찾아야 한다.
See the full solution here on Github.

짝수 매핑
이러한 문제의 가장 일반적인 해결 방안은 값 매핑(Hash을 만드는 것이다. 그 중에서 각 값은 명중해야 하는 값2020과 일치한다.
TARGET = 2020

n = 1500

duals = {}
duals[TARGET - n] = n
# => { 520 => 1500 }
왜 그래요?다음 숫자가 나올 때마다 우리는 이런 질문을 할 수 있기 때문이다.
n = 520
duals[n]
# => 1500
그것은 쌍수가 있기 때문에, 우리는 우리가 우리의 답이 있고, 앞당겨 폭발할 수 있다는 것을 안다.이 이념의 전면적인 실시는 다음과 같다.
# Give a name to the idea of not finding a number,
# but make it compatible with the output functions
# to not crash on error
NOT_FOUND = [-1, -1]

def duals(input, target: 2020)
  # Transform our input into ints, and bring along a hash for the ride
  input.map(&:to_i).each_with_object({}) do |v, duals|
    # If we find a dual number, return it and `v`, we have
    # our answer
    return [v, duals[v]] if duals[v]

    # Otherwise set the target so we can find it next
    # time around
    duals[target - v] = v
  end

  # Otherwise we return back our idea of "not found"
  NOT_FOUND
end

포장기로서의 무한한 방법
문제는 우리가 이 두 숫자의 곱셈을 더 얻어야 한다는 것이다.비록 우리는 duals 함수에서 이 점을 실현할 수 있지만, 그것은 그것을 다른 기능과 결합시킨다.우리는 이 두 숫자를 보거나 제품이 아닌 직접 얻기를 원할 수도 있다. 그러면 함수는 독립적으로 운행해야 한다.
만약 우리가 그것을 다른 함수에 포장한다면, 우리에게 제품을 제공할까요?Ruby 3.0은 다음과 같은 작업에 적합한 무궁무진한 접근 방식을 도입했습니다.
def dual_product(input) = duals(input).reduce(1, :*)

Why the 1 with reduce? Well if we have an empty array we want a sane return value. For addition that value is 0 as you can add any number to it and get back that same number. Same idea with 1 and multiplication here.

Granted this concept has a name, identity or empty, but that's the subject of another post.


이로써 우리는 두 입력을 곱하는 생각을 신속하게 정리할 수 있고 duals 함수의 선명도에 영향을 주지 않는다.즉, 이 매개변수를 두 번 입력하는 것을 싫어합니다. Ruby 3.0에는 하나의 기능이 있습니다.

매개 변수 전달
Ruby 3.0은 다음과 같은 기능을 제공하는 패라메트릭 전달...을 도입했습니다.
def product_duals(...) = duals(...).reduce(1, :*)
이것은 모든 매개 변수를 다음 함수에 전달하는 것을 의미한다.물론, 나는 이것에 대해 약간의 의심을 가지고 있다. 왜냐하면 이것은 무효이기 때문이다.
def product_duals(input) = duals(...).reduce(1, :*)
# SyntaxError ((irb):22: unexpected ...)
...나는 반드시 이렇게 해야 한다고 생각한다. 그렇지 않으면 함수가 어떤 인자를 받아들일지 명확하게 지정할 수 없고, 그것은 전달 함수로만 쓸 수 있을 뿐이다.이것은 아마도 이후의 오류 보고서일 것입니다. 오류 보고서를 찾거나 만든 후에 링크를 볼 것입니다.
이것은 우리를 다음 부분으로 데리고 들어간다. 우리는 입력을 받아야 한다.

그리고 저희가 매개 변수에 번호를 매겼어요.
내 스크립트에서는 Advent of Code의 입력이 포함된 텍스트 파일의 이름으로 ARGV[0]를 사용합니다.
File.readlines(ARGV[0]).then { puts product_duals(_1) }
그것이 해야 할 첫 번째 일은 명령줄 인자 ARGV[0] 를 가져오는 것입니다. 이것은 우리의 입력 파일입니다.우리는 File.readlines를 사용하여 파일의 모든 줄Array을 가져와 파이프를 통해 then라는 재미있는 함수로 전달합니다.then Ruby 2.6에서 yield_self의 별명으로 도입된 것은 tap의 반의어로 볼 수 있다.
1.tap { |v| v + 1 }
# => 1

1.then { |v| v + 1 }
# => 2
tap는 원시 대상을 되돌려주고 then는 블록의 결과를 되돌려준다.비록 우리는 File.readlines로 포장할 수 있지만, 그것은 왼쪽에서 오른쪽으로 뚜렷하게 나타나지 않는다.물론 우리도 여기서 교환해서 사용할 수 있다product_dualstap. 왜냐하면 우리는 수출에 관심이 없기 때문이다.
너도 알아차릴 거야 then.이것은 번호가 있는 매개 변수로 블록의 첫 번째 매개 변수입니다.다음은 _1_2 등을 이용해서 더 많은 정보를 얻을 수 있지만, 그 이상은 얻을 수 없다.
이 경우 파일 입력 파이프라인을 함수로만 변환합니다.
then { puts product_duals(_1) }
...그리고 그것을 다시 _3, 명령행 스크립트, 모든 내용으로 출력합니다. 이것은 우리에게 답을 주어야 합니다.

첫날을 마치다
첫날에 대해 우리는 계속 이 문제들을 연구하고, 다음 며칠과 몇 주 내에 그들의 해결 방안과 방법을 탐색할 것이다.
모든 원시 해결 방안을 찾으려면 the Github repo 전체 주석의 해결 방안을 보십시오.
<< 이전 |

좋은 웹페이지 즐겨찾기