주간 챌린지 116

Challenge , My solutions

기운



Perl Conference 이번 주인데 저도 기대되는 연사들이 많습니다. 나는 노력을 지원하기 위해 티켓을 가지고 있지만 너무 많은 라이브를 시청하지 않을 것입니다. 이벤트는 오전 1시 - 오전 8시(AEST)입니다.

이번주 과제로 넘어갑니다.

숫자는 무엇입니까?



거리에서 낯선 사람에게(물론 코비드 방식으로!) 1에서 6 사이의 숫자를 고르라고 요청하면 그들은 6가지 대답(1, 2, 3, 4, 5 또는 6) 중 하나를 말할 것입니다. 절대 3.4 또는 2.6이 아닙니다. 이것은 Numb3rs의 에피소드에 등장했습니다. 우리는 프로그래머이고 다르게 생각합니다. 따라서 작업에서 숫자가 언급될 때마다 저는 항상 정수가 아닌 경우를 고려합니다. 아니요, 생각하지 않습니다 complex numbers :P

작업 #1 › 번호 시퀀스





당신에게 주어진 숫자는 $N >= 10입니다.

두 개의 연속 숫자 사이의 차이가 항상 1이고 앞에 0이 없어야 하는 주어진 숫자를 분할하는 스크립트를 작성하십시오.

숫자를 나눌 수 없는 경우 주어진 숫자를 인쇄하십시오.

내 솔루션



첫째, 스트레이트 포워드 비트. 1에서 숫자의 길이까지 $length라는 루프가 있습니다. 이 루프 내에는 배열@sequence이 있습니다. 배열은 첫 번째$length 숫자로 시작하고 시퀀스의 모든 숫자 길이가 입력 길이보다 크거나 같을 때까지 배열에 다음 숫자를 추가합니다. 숫자가 일치하면 해결책이 있습니다. 그렇지 않으면 $length를 늘리고 다시 시도합니다.

그러나 숫자910.011도 유효한 솔루션(9, 10.0, 11)인 것으로 보입니다. 이 숫자의 차이는 항상 1이며 선행 0이 없습니다. 이hack는 소수점 뒤의 숫자가 0이거나 단일 값이 있는 경우에만 작동합니다.

이를 기반으로 코드에 정규식\.0+(하나 이상의 0이 뒤따르는 점)이 코드에 나타나는 상황을 처리하기 위해 코드에 몇 가지 추가 논리가 있습니다. 제가 너무 과하게 생각한 것일 수도 있고, 의도적인 것일 수도 있습니다.

Colin이 이번 주Perl review에서 언급했듯이 "텍스트의 모호성이 주어지면 충분한 사람과 충분한 시간이 주어지면 모든 가능한 위치가 결국 목격될 것입니다. 그것은 이제 나에게 주어진 것입니다."




$ ./ch-1.pl 1234
1,2,3,4

$ ./ch-1.pl 91011
9,10,11

$ ./ch-1.pl 10203
10203

$ ./ch-1.pl 910.011
9,10.0,11


작업 #2 › 제곱합





당신에게 주어진 숫자는 $N >= 10입니다.

주어진 숫자$N가 모든 자릿수의 제곱의 합이 완전제곱인지 알아내는 스크립트를 작성하십시오. 그렇지 않은 경우 인쇄10 .

내 솔루션



이것은 비교적 간단합니다. 숫자가 정수가 아니면 소수점을 제거합니다. 이것은 이 작업의 목적을 위해 서버를 사용하지 않습니다($N >= 10이라고 가정).

코드sum( map { $_**2 } split //, $number )를 사용하여 모든 숫자의 제곱을 찾을 수 있습니다. 이 코드는 숫자를 구분하고 제곱을 구하고 모든 결과를 합산합니다.

그런 다음 sqrt 함수를 사용하여 합계의 제곱근을 얻습니다. 이것이 정수이면 1 를 출력하고, 그렇지 않으면 0 를 출력합니다.




$ ./ch-2.pl 34
1

$ ./ch-2.pl 50
1

$ ./ch-2.pl 52
0

$ ./ch-2.pl 30.4
1

좋은 웹페이지 즐겨찾기