Высшая сумма Строка


15

Высшая сумма Строка

Если задана входная строка, верните слово с наибольшей суммой каждого из символов Юникода.

правила

  • Входные данные должны быть разделены пробелами
  • Значение каждого слова основано на сумме каждого символа в коде слова 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: "🕷️"

Это код гольф, поэтому самый короткий ответ выигрывает! Удачи :)


Всегда ли будет хотя бы один пробел (хотя бы 2 слова)?
Emigna

2
Это было бы более интересно с ASCII вместо Unicode, потому что могло бы участвовать больше языков. Требование поддержки Unicode, похоже, ничего не добавляет к этой проблеме
Луис Мендо,

1
Я в основном использовал Юникод, потому что в нем есть смайлики
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 Где ОП сказал, что это разрешено?
Дилнан

не просто если ...
Джонатан Аллан

@JonathanAllan Ах, понял.
Дилнан

1
@GammaGames Было бы полезно, если бы я мог взять список строк, например ["abc", "def"]. Но на данный момент есть много ответов, поэтому я не рекомендую добавлять новые методы ввода
dylnan


6

R , 77 69 59 58 56 44 байта

Групповые усилия сейчас.

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

Попробуйте онлайн!

Преобразование в кодовые точки, суммирование каждого слова, отрицание, (стабильно) сортировка, возврат первого элемента.

Технически возвращаемое значение является «именованным вектором», значение которого является суммой, а имя - выигрышным словом, но, похоже, это соответствует правилам. Если вы хотите вернуть выигрышное слово в виде строки, вам придется потратить еще 7 байтов и обернуть вышеупомянутое names().


Есть ли причина, почему перед словом есть пробелы? Когда я запускаю его, "💀 👻 🤡 🦇 🕷️ 🍬 🎃"он распечатывается " 🕷️ "(с кучей пробелов перед ним)
GammaGames,

2
@GammaGames на выходе получается то, что называется «именованным вектором» в R. В этом случае значение является суммой кодовых точек победного слова, и вместе с ним печатается имя, которое в данном случае является победным словом. сам. Имя выровнено по правому краю под номером под ним.
НГМ

О, аккуратно! Похоже, что он следует правилам, поэтому я позволю это. Классная запись!
GammaGames

sort(-sapply(...))короче на 3 байта.
Джузеппе

3
@JayCe mapplyделает это unlistбесплатно.
НГМ

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 Для теста и имеют одинаковую наибольшую сумму Юникода. Так что без обратного вывела бы вместо . Кстати, Emigna, используйте, чтобы сохранить байт. ;) РЕДАКТИРОВАТЬ: не важно. Я вижу, что это не обернуть ввод в список для ввода одного слова .. Это неудачно. àà as a testààtesttestàà#
Кевин Круйссен

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

Попробуйте онлайн!


Это намного лучше, чем код, который я придумал, когда писал сценарий, у меня было ~ 200 символов!
GammaGames


@ guest271314 не работает для второго последнего тестового случая и некоторых крайних случаев, таких какf("😂 龘龘龘龘龘")
Shieru Asakoto

@ShieruAsakoto Появляется, чтобы вернуть правильный результат здесь tio.run/##y0osSyxOLsosKNHNy09J/… ? Для чего нужен ожидаемый результат "😂 龘龘龘龘龘"?
guest271314

Oh nvm 隣(\uf9f1)был тем в блоке Идеографа Совместимости CJK вместо lol. Думал 隣(\u96a3), что это один из блока CJK Unified Ideograph.
Шиеру Асакото

4

JQ, 61 43 57 37 символов

( 57 39 53 33 символов кода + 4 символа параметров командной строки)

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

Образец прогона:

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

Попробуйте онлайн!


В самом деле. Пропустил тот случай. ☹ Спасибо, @nimi.
manatwork

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

PowerShell , 74 52 байта

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

Попробуйте онлайн!

Спасибо Маззи за колоссальные -22 байта.

-splits ввод данных $argsв пустое пространство, передает это sortс определенным механизмом сортировки {...}и-u флагом nique.

Здесь мы берем текущее слово $_, меняя его на toCharArra y, затем для каждой буквы добавляем его в наш результат $r. Это превращает строку в число на основе ее представления UTF-16.

На этот раз PowerShell, в котором все строки будут UTF-16 на заднем плане, спасет жизнь!

Затем мы инкапсулируем эти результаты, (...)чтобы преобразовать их в массив и взять последний [-1], т. Е. Наибольший результат, ближайший к началу предложения. Это работает из-за -uфлага nique, то есть, если есть более поздний элемент с таким же значением, он отбрасывается. Это слово остается в конвейере и вывод неявный.


это умно Благодарю. 2 момента: почему бы не sort -uнаоборот? может быть достаточно +конвертировать в число? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
Маззи

больше гольфа: (-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]:)
Маззи

@mazzy Да, спасибо!
AdmBorkBork

3

Python 3 , 55 52 байта

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

Попробуйте онлайн!

  • -3 байта, спасибо Gigaflop за указание на то, что в splitметоде не требуется никаких аргументов .

Вы можете сохранить 3 байта, не передавая аргументы split(), так как он разделяется на любую группу пробелов.
Gigaflop

2

MATLAB, 57 байт

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

В моем MATLAB R2016a все тесты пройдены, за исключением того, что смайлики не отображаются должным образом. Но символы возвращаются правильно


2

Japt -h , 8 байт

@Enigma подход

¸w ñ_¬xc

Попробуйте онлайн!


Другой подход

Japt -g , 8 байт

¸ñ@-X¬xc

Попробуйте онлайн!


Идентично тому, что я собирался опубликовать. Необходимость обращения меня раздражает; Я бы предпочел, если бы мы могли вывести любое слово в случае ничьей.
лохматый

@ Шэгги, если бы это было возможно, у меня есть 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, но я не мог заставить это работать.


О, мальчик, ответ на вопрос! Спасибо за объяснение, хорошая запись!
GammaGames

1

Древесный уголь , 20 байтов

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⪪S θ

Разбить входную строку на пробелы и присвоить q.

≔EθΣEι℅λη

Вычислите сумму порядковых чисел символов в каждом слове и присвойте h.

§θ⌕η⌈η

Найдите индекс наибольшей суммы и напечатайте слово с этим индексом.


1

Powershell, 66 байт

Непосредственная. Посмотрите ответ AdmBorkBork , чтобы найти умное использование Powershell.

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

Заметка! Чтобы исправить работу с юникодом, сохраните файл скрипта с помощью 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: 🕷️
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.