GNU make의 FizzBuzz

6870 단어 hacks
어젯밤1 잠을 잘 수 없었을 때 잠이 부족한 내 뇌가 갑자기 "FizzBuzz에 대해 Makefile를 쓸 수 없을 거라고 장담합니다."분명히 Homer Simpson의 고전"Shut up, brain, or I'll stab you with a Q-tip."으로 응답해야 했지만 너무 늦었습니다. 나는 이것에 너무 많은 시간을 낭비할 것이라고 완전히 예상했지만 해결책을 찾는 데 1시간이 조금 넘게 걸렸습니다.

메이크파일



더 이상 고민하지 않고, 절대 일어나지 말았어야 할 일이 있습니다.

START := 1
END := 15
NUMS := $(shell seq $(START) $(END))

fizzbuzz: $(NUMS)

mod = $(shell echo $$(( $1 % $2 )))

define fb
$1:
ifeq "$(call mod, $1, 15)" '0'
    @echo FizzBuzz
else ifeq "$(call mod, $1, 3)" '0'
    @echo Fizz
else ifeq "$(call mod, $1, 5)" '0'
    @echo Buzz
else
    @echo $1
endif
endef

$(foreach _,${NUMS},$(eval $(call fb,$_)))

.PHONY: fizzbuzz $(NUMS)


실제로 살펴보겠습니다.

$ make fizzbuzz
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

fizzbuzz가 첫 번째 대상이므로 생략할 수 있습니다. 또한 명령줄에서 STARTEND를 재정의할 수도 있습니다.

$ make START=19 END=30
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz


연습



어떻게 작동합니까? 확인하려는 숫자 범위의 시작 값과 끝 값에 대한 여러 변수를 정의하는 것으로 시작합니다.

START := 1
END := 15


다음으로 shell function을 사용하여 seq 을 사용하여 일련의 숫자를 구성하므로 NUMS1 2 3 [...] 14 15를 포함합니다.

이제 fizzbuzz 대상을 설정하고 전제 조건으로 NUM의 모든 숫자를 나열할 수 있습니다.

fizzbuzz: $(NUMS)


다음은 make 자체가 산술 연산을 지원하지 않기 때문에 모듈로에 대한 작은 도우미 함수입니다. 이것은 쉘의 arithmetic expansion 메커니즘을 사용하며 bc 와 같은 외부 프로그램에 의존하지 않습니다.

mod = $(shell echo $$(( $1 % $2 )))


이제 재미있는 부분입니다 :-) 먼저 define를 사용하여 make 식의 시퀀스를 정의하고 나중에 eval 대상으로 전환합니다.

define fb
$1:
ifeq "$(call mod, $1, 15)" '0'
    @echo FizzBuzz
else ifeq "$(call mod, $1, 3)" '0'
    @echo Fizz
else ifeq "$(call mod, $1, 5)" '0'
    @echo Buzz
else
    @echo $1
endif
endef


코드는 비교적 간단해야 합니다. 호출할 때 이 문 블록을 fb로 참조하고 $1는 첫 번째 인수의 값을 받습니다. 그런 다음 몇 가지 ifeq 확인2을 수행합니다.

이제 foreach eval 과 함께 call 을 사용하여 모든 개별 숫자에 대한 대상을 정의할 수 있습니다.

$(foreach _, ${NUMS}, $(eval $(call fb, $_)))


마지막으로 모든 대상을 phony으로 선언하여 실제 파일과 관련이 없음을 나타냅니다.

요약



더 나은 취미가 필요할 수도 있지만 이것은 시간을 때울 수 있는 재미있는 방법이었고 오늘 make에 대해 확실히 조금 더 배웠습니다. 친구(안녕하세요, Joe 👋)가 저에게 왜 이런 일을 했는지 물었을 때 제 대답은 분명했습니다. "할 수 있기 때문입니다."모두를 해킹하고 기술을 즐기는 것을 잊지 마세요!



나는 어린 시절부터 거의 불면증을 다루었습니다.

나는 일반적으로 모듈로 15 검사를 피하지만 실제로 지역 변수가 없기 때문에 make에서 어색해집니다.

좋은 웹페이지 즐겨찾기