最高値文字列


15

最高値文字列

入力文字列を指定すると、各Unicode文字の合計が最も高い単語を返します。

ルール

  • 入力は空白で区切る必要があります
  • 各単語の値は、単語のUTF-16コードの各文字の合計に基づいています
  • 出力は、最大値を持つ最初の単語である必要があります(合計が重複している場合)

Input: "a b c d e"
Output: "e"

Input: "hello world"
Output: "world"

Input: "this is a test"
Output: "test"

Input: "àà as a test"
Output: "àà"

Input "α ää"
Output: "α"

Input: "🍬 隣隣隣"
Output: "隣隣隣"

Input: "💀 👻 🤡 🦇 🕷️ 🍬 🎃"
Output: "🕷️"

これはコードゴルフですので、最短の答えが勝ちです!幸運を :)


常に少なくとも1つのスペース(少なくとも2つの単語)がありますか?
エミグナ

2
これは、より多くの言語が参加できたため、UnicodeではなくASCIIを使用した場合により興味深いものになります。ユニコードのサポートを要求しても、課題に何も追加されないようです
ルイスメンドー

1
絵文字が含まれているため、ほとんどUnicodeを使用しましたlol
GammaGames

2
現在の回答の多くはUTF-8またはUTF-32コード単位の合計を使用しているように見えるため、追加のテストケースを追加する必要があります。たとえば、「αää」は、UTF-8(383 <718)とUTF-16(945> 456)で異なる結果をもたらします。
-nwellnhof

1
ええ、改行領域は許可されています。タブも!
GammaGames

回答:


3

ゼリー、7バイト

ḲOS$ÐṀḢ

オンラインでお試しください!

ḲOS$ÐṀḢ
Ḳ        Split input on spaces
    ÐṀ   Give words that have maximum of:
   $       Monad:
 O           ord(each character)
  S          sum
      Ḣ  First word that gives the max ord-sum.

仕様が単語のリストとして許可されている入力に緩和されている場合O§MḢị
ジョナサンアラン

@JonathanAllan OPはそれが許可されたとどこで言ったのですか?
ディルナン


@ジョナサンアランああ、やった
ディルナン

1
@GammaGamesたとえば、文字列のリストを取得できれば助かり["abc", "def"]ます。しかし、この時点で多くの答えがあるので、新しい入力方法を追加することはお勧めしません
-dylnan


6

R77 69 59 58 56 44バイト

今のグループの努力。

'^'=mapply
sort(-sum^utf8ToInt^scan(,""))[1]

オンラインでお試しください!

コードポイントに変換し、各単語を合計し、否定し、(安定して)ソートし、最初の要素を返します。

技術的には、戻り値は「名前付きベクトル」であり、その値は合計であり、名前は勝者の単語ですが、これは規則に従っているようです。勝者の単語を文字列として返したい場合は、さらに7バイトを費やして上記をでラップする必要がありますnames()


単語の前にスペースがある理由はありますか?実行すると"💀 👻 🤡 🦇 🕷️ 🍬 🎃"、印刷されます" 🕷️ "(前にたくさんのスペースがあります)
-GammaGames

2
@GammaGames出力は、Rの「名前付きベクトル」と呼ばれるものです。この場合、値は勝者の単語のコードポイントの合計であり、名前はそれに沿って出力されます。この場合、勝者の単語です自体。名前は、その下の数字に合わせて右揃えされます。
-ngm

ああ、すっきり!ルールに従っているように見えるので、許可します。クールなエントリー!
GammaGames

sort(-sapply(...))3バイト短くなります。
ジュゼッペ

3
@JayCe mapplyunlist無料です。
ngm

5

05AB1E、8バイト

ð¡RΣÇO}θ

オンラインでお試しください!

説明

ð¡          # split input on spaces
  R         # reverse the resulting list
   Σ  }     # sort by
    ÇO      # sum of character codes
       θ    # take the last

うわー、私はいつも専用のゴルフ言語で行われた答えに驚いています!
GammaGames

結果のリストを逆にする必要があるのはなぜですか?とにかくソートされますよね?または、Rソート後にリストを実際に逆にしますか?
FireCubez

@FireCubezテストケースàà as a testààtestは、同じ最大Unicode合計を持ちます。そのため、のtest代わりにが出力されààます。ところで、エミグナ、#バイトを保存するために使用します。;)編集:気にしません。私はそれが単一の単語入力のためにリストの入力をラップしないのを見ます。それは残念です。
ケビンCruijssen

4

JavaScript(ES6)、81バイト

s=>s.split` `.map(m=s=>m=[...s].map(c=>t+=c.charCodeAt(),t=0)&&t<=m?m:(r=s,t))&&r

オンラインでお試しください!


これは、チャレンジを書いているときに思いついたコードよりもはるかに優れています。
GammaGames


@ guest271314のように最後から二番目のテストケースとのためにいくつかの極端なケースを動作しませんf("😂 龘龘龘龘龘")
Shieru Asakoto

@ShieruAsakototio.run/##y0osSyxOLsosKNHNy09J/…ここに正しい結果を返すようです。期待される結果は"😂 龘龘龘龘龘"何ですか?
-guest271314

代わり隣(\uf9f1)に、nvm はCJK Compatibility Ideographブロックの1つでした(笑)。隣(\u96a3)CJK Unified Ideographブロックの1つであると考えられていました。
浅琴しえる


4

Pyth、8バイト

h.MsCMZc

テストスイート

すでにPythの回答があることは知っていますが、これはかなり異なるアプローチ使用しているように感じます。

説明:
h.MsCMZc  | Full code
h.MsCMZcQ | with implicit variables added
----------+------------------------------------
h         | The first element of
       cQ | the input chopped at whitespace
 .M       | with the maximal value for
   s      | the sum of
    CMZ   | the Unicode value of each character

うわー、それは本当に正確です!説明してくれてありがとう!
-GammaGames

4

PowerShell74 52バイト

(-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]

オンラインでお試しください!

なんと-22バイトのmazzyに感謝します。

-split$args空白の入力sort、特定のソートメカニズムを使用したパイプ{...}-uniqueフラグ。

ここでは、現在の単語を取り、$_それをtoCharArra に変更していますy。次に、文字ごとに結果に追加します$r。これにより、文字列はUTF-16表現に基づいて数値に変換されます。

一度、すべての文字列がバックグラウンドでUTF-16であるPowerShellは命の恩人です!

次に、これらの結果をカプセル化(...)して配列に変換し、最後の[-1]結果、つまり文の先頭に最も近い最大の結果を取得します。これは、-uniqueフラグが原因で機能します。つまり、同じ値を持つ新しい要素が存在する場合、それは破棄されます。その単語はパイプラインに残り、出力は暗黙的です。


それは賢いです。ありがとう。2モーメント:なぜsort -u逆ではないのですか?+数を変換するには十分ですか?(-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy

より多くのゴ​​ルフ:(-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]:)
奇抜な

@mazzyはい、ありがとう!
AdmBorkBork


2

MATLAB、57バイト

s=strsplit(input('','s'));[Y I]=max(cellfun(@sum,s));s(I)

私のMATLAB R2016aでは、絵文字が適切にレンダリングされないことを除き、すべてのテストに合格します。しかし、文字は正しく返されます


2

ジャプト -h、8バイト

@Enigmaアプローチ

¸w ñ_¬xc

オンラインでお試しください!


別のアプローチ

Japt -g、8バイト

¸ñ@-X¬xc

オンラインでお試しください!


私が投稿しようとしていたものと同じです。逆転の必要性は私を困らせます。同数の場合に単語のいずれかを出力できれば好まれます。
シャギー

@Shaggyそれが可能であれば、6バイトの回答があります
ルイスフェリペデジェススムニョス

仕様でその要件を見つける前に始めたのと同じ6バイト。
シャギー

申し訳ありません!もともとチャレンジをサンドボックス化したとき、答えを出力できると考えていましたが、少しフィードバックを加えてから変更したので、より一貫性がありました
-GammaGames


1

ルビー、45文字

->s{s.split.max_by{|w|w.codepoints.reduce:+}}

サンプル実行:

irb(main):001:0> ->s{s.split.max_by{|w|w.codepoints.reduce:+}}['àà as a test']
=> "àà"

オンラインでお試しください!

Ruby 2.4、40文字

->s{s.split.max_by{|w|w.codepoints.sum}}

(テストされていません。)


1

Pyth、33バイト

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

オンラインでお試しください!

ほぼ確実にこれを行うためのより良い方法がありますが、私はこれに多くを費やしましたので、これはできます。

FH  #For every array of letters in 
  mCd   #the array of arrays of letters [['w', 'o', 'r', 'l', 'd'], ['h', 'e', 'l', 'l', 'o']]
     mcd)   #wrap that in another array [[hello"], ["world"]]
         Kczd   #split input(z) on spaces ["hello", "world"] and assign it to K for later
              aY     #append to list Y... " " silences the prints from the for loop.
                u+GH    #reduce the list of numbers by summing them    
                    mCdH    #convert each letter in the array to its int counterpart
                        0)    #the zero for the accumulator and close for loop
                          @K    #get by index the word from K
                            xY   #find the index in Y of that number
                              eSY   #sort Y, get the last (largest) number

forループを使用する代わりにreduceを別のマップに渡しますが、それを機能させることはできませんでした。


ああ、ピスの答えだ!説明をありがとう、素敵なエントリー!
GammaGames

1

、20バイト

≔⪪S θ≔EθΣEι℅λη§θ⌕η⌈η

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔⪪S θ

入力文字列をスペースで分割し、割り当てます qます。

≔EθΣEι℅λη

各単語の文字の序数の合計を計算し、割り当てます hます。

§θ⌕η⌈η

最も高い合計のインデックスを見つけ、そのインデックスで単語を出力します。


1

Powershell、66バイト

簡単です。Powershellの賢い使い方を見つけたAdmBorkBorkの答えをご覧ください。

-split$args|%{$s=0
$_|% t*y|%{$s+=$_}
if($s-gt$x){$w=$_;$x=$s}}
$w

注意!Unicodeでの作業を修正するには、UTF-16またはでスクリプトファイルを保存しますUTF8 with BOMエンコードを。

テストスクリプト:

$f = {

-split$args|%{$s=0         # split argument strings by whitespaces, for each word
$_|% t*y|%{$s+=$_}         # let $s is sum of unicode char code
if($s-gt$x){$w=$_;$x=$s}}  # if $s greater then previous one, store word and sum to variables
$w                         # return word from stored variable

}

@(
    ,("a b c d e", "e")

    ,("hello world", "world")

    ,("this is a test", "test")

    ,("àà as a test", "àà")

    ,("α ää", "α")

    ,("🍬 隣隣隣", "隣隣隣")

    ,("💀 👻 🤡 🦇 🕷️ 🍬 🎃", "🕷️")
) | % {
    $s,$e=$_
    $r=&$f $s
    "$($r-eq$e): $r"
}

出力:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.