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 :)


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.

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().


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

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!


To o wiele lepsze niż kod, który wymyśliłem, kiedy pisałem wyzwanie, mój miał ~ 200 znaków!
GammaGames,


@ 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!


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

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.


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 .

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


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!


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!


-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)


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ć.


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.


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: 🕷️
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.