最高和弦


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个字)?
Emigna '18 -10-5

2
使用ASCII而不是Unicode会更有趣,因为可以参与更多的语言。要求Unicode支持似乎并没有增加任何挑战
Luis Mendo

1
我主要使用Unicode,因为它具有表情符号,哈哈
GammaGames

2
由于许多当前答案似乎都使​​用UTF-8或UTF-32代码单元的总和,因此您应该添加一些其他测试用例。例如,“αä”对于UTF-8(383 <718)和UTF-16(945> 456)产生不同的结果。
nwellnhof

1
是的,允许换行符区域。标签也!
GammaGames

Answers:


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Ḣị
Jonathan Allan '18

@JonathanAllan OP在哪里说允许这样做?
dylnan '18

不只是……
乔纳森·艾伦

@JonathanAllan啊,真是的。
dylnan '18

1
@GammaGames如果我可以列出字符串列表,例如,这将有所帮助["abc", "def"]。但是目前有很多答案,所以我不建议添加新的输入方法
dylnan


6

R77 69 59 58 56 44字节

现在正在集体努力。

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

在线尝试!

转换为代码点,对每个单词求和,取反,(稳定)排序,返回第一个元素。

从技术上讲,返回值是一个“命名向量”,其值是总和,名称是获胜词,但这似乎遵循规则。如果您想将胜出的单词作为字符串返回,则必须再花费7个字节并将以上内容包装在中names()


这个词前面有空格是有原因的吗?当我在其上运行它时,"💀 👻 🤡 🦇 🕷️ 🍬 🎃"它会打印出来" 🕷️ "(前面有很多空格)
GammaGames

2
@GammaGames输出是R中的“命名向量”。在这种情况下,值是获胜单词的代码点之和,并且名称与该单词一起打印,在本例中为获胜单词本身。名称与下面的数字右对齐。
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测试用例àà as a testàà,并test具有相同的最大unicode的总和。因此,如果没有相反的结果,test则会输出而不是àà。顺便说一句,Emigna,用于#保存一个字节。;)编辑:没关系。我看到它没有将输入包装在单个单词输入的列表中。.不幸的是。
凯文·克鲁伊森

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/…?预期结果是"😂 龘龘龘龘龘"什么?
guest271314

哦,nvm 隣(\uf9f1)是CJK兼容性表意文字块中的那个,而不是哈哈。以为是隣(\u96a3),中日韩统一表意文字块中的那个。
Shieru Asakoto

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 '18 -10-5

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

PowerShell74 52字节

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

在线尝试!

感谢mazzy高达-22个字节。

-splits $args在空白上的输入,sort使用特定的排序机制{...}-unique标志将其输入。

在这里,我们采用当前单词$_,将其更改为toCharArra y,然后针对每个字母将其添加到结果中$r。字符串根据其UTF-16表示形式转换为数字。

一次,在后台将所有字符串都设为UTF-16的PowerShell可以节省生命!

然后,我们将这些结果封装起来,(...)以将它们转换为数组,并获取最后[-1]一个,即,最接近句子开头的最大结果。这是由于-unique标志而起作用的,即,如果后面的一个元素具有相同的值,则将其丢弃。这个词留在管道上,输出是隐式的。


很聪明 谢谢。2分钟:为什么不sort -u相反?足以+转换成数字?(-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
MAZZY

更多高尔夫:(-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

您可以通过不向传递args来节省3个字节split(),因为它会在任何空白组上拆分。
Gigaflop

2

MATLAB,57字节

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

在我的MATLAB R2016a中,通过了所有测试,但表情符号未正确呈现。但是字符正确返回


2

杰普特 -h,8字节

@谜方法

¸w ñ_¬xc

在线尝试!


另一种方法

Japt -g,8字节

¸ñ@-X¬xc

在线尝试!


与我要发布的内容相同。逆转的需要使我烦恼。如果在平局的情况下我们可以输出任何单词,那将是首选。
毛茸茸的

@Shaggy如果可能的话,我有6个字节的答案
路易斯·费利佩·德·耶稣·穆诺兹

在规格中发现该要求之前,我一开始使用的是6倍。
毛茸茸的

对不起!最初,当我对挑战进行沙盒测试时,我认为它可以输出任何答案,但我在稍加反馈后便对其进行了更改,因此更加一致
GammaGames

2

Java(JDK)117 97 84字节

-13个字节,感谢@Nevay。显然我不知道我是否也可以var在Java中使用它。

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

在线尝试!


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

1

Ruby,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

我本可以将reduce传递到另一个映射中,而不是使用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

注意!要更正unicode的工作,请使用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: 🕷️
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.