String Sum Tertinggi


15

String Sum Tertinggi

Diberikan string input, kembalikan kata dengan jumlah tertinggi dari setiap karakter unicode-nya.

Aturan

  • Input harus dipisahkan oleh spasi putih
  • Nilai setiap kata didasarkan pada jumlah setiap karakter dalam kode UTF-16 kata tersebut
  • Output harus kata pertama dengan nilai tertinggi (dalam hal jumlah duplikat)

Contohnya

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

Ini kode golf, jadi jawaban tersingkat menang! Semoga berhasil :)


Apakah akan selalu ada setidaknya satu spasi (setidaknya 2 kata)?
Emigna

2
Ini akan lebih menarik dengan ASCII daripada Unicode, karena lebih banyak bahasa dapat berpartisipasi. Membutuhkan dukungan Unicode tampaknya tidak menambah tantangan
Luis Mendo

1
Saya kebanyakan menggunakan Unicode karena memiliki emoji lol
GammaGames

2
Karena banyak jawaban saat ini tampaknya menggunakan jumlah unit kode UTF-8 atau UTF-32, Anda harus menambahkan beberapa kasus uji tambahan. Misalnya "α ää" menghasilkan hasil yang berbeda dengan UTF-8 (383 <718) dan UTF-16 (945> 456).
nwellnhof

1
Ya, area baris baru diizinkan. Tab juga!
GammaGames

Jawaban:


3

Jelly , 7 byte

ḲOS$ÐṀḢ

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

Jika spek santai untuk memasukkan diizinkan sebagai daftar kata-kata itu kemudianO§MḢị
Jonathan Allan

@ JonathanAllan Di mana OP mengatakan itu diizinkan?
dylnan

bukan hanya jika ...
Jonathan Allan

@ Jonathan Allan Ah, mengerti.
dylnan

1
@GammaGames Akan sangat membantu jika saya dapat mengambil daftar string, misalnya ["abc", "def"]. Tetapi pada titik ini ada banyak jawaban jadi saya tidak menyarankan menambahkan metode input baru
dylnan


6

R , 77 69 59 58 56 44 byte

Upaya kelompok sekarang.

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

Cobalah online!

Konversikan ke poin kode, jumlah setiap kata, negate, sortir, kembalikan elemen pertama.

Secara teknis nilai kembali adalah "vektor bernama" yang nilainya adalah jumlah dan nama adalah kata yang menang, tetapi ini tampaknya mengikuti aturan. Jika Anda ingin mengembalikan kata yang menang sebagai string, Anda harus menghabiskan 7 byte lebih dan membungkusnya di atas names().


Apakah ada alasan ada ruang di depan kata? Ketika saya menjalankannya "💀 👻 🤡 🦇 🕷️ 🍬 🎃"mencetak " 🕷️ "(dengan banyak ruang di depannya)
GammaGames

2
@GammaGames outputnya adalah apa yang disebut "vektor bernama" dalam R. Dalam hal ini nilainya adalah jumlah titik kode dari kata yang menang, dan namanya dicetak bersama dengan itu, yang dalam hal ini adalah kata yang menang diri. Nama disejajarkan dengan angka di bawahnya.
ngm

Oh rapi Sepertinya itu mengikuti aturan, jadi aku akan mengizinkannya. Entri keren!
GammaGames

sort(-sapply(...))lebih pendek 3 byte.
Giuseppe

3
@JayCe mapplymelakukan unlistsecara gratis.
ngm

5

05AB1E , 8 byte

ð¡RΣÇO}θ

Cobalah online!

Penjelasan

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

Wow, saya selalu kagum dengan jawaban yang dibuat dalam bahasa golf khusus!
GammaGames

Mengapa Anda perlu membalik daftar yang dihasilkan? Lagipula itu akan disortir kan? Atau apakah Rsebenarnya membalik daftar setelah diurutkan?
FireCubez

@FireCubez Untuk kasus uji àà as a testyang ààdan testmemiliki unicode yang sama jumlah terbesar. Jadi tanpa kebalikannya testakan menjadi output, bukan àà. Btw, Emigna, gunakan #untuk menyimpan byte. ;) EDIT: Sudahlah. Saya melihat itu tidak membungkus input dalam daftar untuk input kata tunggal .. Sangat disayangkan.
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

Cobalah online!


Itu jauh lebih baik daripada kode yang saya buat ketika saya menulis tantangan, saya punya ~ 200 karakter!
GammaGames


@ guest271314 tidak berfungsi untuk test case terakhir yang kedua dan beberapa case yang ekstrem sepertif("😂 龘龘龘龘龘")
Shieru Asakoto

@ShieruAsakoto Muncul untuk mengembalikan hasil yang benar di sini tio.run/##y0osSyxOLsosKNHNy09J/… ? Untuk apa hasil yang diharapkan "😂 龘龘龘龘龘"?
tamu271314

Oh nvm 隣(\uf9f1)lah yang ada di blok CJK Compatibility Ideograph, bukan lol. Kupikir itu 隣(\u96a3), yang ada di blok CJK Unified Ideograph.
Shieru Asakoto

4

jq, 61 43 57 37 karakter

( 57 39 53 33 karakter kode + 4 opsi opsi baris perintah)

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

Contoh dijalankan:

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

Cobalah online!


Memang. Merindukan kasus itu. ☹ Terima kasih, @nimi.
manatwork

4

Pyth, 8 byte

h.MsCMZc

Suite uji

Saya tahu sudah ada jawaban Pyth tapi saya merasa seperti ini menggunakan pendekatan yang sangat berbeda dan juga lebih pendek

Penjelasan:
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, itu sangat tepat! Terima kasih untuk penjelasannya!
GammaGames

4

PowerShell , 74 52 byte

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

Cobalah online!

Berkat mazzy untuk -22 byte kekalahan.

-splitS input $argspada spasi putih, pipa yang ke sortdengan mekanisme penyortiran tertentu {...}dan -ubendera unik.

Di sini kita mengambil kata saat ini $_, mengubahnya toCharArra y, lalu untuk setiap huruf kita menambahkannya ke kita$r esult . Itu mengubah string menjadi angka berdasarkan pada representasi UTF-16.

Untuk sekali ini, PowerShell memiliki semua string menjadi UTF-16 di latar belakang adalah penyelamat hidup!

Kami kemudian merangkum hasil-hasil itu (...)untuk mengubahnya menjadi sebuah array dan mengambil yang terakhir [-1], yaitu, hasil terbesar yang paling dekat dengan awal kalimat. Ini berfungsi karena -ubendera nique, yaitu, jika ada elemen kemudian yang memiliki nilai yang sama, itu dibuang. Kata itu ditinggalkan di jalur pipa dan hasilnya tersirat.


itu pintar. Terima kasih. 2 momen: mengapa tidak sort -usebaliknya? dapatkah cukup +untuk mengonversi angka? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy

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

@ Mazzy Ya, terima kasih!
AdmBorkBork

3

Python 3 , 55 52 byte

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

Cobalah online!

  • -3 byte terima kasih kepada Gigaflop untuk menunjukkan bahwa tidak ada argumen yang diperlukan dalam splitmetode ini.

Anda dapat menyimpan 3 byte dengan melewatkan tidak ada args ke split(), karena terbagi pada kelompok spasi putih.
Gigaflop

2

MATLAB, 57 byte

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

Dalam MATLAB R2016a saya semua tes dilewati, kecuali bahwa emoji tidak ditampilkan dengan benar. Tetapi karakter dikembalikan dengan benar


2

Japt -h , 8 byte

@ Pendekatan Enigma

¸w ñ_¬xc

Cobalah online!


Pendekatan Lain

Japt -g , 8 byte

¸ñ@-X¬xc

Cobalah online!


Identik dengan apa yang akan saya posting. Kebutuhan akan pembalikan mengganggu saya; lebih suka jika kita bisa menampilkan salah satu kata dalam kasus dasi.
Shaggy

@ Shaggy jika itu mungkin, saya punya jawaban 6 byte untuk itu
Luis felipe De jesus Munoz

6-byter yang sama saya mulai dengan sebelum melihat persyaratan dalam spec.
Shaggy

Maafkan saya! Awalnya ketika saya mengirim tantangan, saya pikir itu bisa menampilkan salah satu jawaban, tapi saya mengubahnya setelah sedikit umpan balik sehingga lebih konsisten
GammaGames

2

Java (JDK) , 117 97 84 byte

-13 byte terima kasih @Nay. Rupanya saya tidak tahu saya juga bisa menggunakan vardi Jawa.

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

Cobalah online!


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

1

Ruby, 45 karakter

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

Contoh dijalankan:

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

Cobalah online!

Ruby 2.4, 40 karakter

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

(Belum dicoba.)


1

Pyth , 33 byte

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Cobalah online!

Hampir pasti ada cara yang lebih baik untuk melakukan ini, tetapi saya menghabiskan terlalu banyak untuk itu sehingga ini bisa dilakukan.

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

Saya akan memberikan pengurangan ke peta lain alih-alih menggunakan for for loop, tapi saya tidak bisa membuatnya bekerja.


Oh boy, jawaban yang keras! Terima kasih atas penjelasannya, entri yang bagus!
GammaGames

1

Arang , 20 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⪪S θ

Pisahkan string input pada spasi dan tetapkan ke q.

≔EθΣEι℅λη

Hitung jumlah tata cara karakter di setiap kata dan tetapkan h.

§θ⌕η⌈η

Temukan indeks jumlah tertinggi dan cetak kata di indeks itu.


1

Powershell, 66 byte

Mudah. Lihat jawaban AdmBorkBork untuk menemukan penggunaan Powershell yang cerdas.

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

Catatan! Untuk memperbaiki pekerjaan dengan unicode, simpan file skrip Anda dengan UTF-16atau UTF8 with BOMpenyandian.

Skrip uji:

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

Keluaran:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.