データ変換: 3 番目の最大値とごちゃ混ぜの文字

Susan Sarandon
リリース: 2024-10-05 10:32:29
オリジナル
245 人が閲覧しました

Data Transformations: Third Maximum and Jumbled Letters

この記事では、Perl Weekly Challenge #289 の 2 つの魅力的なタスクに取り組みます。配列内の 3 番目の個別の最大値を見つけることと、テキスト内の単語の文字をスクランブルすることです。最初と最後の文字が所定の位置にあります。 Perl と Go の両方でソリューションを実装します。

目次

  1. 3 番目の最大値
  2. ごちゃ混ぜの文字
  3. 結論

3 番目の最大値

最初のタスクには、指定された整数の配列内で 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 です。)

解決

Perlの実装

この実装では、一意の値のセットを作成し、それらを降順で並べ替えて、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の実装

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 番目のタスクには、指定されたテキスト内の各単語の文字をスクランブルし、最初と最後の文字が所定の位置に残るようにすることが含まれます。空白と句読点も保持する必要があります。

タスクの説明

入力: テキスト文字列。

出力: 入力テキストのごちゃ混ぜバージョン。

  • 入力: 「ケンブリッジ大学の研究によると、単語内の文字の順序は問題ではありません。」
  • 出力: (例) 「ケンブレージ大学の研究によると、混乱している状況はそれほど変化しません。」 (各単語の文字はランダムに並べ替えられますが、最初と最後の文字は変更されません。)

解決

Perlの実装

このタスクでは、2 つの関数を定義します。

  1. jumble_word: この関数は単語を入力として受け取り、最初と最後の文字はそのままに、真ん中の文字をスクランブルします。単語が 3 文字以下の場合は、変更せずに返されます。文字をシャッフルするには、Perl の List::Util モジュールを使用します。
  2. jumble_text: この関数は完全なテキスト文字列を処理し、空白と句読点を保持しながら単語に分割します。 jumble_word 関数を各単語に適用して、単語のみがスクランブルされるようにします。

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の実装

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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!