이 기사에서는 Perl Weekly Challenge #289의 두 가지 흥미로운 작업에 대해 설명합니다. 즉, 배열에서 세 번째 고유한 최대값을 찾는 것과 텍스트의 단어 글자를 뒤섞는 것입니다. 첫 글자와 마지막 글자가 제자리에 있습니다. Perl과 Go 모두에서 솔루션을 구현하겠습니다.
첫 번째 작업은 주어진 정수 배열에서 세 번째 고유한 최대값을 찾는 것입니다. 세 번째 최대값이 존재하지 않으면 함수는 최대값을 반환해야 합니다.
입력: 정수 배열, @ints.
출력: 세 번째 고유 최대값 또는 세 번째 최대값이 존재하지 않는 경우 최대값입니다.
입력: @ints = (5, 6, 4, 1)
출력: 4
(고유한 최대값은 6, 5, 4입니다.)
입력: @ints = (4, 5)
출력: 5
(세 번째 최대값은 존재하지 않습니다.)
입력: @ints = (1, 2, 2, 3)
출력: 1
(고유한 최대값은 3, 2, 1입니다.)
이 구현에서는 고유한 값 세트를 생성한 다음 세 번째 최대값을 쉽게 찾을 수 있도록 내림차순으로 정렬합니다.
sub third_maximum { my @ints = @_; my %unique = map { $_ => 1 } @ints; my @distinct = sort { $b <=> $a } keys %unique; return @distinct >= 3 ? $distinct[2] : $distinct[0]; }
Go 구현은 맵을 사용하여 고유한 정수를 캡처한 다음 정렬하는 유사한 논리를 따릅니다.
func thirdMax(ints []int) (int, error) { if len(ints) == 0 { return 0, errors.New("input slice is empty") } unique := make(map[int]struct{}) for _, num := range ints { unique[num] = struct{}{} } numsSorted := make([]int, 0, len(unique)) for num := range unique { numsSorted = append(numsSorted, num) } sort.Slice(numsSorted, func(i, j int) bool { return numsSorted[i] > numsSorted[j] }) if len(numsSorted) >= 3 { return numsSorted[2], nil } return numsSorted[0], nil }
.
두 번째 작업은 첫 글자와 마지막 글자가 그대로 유지되도록 하면서 주어진 텍스트에서 각 단어의 글자를 뒤섞는 것입니다. 공백과 구두점도 유지해야 합니다.
입력: 텍스트 문자열
출력: 입력 텍스트의 뒤죽박죽 버전입니다.
jumble_word: 이 함수는 단어를 입력으로 받아 첫 글자와 마지막 글자는 그대로 유지하면서 가운데 글자를 뒤섞습니다. 단어가 3글자 이하이면 변경되지 않고 반환됩니다. 문자를 섞기 위해 Perl의 List::Util 모듈을 사용합니다.
use List::Util 'shuffle'; sub jumble_word { my ($word) = @_; return $word if length($word) <= 3; my $middle = substr($word, 1, -1); my @m_chars = split('', $middle); @m_chars = shuffle(@m_chars); my $subst = join('', @m_chars); substr($word, 1, -1, $subst); return $word; } sub jumble_text { my ($text) = @_; my @tokens = split(/(\W+|_)/, $text); for my $token (@tokens) { if ($token =~ /^[A-Za-z]+$/) { $token = jumble_word($token); } } return join('', @tokens); }
구현으로 이동
.
package main import ( "math/rand" "regexp" "strings" "time" ) func jumbleWord(word string) string { if len(word) <= 3 { return word } middle := word[1 : len(word)-1] chars := []rune(middle) rand.Seed(time.Now().UnixNano()) rand.Shuffle(len(chars), func(i, j int) { chars[i], chars[j] = chars[j], chars[i] }) return string(word[0]) + string(chars) + string(word[len(word)-1]) } func jumbleText(text string) string { re := regexp.MustCompile(`(\W+|_)`) tokens := re.Split(text, -1) nonWordTokens := re.FindAllString(text, -1) var result []string for i, token := range tokens { if isAlpha(token) { result = append(result, jumbleWord(token)) } if i < len(nonWordTokens) { result = append(result, nonWordTokens[i]) } } return strings.Join(result, "") } func isAlpha(s string) bool { re := regexp.MustCompile(`^[A-Za-z]+$`) return re.MatchString(s) }
결론
GitHub에서 테스트를 포함한 전체 코드를 찾을 수 있습니다.
위 내용은 데이터 변환: 세 번째 최대값 및 뒤죽박죽된 문자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!