Najwyższy ciąg sumy

15

Najwyższy ciąg sumy

Podany ciąg wejściowy zwraca słowo z najwyższą sumą każdego ze znaków Unicode.

Zasady

  • Dane wejściowe powinny być oddzielone spacjami
  • Wartość każdego słowa opiera się na sumie każdego znaku w kodzie UTF-16 słowa
  • Wynik powinien być pierwszym słowem o najwyższej wartości (w przypadku zduplikowanych sum)

Przykłady

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

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź! Powodzenia :)

GammaGames
źródło
Czy zawsze będzie co najmniej jedno miejsce (co najmniej 2 słowa)?
Emigna,
2
Byłoby to bardziej interesujące w przypadku ASCII zamiast Unicode, ponieważ mogło wziąć udział więcej języków. Wymaganie obsługi Unicode wydaje się nie dodawać niczego do wyzwania
Luis Mendo
1
Najczęściej używałem Unicode, ponieważ ma emoji lol
GammaGames
2
Ponieważ wiele obecnych odpowiedzi wydaje się używać sumy jednostek kodu UTF-8 lub UTF-32, należy dodać dodatkowe przypadki testowe. Na przykład „α ää” daje różne wyniki dla UTF-8 (383 <718) i UTF-16 (945> 456).
nwellnhof,
1
Tak, dozwolony jest obszar nowej linii. Tabs też!
GammaGames,

Odpowiedzi:

3

Galaretka , 7 bajtów

ḲOS$ÐṀḢ

Wypróbuj 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
źródło
Jeśli specyfikacja jest luźna, jeśli wprowadzanie jest dozwolone jako lista słów, toO§MḢị
Jonathan Allan
@JonathanAllan Gdzie OP powiedział, że jest to dozwolone?
dylnan
nie tylko jeśli ...
Jonathan Allan
@JonathanAllan Ah, gotcha.
dylnan
1
@GammaGames Przydałaby mi się lista ciągów znaków, np ["abc", "def"]. Ale w tym momencie jest wiele odpowiedzi, więc nie polecam dodawania nowych metod wprowadzania danych
dylnan
6

R , 77 69 59 58 56 44 bajtów

Teraz wysiłek grupy.

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

Wypróbuj online!

Konwertuj na punkty kodowe, sumuj każde słowo, neguj, (stabilnie) sortuj, zwracaj pierwszy element.

Technicznie wartość zwracana to „nazwany wektor”, którego wartością jest suma, a nazwa jest zwycięskim słowem, ale wydaje się, że jest to zgodne z regułami. Jeśli chcesz zwrócić zwycięskie słowo jako ciąg, musisz wydać 7 dodatkowych bajtów i owinąć powyższe names().

ngm
źródło
Czy istnieje jakiś powód przed słowem? Kiedy go uruchomię, "💀 👻 🤡 🦇 🕷️ 🍬 🎃"drukuje się " 🕷️ "(z kilkoma spacjami przed nim)
GammaGames
2
@GammaGames wyjście to tak zwany „nazwany wektor” w R. W tym przypadku wartość jest sumą punktów kodowych zwycięskiego słowa, a wraz z nim drukowana jest nazwa, która w tym przypadku jest zwycięskim słowem samo. Nazwa jest wyrównana do liczby pod nią.
ngm
Och, fajnie! Wygląda na to, że przestrzega zasad, więc pozwolę na to. Fajne wejście!
GammaGames,
sort(-sapply(...))jest krótszy o 3 bajty.
Giuseppe,
3
@JayCe mapplyrobi unlistza darmo.
ngm
5

05AB1E , 8 bajtów

ð¡RΣÇO}θ

Wypróbuj online!

Wyjaśnienie

ð¡          # split input on spaces
  R         # reverse the resulting list
   Σ  }     # sort by
    ÇO      # sum of character codes
       θ    # take the last
Emigna
źródło
Wow, zawsze jestem zaskoczony odpowiedziami w dedykowanych językach golfowych!
GammaGames,
Dlaczego musisz odwrócić wynikową listę? I tak zostanie posortowane, prawda? A może Rfaktycznie odwraca listę po posortowaniu?
FireCubez,
@FireCubez Do testu i mają taką samą największą sumę Unicode. Więc bez rewersu byłoby wyjście zamiast . Btw, Emigna, użyj, aby zapisać bajt. ;) EDYCJA: Nieważne. Widzę, że nie zawija danych wejściowych na liście dla wprowadzania pojedynczych słów. To niefortunne. àà as a testààtesttestàà#
Kevin Cruijssen
4

JavaScript (ES6), 81 bajtów

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

Wypróbuj online!

Arnauld
źródło
To o wiele lepsze niż kod, który wymyśliłem, kiedy pisałem wyzwanie, mój miał ~ 200 znaków!
GammaGames,
72 bajty
guest271314
@ guest271314 nie działa dla drugiego ostatniego przypadku testowego i niektórych ekstremalnych przypadków, takich jakf("😂 龘龘龘龘龘")
Shieru Asakoto
@ShieruAsakoto Pojawia się tutaj, aby zwrócić poprawny wynik tio.run/##y0osSyxOLsosKNHNy09J/… ? Jaki jest oczekiwany wynik "😂 龘龘龘龘龘"?
guest271314,
Oh nvm 隣(\uf9f1)był tym w bloku CJK Compatibility Ideograph zamiast lol. Myślałem, że tak 隣(\u96a3), ten w bloku CJK Unified Ideograph.
Shieru Asakoto,
4

jq, 61 43 57 37 znaków

( 57 39 53 33 znaki kod + 4 znaki opcje wiersza poleceń)

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

Przykładowy przebieg:

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

Wypróbuj online!

człowiek w pracy
źródło
W rzeczy samej. Brakowało tej sprawy. ☹ Dzięki, @nimi.
manatwork
4

Pyth, 8 bajtów

h.MsCMZc

Zestaw testowy

Wiem, że jest już odpowiedź na Pyth, ale wydaje mi się, że to podejście jest zupełnie inne, a ponadto jest o wiele krótsze

Wyjaśnienie:
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
źródło
Wow, to naprawdę precyzyjne! Dziękuję za wyjaśnienie!
GammaGames,
4

PowerShell , 74 52 bajty

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

Wypróbuj online!

Dzięki mazzy za aż -22 bajty.

-splits dane wejściowe $argsna białych znakach, potoki, które sortmają określony mechanizm sortowania {...}i -uflagę nique.

Tutaj bierzemy bieżące słowo $_, zmieniając je toCharArra y, a następnie do każdej litery dodajemy je do naszego $result. To zamienia ciąg w liczbę na podstawie jego reprezentacji UTF-16.

Po raz pierwszy program PowerShell mający wszystkie ciągi znaków w tle UTF-16 jest ratunkiem dla życia!

Następnie enkapsulujemy te wyniki w (...)celu przekształcenia ich w tablicę i bierzemy ostatni [-1], tj. Największy wynik, który jest najbliższy początku zdania. Działa to ze względu na -uflagę nique, tzn. Jeśli późniejszy element ma tę samą wartość, jest odrzucany. To słowo pozostawia się w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
jest mądry. Dzięki. 2 momenty: dlaczego nie sort -uodwrócić? może wystarczyć +do przeliczenia liczby? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy
więcej golf: (-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]:)
mazzy
@mazzy Tak, dziękuję!
AdmBorkBork,
3

Python 3 , 55 52 bajtów

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

Wypróbuj online!

  • -3 bajty dzięki Gigaflop za wskazanie, że w splitmetodzie nie jest potrzebny żaden argument .
dylnan
źródło
Możesz zapisać 3 bajty, nie przekazując żadnych argumentów split(), ponieważ dzieli się na dowolną grupę białych znaków.
Gigaflop,
2

MATLAB, 57 bajtów

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

W moim MATLAB R2016a wszystkie testy są zaliczone, z wyjątkiem tego, że emoji nie są poprawnie renderowane. Ale znaki są zwracane poprawnie

aaaaa mówi o przywróceniu Moniki
źródło
2

Japt -h , 8 bajtów

Podejście @Enigma

¸w ñ_¬xc

Wypróbuj online!


Inne podejście

Japt -g , 8 bajtów

¸ñ@-X¬xc

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
Identyczne z tym, co miałem zamiar opublikować. Denerwuje mnie potrzeba odwrócenia; wolelibyśmy, gdybyśmy mogli wypisać dowolne słowo w przypadku remisu.
Kudłaty
@Shaggy, jeśli to było możliwe, mam na to 6 bajtów odpowiedź
Luis Felipe De Jesus Munoz
Ten sam 6-bajtowy, z którym zacząłem, zanim zauważyłem ten wymóg w specyfikacji.
Kudłaty
Przykro mi! Początkowo, kiedy wyodrębniłem wyzwanie, pomyślałem, że może to dać jedną z odpowiedzi, ale zmieniłem go po niewielkiej opinii, aby był bardziej spójny
GammaGames,
2

Java (JDK) , 117 97 84 bajtów

-13 bajtów dzięki @Nevay. Najwyraźniej nie wiedziałem, że mogę także używać varw Javie.

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

Wypróbuj online!

Shieru Asakoto
źródło
-13 bajtów:s->{var b="";for(var a:s.split(" "))b=a.chars().sum()>b.chars().sum()?a:b;return b;}
Nevay,
1

Ruby, 45 znaków

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

Przykładowy przebieg:

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

Wypróbuj online!

Ruby 2.4, 40 znaków

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

(Niesprawdzone)

człowiek w pracy
źródło
1

Pyth , 33 bajty

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Wypróbuj online!

Jest prawie na pewno lepszy sposób, aby to zrobić, ale wydałem na to zbyt wiele, więc to wystarczy.

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

Przepuściłbym redukcję na inną mapę zamiast korzystać z pętli for, ale nie mogłem tego uruchomić.

Tryer
źródło
Och, chłopcze, pytkowa odpowiedź! Dzięki za wyjaśnienie, miły wpis!
GammaGames,
1

Węgiel drzewny , 20 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⪪S θ

Podziel ciąg wejściowy na spacje i przypisz do q.

≔EθΣEι℅λη

Obliczyć sumę rzędnych znaków w każdym słowie i przypisać do h.

§θ⌕η⌈η

Znajdź indeks najwyższej sumy i wydrukuj słowo pod tym indeksem.

Neil
źródło
1

PowerShell, 66 bajtów

Bezpośredni. Zobacz odpowiedź AdmBorkBork , aby znaleźć sprytne użycie PowerShell.

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

Uwaga! Aby poprawić pracę z Unicode, zapisz plik skryptu za pomocą UTF-16lub UTF8 with BOMkodowania.

Skrypt testowy:

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

Wynik:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
mazzy
źródło