Верховна сума рядка


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

Це кодовий гольф, тому найкоротша відповідь виграє! Удачі :)


Чи завжди буде принаймні один пробіл (принаймні 2 слова)?
Емінья

2
Це було б цікавіше для ASCII замість Unicode, оскільки більше мов могло брати участь. Потрібна підтримка Unicode, схоже, нічого не додасть до виклику
Луїс Мендо

1
Я здебільшого використовував Unicode, тому що у нього є emojis 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 Де ОП сказав, що це дозволено?
Ділнан

не просто, якщо ...
Джонатан Аллан

@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 вихід - це те, що в Р. називається "іменованим вектором". У цьому випадку значення - це сума кодових очок виграшного слова, а разом з ним друкується ім'я, що в цьому випадку є переможним словом себе. Ім’я вирівняно правою цифрою під ним.
ngm

О, акуратне! Схоже, він дотримується правил, тому я дозволю це. Класний запис!
GammaGames

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

3
@JayCe mapplyробить це unlistбезкоштовно.
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 Для тесту і мають однакову найбільшу суму Юникода. Таким чином, без зворотного буде виводиться замість . Btw, Емінья, використовуйте для збереження байта. ;) EDIT: Неважливо. Я бачу, що він не вкладає введення в список для введення одного слова. Це прикро. àà 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("😂 龘龘龘龘龘")
Шиєру Асакото

@ShieruAsakoto З'являється, щоб повернути правильний результат тут tio.run/##y0osSyxOLsosKNHNy09J/… ? Який очікуваний результат "😂 龘龘龘龘龘"?
гість271314

Ой, nvm 隣(\uf9f1)був одним із блоків Ideograph сумісності CJK замість lol. Думав, що це той 隣(\u96a3), що знаходиться в блоці CJK Unified Ideograph.
Шиеру Асакото


4

Pyth, 8 байт

h.MsCMZc

Тестовий набір

Я знаю, що відповідь Pyth вже є, але я відчуваю, що для цього використовується досить інший підхід а також він коротше waaaay

Пояснення:
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прапор нікеля.

Тут ми приймаємо поточне слово $_, змінюючи його на 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

@mazzy Так, дякую!
AdmBorkBork

3

Python 3 , 55 52 байти

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

Спробуйте в Інтернеті!

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

Ви можете зберегти 3 байти, не передаючи жодних аргументів split(), оскільки він розбивається на будь-яку групу пробілів.
Гігафлоп

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

Спробуйте в Інтернеті!


Ідентично тому, що я збирався розмістити. Потреба у відвороті дратує мене; Я вважав за краще, якби ми могли вивести будь-яке слово у випадку зв'язання.
Shaggy

@Shaggy, якщо це було можливо, у мене є відповідь на це 6 байт
Luis felipe De jesus Munoz

Той же 6-байтний, з якого я почав, перш ніж помітити цю вимогу в специфікації.
Shaggy

Пробач! Спочатку, коли я випробовував пісочне завдання, я вважав, що він може отримати будь-яку відповідь, але я змінив його після невеликого відгуку, щоб він був більш послідовним
GammaGames



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.