Cadena de suma suprema


15

Cadena de suma suprema

Dada una cadena de entrada, devuelve la palabra con la suma más alta de cada uno de sus caracteres unicode.

Reglas

  • La entrada debe estar separada por espacios en blanco
  • El valor de cada palabra se basa en la suma de cada carácter en el código UTF-16 de la palabra.
  • La salida debe ser la primera palabra con el valor más alto (en caso de sumas duplicadas)

Ejemplos

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

Este es el código de golf, por lo que gana la respuesta más corta. Buena suerte :)


¿Habrá siempre al menos un espacio (al menos 2 palabras)?
Emigna

2
Esto habría sido más interesante con ASCII en lugar de Unicode, porque podrían haber participado más idiomas. Requerir soporte Unicode no parece agregar nada al desafío
Luis Mendo

1
Usé

2
Dado que muchas de las respuestas actuales parecen usar la suma de unidades de código UTF-8 o UTF-32, debe agregar algunos casos de prueba adicionales. Por ejemplo, "α ää" produce resultados diferentes con UTF-8 (383 <718) y UTF-16 (945> 456).
nwellnhof

1
Sí, el área de nuevas líneas está permitida. Pestañas también!
GammaGames

Respuestas:


3

Jalea , 7 bytes

ḲOS$ÐṀḢ

Pruébalo en línea!

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

Si la especificación se relaja para que la entrada se permita como una lista de palabras, entoncesO§MḢị
Jonathan Allan el

@JonathanAllan ¿Dónde OP dijo que estaba permitido?
dylnan

no solo si ...
Jonathan Allan

@ JonathanAllan Ah, te tengo.
dylnan

1
@GammaGames Me ayudaría si pudiera tomar una lista de cadenas, por ejemplo ["abc", "def"]. Pero en este punto hay muchas respuestas, así que no recomiendo agregar nuevos métodos de entrada
dylnan


6

R , 77 69 59 58 56 44 bytes

Un esfuerzo grupal ahora.

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

Pruébalo en línea!

Convierte en puntos de código, suma cada palabra, niega, ordena (establemente), devuelve el primer elemento.

Técnicamente, el valor de retorno es un "vector nombrado" cuyo valor es la suma y el nombre es la palabra ganadora, pero esto parece seguir las reglas. Si desea devolver la palabra ganadora como una cadena, tendría que gastar 7 bytes más y envolver lo anterior names().


¿Hay alguna razón por la que haya espacios delante de la palabra? Cuando lo ejecuto se "💀 👻 🤡 🦇 🕷️ 🍬 🎃"imprime " 🕷️ "(con un montón de espacios delante)
GammaGames

2
@GammaGames la salida es lo que se llama un "vector nombrado" en R. En este caso, el valor es la suma de los puntos de código de la palabra ganadora, y el nombre se imprime junto con ella, que en este caso es la palabra ganadora sí mismo. El nombre está alineado a la derecha con el número debajo de él.
ngm

Oh, ordenado! Parece que sigue las reglas, así que lo permitiré. Entrada genial!
GammaGames

sort(-sapply(...))es más corto por 3 bytes.
Giuseppe

3
@ JayCe mapplyhace el unlistgratis.
ngm

5

05AB1E , 8 bytes

ð¡RΣÇO}θ

Pruébalo en línea!

Explicación

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

¡Guau, siempre estoy sorprendido por las respuestas hechas en idiomas dedicados al golf!
GammaGames

¿Por qué necesitas revertir la lista resultante? Se va a solucionar de todos modos, ¿verdad? ¿O en Rrealidad invierte la lista después de que se ordena?
FireCubez

Para @FireCubez caso de prueba àà as a testel àày testtener la misma suma más grande Unicode. Entonces, sin el reverso se testgeneraría en lugar de àà. Por cierto, Emigna, usa #para guardar un byte. ;) EDITAR: No importa. Veo que no incluye la entrada en una lista de entradas de una sola palabra. Eso es lamentable.
Kevin Cruijssen

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

Pruébalo en línea!


Eso es mucho mejor que el código que se me ocurrió cuando estaba escribiendo el desafío, ¡el mío tenía ~ 200 caracteres de largo!
GammaGames


@ guest271314 no funciona para el segundo último caso de prueba y algunos casos extremos comof("😂 龘龘龘龘龘")
Shieru Asakoto el

@ShieruAsakoto parece devolver el resultado correcto aquí tio.run/##y0osSyxOLsosKNHNy09J/… ? ¿Para qué se espera el resultado "😂 龘龘龘龘龘"?
invitado271314

Oh nvm 隣(\uf9f1)fue el del bloque Ideógrafo de compatibilidad CJK en su lugar jajaja. Pensé que era 隣(\u96a3), el que está en el bloque Ideógrafo Unificado CJK.
Shieru Asakoto

4

jq, 61 43 57 37 caracteres

( 57 39 53 código de 33 caracteres + opciones de línea de comando de 4 caracteres)

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

Ejecución de muestra:

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

Pruébalo en línea!


En efecto. Perdí ese caso. ☹ Gracias, @nimi.
manatwork

4

Pyth, 8 bytes

h.MsCMZc

Banco de pruebas

Sé que ya hay una respuesta de Pyth, pero siento que esto usa un enfoque bastante diferente y también es muuuucho más corto

Explicación:
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, eso es realmente preciso! ¡Gracias por la explicación!
GammaGames

4

PowerShell , 74 52 bytes

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

Pruébalo en línea!

Gracias a mazzy por la friolera de -22 bytes.

-splits la entrada $argsen espacios en blanco, canaliza eso sortcon un mecanismo de clasificación particular {...}y la -ubandera de nique.

Aquí estamos tomando la palabra actual $_, cambiándola toCharArra y, luego para cada letra la estamos agregando a nuestro $result. Eso convierte la cadena en un número basado en su representación UTF-16.

Por una vez, ¡PowerShell con todas las cadenas en UTF-16 en segundo plano es un salvavidas!

Luego encapsulamos esos resultados (...)para transformarlos en una matriz y tomar el último [-1], es decir, el resultado más grande que es el más cercano al comienzo de la oración. Esto funciona debido a la -ubandera de nique, es decir, si hay un elemento posterior que tiene el mismo valor, se descarta. Esa palabra se deja en la tubería y la salida es implícita.


Es inteligente. Gracias. 2 momentos: ¿por qué no sort -uun reverso? puede ser suficiente +para convertir en el número? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy

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

@mazzy Sí, gracias!
AdmBorkBork

3

Python 3 , 55 52 bytes

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

Pruébalo en línea!

  • -3 bytes gracias a Gigaflop por señalar que no se necesita ningún argumento en el splitmétodo.

Puede guardar 3 bytes sin pasar argumentos a split(), ya que se divide en cualquier grupo de espacios en blanco.
Gigaflop

2

MATLAB, 57 bytes

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

En mi MATLAB R2016a se pasan todas las pruebas, excepto que los emojis no se representan correctamente. Pero los caracteres se devuelven correctamente


2

Japt -h , 8 bytes

Enfoque @Enigma

¸w ñ_¬xc

Pruébalo en línea!


Otro enfoque

Japt -g , 8 bytes

¸ñ@-X¬xc

Pruébalo en línea!


Idéntico a lo que estaba a punto de publicar. La necesidad de la inversión me molesta; Hubiera preferido si pudiéramos mostrar cualquiera de las palabras en caso de empate.
Shaggy

@Shaggy si eso fuera posible, tengo una respuesta de 6 bytes para ello
Luis felipe De jesus Munoz

El mismo 6-byter con el que comencé antes de detectar ese requisito en la especificación.
Shaggy

¡Lo siento! Originalmente, cuando el desafío de espacio aislado que pensé que podría generar alguna de las respuestas, pero lo cambió después de un poco de retroalimentación por lo que era más consistente
GammaGames

2

Java (JDK) , 117 97 84 bytes

-13 bytes gracias @Nevay. Aparentemente no sabía que también puedo usar varen Java.

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

Pruébalo en línea!


-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:+}}

Ejecución de muestra:

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

Pruébalo en línea!

Ruby 2.4, 40 caracteres

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

(No probado)


1

Pyth , 33 bytes

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Pruébalo en línea!

Es casi seguro que hay una mejor manera de hacer esto, pero gasté demasiado en eso, así que esto 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

Hubiera pasado una reducción a otro mapa en lugar de usar el bucle for, pero no pude hacer que eso funcionara.


Oh chico, una respuesta pyth! Gracias por la explicación, buena entrada!
GammaGames

1

Carbón de leña , 20 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔⪪S θ

Dividir la cadena de entrada en espacios y asignar a q.

≔EθΣEι℅λη

Calcular la suma de los ordinales de los caracteres en cada palabra y asignar a h.

§θ⌕η⌈η

Encuentre el índice de la suma más alta e imprima la palabra en ese índice.


1

Powershell, 66 bytes

Sencillo. Vea la respuesta de AdmBorkBork para encontrar un uso inteligente de Powershell.

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

¡Nota! Para corregir el trabajo con Unicode, guarde su archivo de script con UTF-16o UTF8 with BOMcodificación.

Script de prueba:

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

Salida:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.