この記事では、Perl Weekly Challenge #289 の 2 つの魅力的なタスクに取り組みます。配列内の 3 番目の個別の最大値を見つけることと、テキスト内の単語の文字をスクランブルすることです。最初と最後の文字が所定の位置にあります。 Perl と Go の両方でソリューションを実装します。
最初のタスクには、指定された整数の配列内で 3 番目の個別の最大値を見つけることが含まれます。 3 番目の最大値が存在しない場合、関数は最大値を返す必要があります。
入力: 整数の配列 @ints.
出力: 3 番目の個別の最大値、または 3 番目の最大値が存在しない場合は最大数。
入力: @ints = (5, 6, 4, 1)
出力: 4
(明確な最大値は 6、5、4 です。)
入力: @ints = (4, 5)
出力: 5
(3 番目の最大値は存在しません。)
入力: @ints = (1, 2, 2, 3)
出力: 1
(個別の最大値は 3、2、1 です。)
この実装では、一意の値のセットを作成し、それらを降順で並べ替えて、3 番目の最大値を簡単に見つけます。
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 }
.
2 番目のタスクには、指定されたテキスト内の各単語の文字をスクランブルし、最初と最後の文字が所定の位置に残るようにすることが含まれます。空白と句読点も保持する必要があります。
入力: テキスト文字列。
出力: 入力テキストのごちゃ混ぜバージョン。
このタスクでは、2 つの関数を定義します。
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); }
.
Go の実装でも同様のアプローチが採用されており、文字をシャッフルするために math/rand パッケージが利用されています。
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) }
.
この記事では、配列内の 3 番目の最大値を見つけることと、テキスト内の文字をスクランブルするという 2 つの楽しいコーディングの課題を検討しました。これらのタスクは、さまざまなプログラミング言語が同様の問題にどのようにアプローチするかを示しており、それぞれに独自の強みと方法論があります。これらの例が、同様の課題に取り組み、Perl と Go の機能をさらに探求するきっかけとなることを願っています!
テストを含む完全なコードは GitHub で見つけることができます。
以上がデータ変換: 3 番目の最大値とごちゃ混ぜの文字の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。