String de soma suprema


15

String de soma suprema

Dada uma sequência de entrada, retorne a palavra com a soma mais alta de cada um de seus caracteres unicode.

Regras

  • A entrada deve ser separada por espaços em branco
  • O valor de cada palavra é baseado na soma de cada caractere no código UTF-16 da palavra
  • A saída deve ser a primeira palavra com o valor mais alto (no caso de somas duplicadas)

Exemplos

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

Isso é código de golfe, então a resposta mais curta vence! Boa sorte :)


Sempre haverá pelo menos um espaço (pelo menos 2 palavras)?
Emigna

2
Isso teria sido mais interessante com o ASCII do que com o Unicode, porque mais idiomas poderiam ter participado. Exigindo suporte a Unicode não parece acrescentar nada ao desafio
Luis Mendo

1
Eu, principalmente, usado Unicode porque tem emojis lol
GammaGames

2
Como muitas das respostas atuais parecem usar a soma das unidades de código UTF-8 ou UTF-32, você deve adicionar alguns casos de teste adicionais. Por exemplo "αää" produz resultados diferentes com UTF-8 (383 <718) e UTF-16 (945> 456).
Nwellnhof 5/10

1
Sim, a área de novas linhas é permitida. Guias também!
GammaGames 5/10

Respostas:


3

Geléia , 7 bytes

ḲOS$ÐṀḢ

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

Se a especificação é relaxada para a entrada de serem autorizados como uma lista de palavras, entãoO§MḢị
Jonathan Allan

@ JonathanAllan Onde a OP disse que isso era permitido?
dylnan

não apenas se ...
Jonathan Allan

@JonathanAllan Ah, entendi.
dylnan

1
@ GammaGames Ajudaria se eu pudesse pegar uma lista de strings, por exemplo ["abc", "def"]. Mas neste momento, há uma série de respostas, então eu não recomendo a adição de novos métodos de entrada
dylnan


6

R , 77 69 59 58 56 44 bytes

Um esforço de grupo agora.

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

Experimente online!

Converta em pontos de código, some cada palavra, negue, classifique (de forma estável), retorne o primeiro elemento.

Tecnicamente, o valor de retorno é um "vetor nomeado" cujo valor é a soma e o nome é a palavra vencedora, mas isso parece seguir as regras. Se você quiser retornar a palavra vencedora como uma sequência, precisará gastar mais 7 bytes e agrupar o texto acima em names().


Existe uma razão para haver espaços na frente da palavra? Quando eu executá-lo em "💀 👻 🤡 🦇 🕷️ 🍬 🎃"ele imprime " 🕷️ "(com um monte de espaços na frente dele)
GammaGames

2
@GammaGames a saída é o que é chamado de "vetor nomeado" em R. Nesse caso, o valor é a soma dos pontos de código da palavra vencedora e o nome é impresso junto com ela, que neste caso é a palavra vencedora em si. O nome está alinhado à direita com o número abaixo dele.
ngm

Oh, legal! Parece que segue as regras, então eu permitirei. Entrada legal!
GammaGames 5/1018

sort(-sapply(...))é mais curto em 3 bytes.
Giuseppe

3
@JayCe mapplyfaz o unlistde graça.
Ngm 5/10

5

05AB1E , 8 bytes

ð¡RΣÇO}θ

Experimente online!

Explicação

ð¡          # split input on spaces
  R         # reverse the resulting list
   Σ  }     # sort by
    ÇO      # sum of character codes
       θ    # take the last

Uau, eu sempre fico impressionado com as respostas dadas em idiomas dedicados ao golfe!
GammaGames 5/1018

Por que você precisa reverter a lista resultante? Vai ser resolvido de qualquer maneira, certo? Ou, na Rverdade, reverte a lista depois que ela é classificada?
FireCubez

@FireCubez Para caso de teste àà as a testdo ààe testtêm o mesmo maior soma unicode. Portanto, sem o inverso testseria a saída em vez de àà. Btw, Emigna, use #para salvar um byte. ;) EDIT: Não importa. Vejo que não envolve a entrada em uma lista de entradas de palavra única. Isso é lamentável.
Kevin Cruijssen 6/10/10

4

JavaScript (ES6), 81 bytes

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

Experimente online!


Isso é muito melhor do que o código que eu criei quando escrevi o desafio, o meu tinha cerca de 200 caracteres!
GammaGames 5/10


@ guest271314 não funciona no segundo último caso de teste e em alguns casos extremos comof("😂 龘龘龘龘龘")
Shieru Asakoto 6/06

@ShieruAsakoto Parece retornar o resultado correto aqui tio.run/##y0osSyxOLsosKNHNy09J/… ? Qual é o resultado esperado "😂 龘龘龘龘龘"?
guest271314

Ah, nvm 隣(\uf9f1)foi o bloco CJK Compatibility Ideograph ao invés lol. Pensei que fosse 隣(\u96a3), aquele no bloco Ideograph CJK Unified.
Shieru Asakoto

4

jq, 61 43 57 37 caracteres

( Código de 57 39 53 33 caracteres + opções de linha de comando de 4 caracteres)

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

Exemplo de execução:

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

Experimente online!


De fato. Perdeu esse caso. ☹ Obrigado, @nimi.
manatwork

4

Pitão, 8 bytes

h.MsCMZc

Suíte de teste

Eu sei que já existe uma resposta Pyth, mas acho que isso usa uma abordagem bem diferente e também é muito mais curta

Explicação:
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

Uau, isso é realmente preciso! Obrigada pelo esclarecimento!
GammaGames

4

PowerShell , 74 52 bytes

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

Experimente online!

Graças ao mazzy por incríveis 22 bytes.

-splits a entrada $argsno espaço em branco, canaliza sortcom um mecanismo de classificação específico {...}e o-u bandeira nique.

Aqui estamos pegando a palavra atual $_, alterando-a toCharArra e y, a cada letra, a adicionamos ao nosso$r . Isso transforma a string em um número com base em sua representação UTF-16.

Pela primeira vez, o PowerShell com todas as seqüências de caracteres sendo UTF-16 em segundo plano é um salva-vidas!

Em seguida, encapsulamos esses resultados (...)para transformá-los em uma matriz e pegamos o último [-1], ou seja, o maior resultado que é o mais próximo do início da frase. Isso funciona por causa da -uflag nique, ou seja, se houver um elemento posterior que tenha o mesmo valor, ele será descartado. Essa palavra é deixada no pipeline e a saída está implícita.


é esperto. Obrigado. 2 momentos: por que não fazer o sort -ucontrário? pode ser suficiente +para converter o número? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
Mazzy

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

@mazzy Sim, obrigado!
AdmBorkBork

3

Python 3 , 55 52 bytes

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

Experimente online!

  • -3 bytes graças ao Gigaflop por apontar que nenhum argumento é necessário no splitmétodo.

Você pode salvar 3 bytes passando nenhum argumento para split(), pois ele se divide em qualquer grupo de espaços em branco.
Gigaflop 5/10

2

MATLAB, 57 bytes

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

No meu MATLAB R2016a todos os testes são aprovados, exceto que os emojis não são renderizados corretamente. Mas os caracteres são retornados corretamente


2

Japt -h , 8 bytes

Abordagem @Enigma

¸w ñ_¬xc

Experimente online!


Outra abordagem

Japonês -g , 8 bytes

¸ñ@-X¬xc

Experimente online!


Idêntico ao que eu estava prestes a postar. A necessidade da reversão me incomoda; teria preferido se pudéssemos emitir qualquer uma das palavras em caso de empate.
Shaggy

@Shaggy se isso fosse possível, eu tenho 6 bytes responder por isso
Luis Felipe de Jesus Munoz

Mesmo 6-byter eu comecei antes de identificar esse requisito nas especificações.
Shaggy

Eu sinto Muito! Originalmente, quando eu sandboxed o desafio achei que poderia saída qualquer uma das respostas, mas eu mudei depois de um pouco feedback por isso foi mais consistente
GammaGames

2

Java (JDK) , 117 97 84 bytes

-13 bytes obrigado @Nevay. Aparentemente, eu não sabia que também posso usar varem Java.

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

Experimente online!


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

1

Ruby, 45 caracteres

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

Exemplo de execução:

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

Experimente online!

Ruby 2.4, 40 caracteres

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

(Não testado.)


1

Pitão , 33 bytes

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Experimente online!

Certamente, existe uma maneira melhor de fazer isso, mas eu gastei muito com isso, então isso funcionará.

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

Eu teria passado uma redução para outro mapa em vez de usar o loop for, mas não consegui fazer isso funcionar.


Oh garoto, uma resposta em pyth! Obrigado pela explicação, boa entrada!
GammaGames 5/1018

1

Carvão , 20 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

≔⪪S θ

Divida a sequência de entrada em espaços e atribua a q.

≔EθΣEι℅λη

Calcule a soma dos ordinais dos caracteres em cada palavra e atribua a h.

§θ⌕η⌈η

Encontre o índice da soma mais alta e imprima a palavra nesse índice.


1

Powershell, 66 bytes

Direto. Veja a resposta do AdmBorkBork para encontrar um uso inteligente do Powershell.

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

Nota! Para corrigir o trabalho com unicode, salve seu arquivo de script UTF-16ou UTF8 with BOMcodificação.

Script de teste:

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

Resultado:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.