Stringa somma suprema


15

Stringa somma suprema

Data una stringa di input, restituisce la parola con la somma più alta di ciascuno dei suoi caratteri unicode.

Regole

  • L'input deve essere separato da spazi bianchi
  • Il valore di ogni parola si basa sulla somma di ciascun carattere nel codice UTF-16 della parola
  • L'output dovrebbe essere la prima parola con il valore più alto (in caso di somme duplicate)

Esempi

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

Questo è il golf del codice, quindi vince la risposta più breve! In bocca al lupo :)


Ci sarà sempre almeno uno spazio (almeno 2 parole)?
Emigna,

2
Ciò sarebbe stato più interessante con ASCII anziché Unicode, perché avrebbero potuto partecipare più lingue. Richiedere il supporto Unicode non sembra aggiungere nulla alla sfida
Luis Mendo,

1
Ho usato principalmente Unicode perché ha emoji lol
GammaGames il

2
Poiché molte delle risposte attuali sembrano utilizzare la somma delle unità di codice UTF-8 o UTF-32, è necessario aggiungere alcuni casi di test aggiuntivi. Ad esempio "α ää" produce risultati diversi con UTF-8 (383 <718) e UTF-16 (945> 456).
nwellnhof,

1
Sì, l'area delle newline è consentita. Anche le schede!
GammaGames,

Risposte:


3

Gelatina , 7 byte

ḲOS$ÐṀḢ

Provalo 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 le specifiche sono rilassate per consentire l'accesso come elenco di parole, alloraO§MḢị
Jonathan Allan,

@JonathanAllan Dove ha detto OP che è stato permesso?
dylnan,

non solo se ...
Jonathan Allan,

@JonathanAllan Ah, gotcha.
dylnan,

1
@GammaGames Sarebbe utile se potessi prendere un elenco di stringhe, ad es ["abc", "def"]. Ma a questo punto ci sono molte risposte, quindi non consiglio di aggiungere nuovi metodi di input
dylnan,


6

R , 77 69 59 58 56 44 byte

Uno sforzo di gruppo ora.

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

Provalo online!

Converti in punti di codice, somma ogni parola, nega, (stabilmente) ordina, restituisce il primo elemento.

Tecnicamente il valore di ritorno è un "vettore chiamato" il cui valore è la somma e il nome è la parola vincente, ma questo sembra seguire le regole. Se vuoi restituire la parola vincente come stringa, dovresti spendere altri 7 byte e racchiudere quanto sopra names().


C'è una ragione per cui ci sono spazi davanti alla parola? Quando lo "💀 👻 🤡 🦇 🕷️ 🍬 🎃"" 🕷️ "
eseguo

2
@GammaGames l'output è quello che viene chiamato un "vettore chiamato" in R. In questo caso il valore è la somma dei punti di codice della parola vincente e il nome viene stampato insieme ad esso, che in questo caso è la parola vincente si. Il nome è allineato a destra al numero sotto di esso.
ngm,

Oh, pulito! Sembra che segua le regole, quindi lo permetterò. Entrata interessante!
GammaGames,

sort(-sapply(...))è più corto di 3 byte.
Giuseppe,

3
@JayCe mapplyfa unlistgratuitamente.
ngm

5

05AB1E , 8 byte

ð¡RΣÇO}θ

Provalo online!

Spiegazione

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

Wow, sono sempre stupito dalle risposte fatte in linguaggi dedicati al golf!
GammaGames,

Perché è necessario invertire l'elenco risultante? Verrà comunque ordinato, vero? O Reffettivamente inverte l'elenco dopo che è stato ordinato?
FireCubez,

@FireCubez Per banco di prova àà as a testdella ààe testhanno la stessa somma più grande unicode. Quindi senza il contrario testverrebbe emesso invece di àà. A proposito, Emigna, usa #per salvare un byte. ;) EDIT: non importa. Vedo che non avvolge l'input in un elenco per input di una sola parola. È un peccato.
Kevin Cruijssen,

4

JavaScript (ES6), 81 byte

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

Provalo online!


È molto meglio del codice che mi è venuto in mente quando stavo scrivendo la sfida, la mia era lunga ~ 200 caratteri!
GammaGames,


@ guest271314 non funziona per il secondo ultimo test case e alcuni casi estremi comef("😂 龘龘龘龘龘")
Shieru Asakoto,

@ShieruAsakoto Sembra restituire il risultato corretto qui tio.run/##y0osSyxOLsosKNHNy09J/… ? A cosa serve il risultato "😂 龘龘龘龘龘"?
ospite271314

Oh nvm 隣(\uf9f1)era quello nel blocco Ideograph di compatibilità CJK invece lol. Pensavo fosse隣(\u96a3) , quello nel blocco dell'ideografo unificato CJK.
Shieru Asakoto,

4

jq, 61 43 57 37 caratteri

( 57 39 53 33 caratteri codice + 4 caratteri opzioni della riga di comando)

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

Esecuzione di esempio:

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

Provalo online!


Infatti. Perso quel caso. ☹ Grazie, @nimi.
arte

4

Pyth, 8 byte

h.MsCMZc

Suite di test

So che c'è già una risposta Pyth, ma penso che questo usi un approccio piuttosto diverso ed è anche più breve

Spiegazione:
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

Caspita, è davvero preciso! Grazie per la spiegazione!
GammaGames

4

PowerShell , 74 52 byte

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

Provalo online!

Grazie a mazzy per un enorme -22 byte.

-splits l'input $argssu spazi bianchi, i tubi in sortcon un particolare meccanismo di ordinamento{...} e la -ubandiera di nicchia.

Qui stiamo prendendo la parola corrente $_, cambiandola toCharArra y, quindi per ogni lettera la stiamo aggiungendo alla nostra$r esult. Ciò trasforma la stringa in un numero in base alla sua rappresentazione UTF-16.

Per una volta, PowerShell con tutte le stringhe in UTF-16 in background è un salvavita!

Quindi incapsuliamo questi risultati (...)per trasformarli in un array e prendere l'ultimo [-1], ovvero il risultato più grande che è il più vicino all'inizio della frase. Funziona a causa della -ubandiera di nicchia, cioè se c'è un elemento successivo che ha lo stesso valore, viene scartato. Quella parola è rimasta sulla pipeline e l'output è implicito.


è intelligente. Grazie. 2 momenti: perché non sort -uinvece un contrario? può essere abbastanza+ per convertire il numero? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy

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

@mazzy Sì, grazie!
AdmBorkBork,

3

Python 3 , 55 52 byte

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

Provalo online!

  • -3 byte grazie a Gigaflop per aver sottolineato che non è necessario alcun argomento nel splitmetodo.

È possibile salvare 3 byte passando nessun argomento split(), poiché si divide su qualsiasi gruppo di spazi bianchi.
Gigaflop,

2

MATLAB, 57 byte

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

Nel mio MATLAB R2016a tutti i test vengono superati, tranne per il fatto che gli emoji non vengono riprodotti correttamente. Ma i personaggi vengono restituiti correttamente


2

Japt -h , 8 byte

Approccio @Enigma

¸w ñ_¬xc

Provalo online!


Un altro approccio

Japt -g , 8 byte

¸ñ@-X¬xc

Provalo online!


Identico a quello che stavo per pubblicare. La necessità dell'inversione mi dà fastidio; avrei preferito se potessimo scrivere una qualsiasi delle parole in caso di pareggio.
Shaggy,

@Smani se fosse possibile, ho una risposta di 6 byte per questo
Luis felipe De jesus Munoz,

Lo stesso 6 byte con cui ho iniziato prima di individuare tale requisito nelle specifiche.
Shaggy,

Mi dispiace! Inizialmente, quando ho risolto il problema con la sandbox, ho pensato che potesse produrre una qualsiasi delle risposte, ma l'ho cambiata dopo un po 'di feedback, quindi era più coerente
GammaGames,

2

Java (JDK) , 117 97 84 byte

-13 byte grazie @Nevay. Apparentemente non sapevo di poter usare anche varin Java.

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

Provalo online!


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

1

Rubino, 45 caratteri

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

Esecuzione di esempio:

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

Provalo online!

Ruby 2.4, 40 caratteri

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

(Non testato.)


1

Pyth , 33 byte

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Provalo online!

C'è quasi sicuramente un modo migliore per farlo, ma ho speso troppo per farlo, quindi lo farà.

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

Avrei passato una riduzione in un'altra mappa invece di usare il ciclo for, ma non riuscivo a farlo funzionare.


Oh ragazzo, una risposta Pyth! Grazie per la spiegazione, bella voce!
GammaGames,

1

Carbone , 20 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔⪪S θ

Dividere la stringa di input su spazi e assegnare a q.

≔EθΣEι℅λη

Calcola la somma degli ordinali dei caratteri in ogni parola e assegna a h.

§θ⌕η⌈η

Trova l'indice della somma più alta e stampa la parola in quell'indice.


1

Powershell, 66 byte

Semplice. Vedi la risposta di AdmBorkBork per trovare un uso intelligente di Powershell.

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

Nota! Per correggere il lavoro con Unicode, salvare il file di script con UTF-16oUTF8 with BOM codifica.

Script di prova:

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

Produzione:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.