Supreme Sum String

15

Supreme Sum String

Geben Sie bei einer gegebenen Eingabezeichenfolge das Wort mit der höchsten Summe der einzelnen Unicode-Zeichen zurück.

Regeln

  • Die Eingabe sollte durch Leerzeichen getrennt werden
  • Der Wert jedes Wortes basiert auf der Summe jedes Zeichens im UTF-16-Code des Wortes
  • Die Ausgabe sollte das erste Wort mit dem höchsten Wert sein (bei doppelten Summen)

Beispiele

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: "🕷️"

Das ist Codegolf, also gewinnt die kürzeste Antwort! Viel Glück :)

GammaGames
quelle
Wird es immer mindestens ein Leerzeichen geben (mindestens 2 Wörter)?
Emigna
2
Dies wäre bei ASCII interessanter gewesen als bei Unicode, da mehr Sprachen hätten teilnehmen können. Das Erfordernis der Unicode-Unterstützung scheint der Herausforderung nichts hinzuzufügen
Luis Mendo
1
Ich habe meistens Unicode verwendet, weil es Emojis lol hat
GammaGames
2
Da viele der aktuellen Antworten die Summe der UTF-8- oder UTF-32-Codeeinheiten zu verwenden scheinen, sollten Sie einige zusätzliche Testfälle hinzufügen. Zum Beispiel liefert "α ää" unterschiedliche Ergebnisse mit UTF-8 (383 <718) und UTF-16 (945> 456).
Nwellnhof
1
Ja, Newlines-Bereich erlaubt. Tabs auch!
GammaGames

Antworten:

3

Gelee , 7 Bytes

ḲOS$ÐṀḢ

Probieren Sie es online!

Ḳ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.
dylnan
quelle
Wenn die Spezifikation für die Eingabe als eine Liste von Wörtern dann erlaubt istO§MḢị
Jonathan Allan
@ JonathanAllan Wo hat OP gesagt, dass das erlaubt ist?
Dylnan
nicht nur, wenn ...
Jonathan Allan
@ JonathanAllan Ah, gotcha.
Dylnan
1
@ GammaGames Es würde helfen, wenn ich eine Liste von Zeichenfolgen nehmen könnte, z ["abc", "def"]. Aber an dieser Stelle gibt es viele Antworten, so dass ich nicht empfehle, neue Eingabemethoden
hinzuzufügen
6

R , 77 69 59 58 56 44 Bytes

Eine Gruppenanstrengung jetzt.

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

Probieren Sie es online!

In Codepunkte konvertieren, jedes Wort aufsummieren, negieren, (stabil) sortieren, erstes Element zurückgeben.

Technisch gesehen ist der Rückgabewert ein "benannter Vektor", dessen Wert die Summe und der Name das Gewinnerwort ist, aber dies scheint den Regeln zu folgen. Wenn Sie das gewinnende Wort als Zeichenfolge zurückgeben möchten, müssen Sie 7 weitere Bytes ausgeben und die obigen Zeilen einschließen names().

ngm
quelle
Gibt es einen Grund, warum vor dem Wort Leerzeichen stehen? Wenn ich es darauf laufen "💀 👻 🤡 🦇 🕷️ 🍬 🎃"" 🕷️ "
lasse,
2
Bei @GammaGames ist die Ausgabe ein sogenannter "benannter Vektor" in R. In diesem Fall ist der Wert die Summe der Codepunkte des Gewinnerworts, und der Name wird zusammen mit diesem gedruckt, in diesem Fall das Gewinnerwort selbst. Der Name ist rechtsbündig mit der Zahl darunter ausgerichtet.
ngm
Oh, ordentlich! Es sieht so aus, als würde es den Regeln folgen, also werde ich es zulassen. Cooler Eintrag!
GammaGames
sort(-sapply(...))ist um 3 Bytes kürzer.
Giuseppe
3
@ JayCe mapplymacht das unlistkostenlos.
ngm
5

05AB1E , 8 Bytes

ð¡RΣÇO}θ

Probieren Sie es online!

Erläuterung

ð¡          # split input on spaces
  R         # reverse the resulting list
   Σ  }     # sort by
    ÇO      # sum of character codes
       θ    # take the last
Emigna
quelle
Wow, ich bin immer wieder erstaunt über die Antworten in speziellen Golfsprachen!
GammaGames
Warum müssen Sie die resultierende Liste umkehren? Es wird sowieso sortiert, oder? Oder kehrt die RListe tatsächlich um, nachdem sie sortiert wurde?
FireCubez
@FireCubez Für Testfall àà as a testdes ààund testhat die gleiche größte Unicode - Summe. Also ohne die Umkehrung testwürde statt ausgegeben àà. Übrigens, Emigna, #zum Speichern eines Bytes. ;) EDIT: Egal. Ich sehe, dass die Eingabe nicht in eine Liste für Einzelworteingaben eingeschlossen wird. Das ist bedauerlich.
Kevin Cruijssen
4

JavaScript (ES6), 81 Byte

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

Probieren Sie es online!

Arnauld
quelle
Das ist viel besser als der Code, den ich mir beim Schreiben der Challenge ausgedacht habe. Mein Code hatte eine Länge von ca. 200 Zeichen!
GammaGames
72 Bytes
guest271314
@ guest271314 funktioniert nicht für den vorletzten Testfall und einige Extremfälle wief("😂 龘龘龘龘龘")
Shieru Asakoto
@ShieruAsakoto Scheint hier ein korrektes Ergebnis zurückzugeben tio.run/##y0osSyxOLsosKNHNy09J/… ? Wofür wird ein Ergebnis erwartet "😂 龘龘龘龘龘"?
guest271314
Oh, nvm 隣(\uf9f1)war der im CJK-Kompatibilitäts-Ideogrammblock, lol. Dachte schon 隣(\u96a3), der im CJK Unified Ideograph-Block.
Shieru Asakoto
4

jq, 61 43 57 37 Zeichen

( 57 39 53 33 Zeichen Code + 4 Zeichen Befehlszeilenoptionen)

./" "|reverse|max_by(explode|add)

Probelauf:

bash-4.4$ jq -Rr './" "|reverse|max_by(explode|add)' <<< 'àà as a test'
àà

Probieren Sie es online!

Mann bei der Arbeit
quelle
Tatsächlich. Verpasste diesen Fall. ☹ Danke, @nimi.
Manatwork
4

Pyth, 8 Bytes

h.MsCMZc

Testsuite

Ich weiß, dass es bereits eine Pyth-Antwort gibt, aber ich habe das Gefühl, dass dies eine ganz andere Herangehensweise verwendet und dass es auch kürzer ist

Erläuterung:
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
hakr14
quelle
Wow, das ist wirklich genau! Danke für die Erklärung!
GammaGames
4

PowerShell , 74 52 Byte

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

Probieren Sie es online!

Danke an mazzy für die satten -22 Bytes.

-splits die Eingabe $argsauf Whitespace, leitet das sortmit einem bestimmten Sortiermechanismus{...} und der -uNique-Flagge.

Hier nehmen wir das aktuelle Wort $_, ändern es toCharArra yund fügen es dann für jeden Buchstaben in unser $rErgebnis ein. Dadurch wird die Zeichenfolge basierend auf der UTF-16-Darstellung in eine Zahl umgewandelt.

PowerShell mit UTF-16-Zeichenfolgen im Hintergrund ist ausnahmsweise ein Lebensretter!

Wir kapseln diese Ergebnisse dann ein, (...)um sie in ein Array umzuwandeln, und nehmen das letzte [-1], dh das größte Ergebnis, das dem Satzanfang am nächsten liegt. Dies funktioniert aufgrund des -uNique-Flags, dh wenn es ein späteres Element gibt, das denselben Wert hat, wird es verworfen. Dieses Wort bleibt in der Pipeline und die Ausgabe ist implizit.

AdmBorkBork
quelle
es ist schlau. Vielen Dank. 2 Momente: Warum nicht sort -ustattdessen eine Umkehrung? kann das ausreichen +um die nummer umzurechnen? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy
mehr Golf: (-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]:)
mazzy
@mazzy Ja, danke!
AdmBorkBork
3

Python 3 , 55 52 Bytes

lambda s:max(s.split(),key=lambda w:sum(map(ord,w)))

Probieren Sie es online!

  • -3 Bytes Danke an Gigaflop für den Hinweis, dass in der splitMethode kein Argument benötigt wird.
dylnan
quelle
Sie können 3 Bytes sparen, indem Sie keine Argumente an übergeben split(), da diese auf eine beliebige Gruppe von Leerzeichen aufgeteilt werden.
Gigaflop
2

MATLAB, 57 Bytes

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

In meinem MATLAB R2016a sind alle Tests bestanden, außer dass Emojis nicht richtig gerendert werden. Zeichen werden jedoch korrekt zurückgegeben

aaaaa sagt wieder Monica
quelle
2

Japt -h , 8 Bytes

@ Enigma Ansatz

¸w ñ_¬xc

Probieren Sie es online!


Ein anderer Ansatz

Japt -g , 8 Bytes

¸ñ@-X¬xc

Probieren Sie es online!

Luis Felipe De Jesus Munoz
quelle
Identisch mit dem, was ich gerade posten wollte. Die Notwendigkeit der Umkehrung ärgert mich; Ich hätte es vorgezogen, wenn wir bei einem Unentschieden eines der Wörter ausgeben könnten.
Shaggy
@ Shaggy, wenn das möglich war, ich habe eine 6-Byte-Antwort dafür
Luis Felipe De Jesus Munoz
Dasselbe 6-Byte-Modell, mit dem ich begonnen habe, bevor ich diese Anforderung in der Spezifikation entdeckte.
Shaggy
Es tut mir Leid! Ursprünglich dachte ich, als ich die Herausforderung sandboxte, dass sie eine der Antworten ausgeben könnte, aber ich änderte sie nach ein wenig Feedback, damit sie konsistenter war
GammaGames,
2

Java (JDK) , 117 97 84 Byte

-13 Bytes danke @Nevay. Anscheinend wusste ich nicht, dass ich es auch varin Java verwenden kann.

s->{var b="";for(var a:s.split(" "))b=a.chars().sum()>b.chars().sum()?a:b;return b;}

Probieren Sie es online!

Shieru Asakoto
quelle
-13 Bytes:s->{var b="";for(var a:s.split(" "))b=a.chars().sum()>b.chars().sum()?a:b;return b;}
Nevay
1

Ruby, 45 Zeichen

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

Probelauf:

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

Probieren Sie es online!

Ruby 2.4, 40 Zeichen

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

(Ungetestet.)

Mann bei der Arbeit
quelle
1

Pyth , 33 Bytes

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Probieren Sie es online!

Es gibt mit ziemlicher Sicherheit einen besseren Weg, aber ich habe zu viel dafür ausgegeben, damit dies gelingt.

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

Ich hätte ein Reduce in eine andere Map eingefügt, anstatt die for-Schleife zu verwenden, aber ich konnte das nicht zum Laufen bringen.

Tryer
quelle
Oh Junge, eine Pyth-Antwort! Danke für die Erklärung, netter Eintrag!
GammaGames
1

Holzkohle , 20 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔⪪S θ

Teilen Sie die Eingabezeichenfolge auf Leerzeichen und weisen Sie zu q.

≔EθΣEι℅λη

Berechnen Sie die Summe der Ordnungszahlen der Zeichen in jedem Wort und weisen Sie zu h.

§θ⌕η⌈η

Suchen Sie den Index der höchsten Summe und drucken Sie das Wort an diesem Index.

Neil
quelle
1

Powershell, 66 Bytes

Einfach. Siehe AdmBorkBork ‚s Antwort eine intelligente Verwendung von Powershell zu gründen.

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

Hinweis! Speichern Sie Ihre Skriptdatei mit UTF-16oder , um die Arbeit mit Unicode zu korrigierenUTF8 with BOM Kodierung.

Testskript:

$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"
}

Ausgabe:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
mazzy
quelle