주간 챌린지: 평균 진행
Source: Dev.to
주간 챌린지 351
매주 Mohammad S. Anwar는 The Weekly Challenge를 내보내며, 우리 모두가 두 가지 주간 과제에 대한 해결책을 생각해 볼 수 있는 기회를 제공합니다. 제 해결책은 먼저 Python으로 작성한 뒤 Perl로 변환합니다. 모두가 코딩을 연습하기에 좋은 방법이죠.
Task 1: 특수 평균
작업
정수 배열이 주어집니다. 최소값과 최대값을 제외한 평균을 반환하는 스크립트를 작성하세요.
내 솔루션 (Python)
def special_average(ints: list) -> float:
min_value = min(ints)
max_value = max(ints)
short_list = [n for n in ints if n != min_value and n != max_value]
if not short_list:
return 0
return sum(short_list) / len(short_list)
내 솔루션 (Perl)
sub main (@ints) {
my $min_value = min(@ints);
my $max_value = max(@ints);
my @short_array = grep { $_ != $min_value && $_ != $max_value } @ints;
if ($#short_array == -1) {
say 0;
}
say sum(@short_array) / scalar(@short_array);
}
예시
$ ./ch-1.py 8000 5000 6000 2000 3000 7000
5250.0
$ ./ch-1.py 100000 80000 110000 90000
95000.0
$ ./ch-1.py 2500 2500 2500 2500
0
$ ./ch-1.py 2000
0
$ ./ch-1.py 1000 2000 3000 4000 5000 6000
3500.0
Task 2: 등차수열
작업
숫자 배열이 주어집니다. 주어진 배열을 재배열하여 등차수열을 만들 수 있으면 true를, 그렇지 않으면 false를 반환하는 스크립트를 작성하세요.
두 연속된 원소 사이의 차이가 모두 동일하면 그 수열을 등차수열이라고 합니다.
내 솔루션 (Python)
부동소수점 정밀도는 까다로울 수 있습니다(예: 0.1 + 0.2 != 0.3). 신뢰할 수 있는 결과를 위해 입력은 정수이거나 Decimal 값이어야 합니다.
def arithmetic_progression(ints: list) -> bool:
sorted_ints = sorted(ints)
diff = sorted_ints[1] - sorted_ints[0]
for i in range(2, len(sorted_ints)):
if sorted_ints[i] - sorted_ints[i - 1] != diff:
return False
return True
내 솔루션 (Perl)
Perl도 동일한 부동소수점 문제를 겪습니다; Math::BigFloat를 사용하면 더 높은 정밀도를 얻을 수 있습니다.
sub main (@ints) {
my @sorted_ints = map { Math::BigFloat->new($_) } sort { $a $b } @ints;
my $diff = $sorted_ints[1] - $sorted_ints[0];
foreach my $i ( 2 .. $#sorted_ints ) {
if ( $sorted_ints[$i] - $sorted_ints[ $i - 1 ] != $diff ) {
say 'false';
return;
}
}
say 'true';
}
예시
$ ./ch-2.py 1 3 5 7 9
True
$ ./ch-2.py 9 1 7 5 3
True
$ ./ch-2.py 1 2 4 8 16
False
$ ./ch-2.py 5 -1 3 1 -3
True
$ ./ch-2.py 1.5 3 0 4.5 6
True
$ ./ch-2.py 0.1 0.3 0.2 0.4
True