GNU make의 FizzBuzz
6870 단어 hacks
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
가 첫 번째 대상이므로 생략할 수 있습니다. 또한 명령줄에서 START
및 END
를 재정의할 수도 있습니다.$ make START=19 END=30
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
연습
어떻게 작동합니까? 확인하려는 숫자 범위의 시작 값과 끝 값에 대한 여러 변수를 정의하는 것으로 시작합니다.
START := 1
END := 15
다음으로
shell
function을 사용하여 seq
을 사용하여 일련의 숫자를 구성하므로 NUMS
는 1 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
에서 어색해집니다. ↩Reference
이 문제에 관하여(GNU make의 FizzBuzz), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/citizen428/fizzbuzz-in-gnu-make-450p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)