Chuỗi Sum tối cao


15

Chuỗi Sum tối cao

Đưa ra một chuỗi đầu vào, trả về từ có tổng cao nhất của mỗi ký tự unicode của nó.

Quy tắc

  • Đầu vào phải được ngăn cách bởi khoảng trắng
  • Giá trị của mỗi từ dựa trên tổng của từng ký tự trong mã UTF-16 của từ đó
  • Đầu ra phải là từ đầu tiên có giá trị cao nhất (trong trường hợp tổng tiền trùng lặp)

Ví dụ

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

Đây là mã golf, vì vậy câu trả lời ngắn nhất sẽ thắng! Chúc may mắn :)


Sẽ luôn có ít nhất một khoảng trắng (ít nhất 2 từ)?
Emigna

2
Điều này sẽ thú vị hơn với ASCII thay vì Unicode, vì nhiều ngôn ngữ có thể đã tham gia. Yêu cầu hỗ trợ Unicode dường như không thêm bất cứ điều gì vào thử thách
Luis Mendo

1
Tôi chủ yếu sử dụng Unicode vì nó có biểu tượng cảm xúc lol
GammaGames

2
Vì nhiều câu trả lời hiện tại dường như sử dụng tổng số đơn vị mã UTF-8 hoặc UTF-32, bạn nên thêm một số trường hợp kiểm tra bổ sung. Ví dụ: "α ää" mang lại kết quả khác nhau với UTF-8 (383 <718) và UTF-16 (945> 456).
nwellnhof

1
Vâng, khu vực mới cho phép. Tab cũng vậy!
GammaGames

Câu trả lời:


3

Thạch , 7 byte

ḲOS$ÐṀḢ

Hãy thử trực tuyến!

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

Nếu thông số kỹ thuật được nới lỏng để đầu vào được cho phép dưới dạng danh sách các từ thìO§MḢị
Jonathan Allan

@Jonathan ALLan OP đã nói điều đó được cho phép ở đâu?
dyl Nam

không chỉ nếu ...
Jonathan Allan

@Jonathan ALLan Ah, gotcha.
dyl Nam

1
@GammaGames Nó sẽ giúp nếu tôi có thể lấy một danh sách các chuỗi, ví dụ ["abc", "def"]. Nhưng tại thời điểm này, có rất nhiều câu trả lời vì vậy tôi không khuyên bạn nên thêm phương thức nhập liệu mới
dylnan


6

R , 77 69 59 58 56 44 byte

Một nỗ lực nhóm bây giờ.

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

Hãy thử trực tuyến!

Chuyển đổi thành điểm mã, tổng hợp từng từ, phủ định, sắp xếp (ổn định), trả về phần tử đầu tiên.

Về mặt kỹ thuật, giá trị trả về là một "vectơ có tên" có giá trị là tổng và tên là từ chiến thắng, nhưng điều này dường như tuân theo các quy tắc. Nếu bạn muốn trả về từ chiến thắng dưới dạng chuỗi, bạn phải chi thêm 7 byte và gói phần trên vào trong names().


Có một lý do có khoảng trống ở phía trước của từ? Khi tôi chạy nó, nó "💀 👻 🤡 🦇 🕷️ 🍬 🎃"sẽ in ra " 🕷️ "(với một khoảng trống ở phía trước nó)
GammaGames

2
@GammaGames đầu ra là cái được gọi là "vectơ có tên" trong R. Trong trường hợp này, giá trị là tổng số điểm mã của từ chiến thắng và tên được in cùng với nó, trong trường hợp này là từ chiến thắng chinh no. Tên được căn phải với số bên dưới nó.
ngm

Ôi, gọn gàng! Có vẻ như nó tuân theo các quy tắc, vì vậy tôi sẽ cho phép nó. Nhập cảnh mát mẻ!
GammaGames

sort(-sapply(...))ngắn hơn 3 byte.
Giuseppe

3
@JayCe mapplylàm unlistmiễn phí.
ngm

5

05AB1E , 8 byte

ð¡RΣÇO}θ

Hãy thử trực tuyến!

Giải trình

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

Ồ, tôi luôn ngạc nhiên bởi những câu trả lời được thực hiện bằng các ngôn ngữ chơi gôn chuyên dụng!
GammaGames

Tại sao bạn cần đảo ngược danh sách kết quả? Nó sẽ được sắp xếp mọi cách phải không? Hoặc Rthực sự đảo ngược danh sách sau khi nó được sắp xếp?
FireCubez

@FireCubez Đối với trường hợp kiểm tra àà as a testcác ààtestcó cùng tổng unicode lớn nhất. Vì vậy, không có đảo ngược testsẽ là đầu ra thay vì àà. Btw, Emigna, sử dụng #để lưu một byte. ;) EDIT: Đừng bận tâm. Tôi thấy nó không bao gồm đầu vào trong một danh sách cho các đầu vào từ đơn .. Thật không may.
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

Hãy thử trực tuyến!


Đó là cách tốt hơn so với mã tôi đã đưa ra khi tôi viết thử thách, của tôi dài ~ 200 ký tự!
GammaGames


@ guest271314 không hoạt động cho trường hợp thử nghiệm cuối cùng thứ hai và một số trường hợp cực đoan nhưf("😂 龘龘龘龘龘")
Shieru Asakoto

@ShieruAsakoto Xuất hiện để trả về kết quả chính xác tại đây tio.run/##y0osSyxOLsosKNHNy09J/ Lỗi ? Kết quả mong đợi là "😂 龘龘龘龘龘"gì?
khách271314

Oh nvm 隣(\uf9f1)là người trong khối Ideograph Tương thích của CJK thay vì lol. Nghĩ rằng đó là 隣(\u96a3), một trong khối Ideograph thống nhất của CJK.
Shieru Asakoto

4

jq, 61 43 57 37 ký tự

( 57 39 53 33 ký tự mã + 4 ký tự tùy chọn dòng lệnh)

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

Chạy mẫu:

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

Hãy thử trực tuyến!


Thật. Bỏ lỡ trường hợp đó. ☹ Cảm ơn, @nimi.
manatwork

4

Bình thường, 8 byte

h.MsCMZc

Bộ kiểm tra

Tôi biết đã có câu trả lời Pyth nhưng tôi cảm thấy như cách này sử dụng một cách tiếp cận khá khác biệt và nó cũng ngắn hơn

Giải trình:
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, điều đó thực sự chính xác! Cảm ơn đã giải thích!
GammaGames

4

PowerShell , 74 52 byte

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

Hãy thử trực tuyến!

Cảm ơn mazzy cho một con số khổng lồ -22 byte.

-splits đầu vào $argstrên khoảng trắng, đường ống vào sortvới một cơ chế sắp xếp cụ thể {...}-ucờ nique.

Ở đây chúng tôi đang dùng từ hiện tại $_, thay đổi nó toCharArray , sau đó với mỗi chữ cái chúng tôi sẽ thêm từ đó vào$r esult . Điều đó biến chuỗi thành một số dựa trên đại diện UTF-16 của nó.

Lần đầu tiên, PowerShell có tất cả các chuỗi là UTF-16 trong nền là một trình cứu sinh!

Sau đó, chúng tôi gói gọn các kết quả đó (...)để biến chúng thành một mảng và lấy kết quả cuối cùng [-1], nghĩa là kết quả lớn nhất gần nhất với điểm bắt đầu của câu. Điều này hoạt động vì -ucờ nique, nghĩa là, nếu có một phần tử sau này có cùng giá trị, nó sẽ bị loại bỏ. Từ đó được để lại trên đường ống và đầu ra là ẩn.


thật thông minh Cảm ơn. 2 khoảnh khắc: tại sao không sort -uthay vì ngược lại? Có thể đủ +để chuyển đổi trong số? (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mê mẩn

chơi gôn nhiều hơn: (-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]:)
mazzy

@mazzy Vâng, cảm ơn!
admBorkBork

3

Python 3 , 55 52 byte

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

Hãy thử trực tuyến!

  • -3 byte nhờ Gigaflop đã chỉ ra rằng không cần đối số trong splitphương thức.

Bạn có thể lưu 3 byte bằng cách chuyển không có đối số split(), vì nó phân tách trên bất kỳ nhóm khoảng trắng nào.
Gigaflop

2

MATLAB, 57 byte

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

Trong MATLAB R2016a của tôi, tất cả các bài kiểm tra đều được vượt qua, ngoại trừ biểu tượng cảm xúc không được hiển thị đúng. Nhưng các ký tự được trả lại chính xác


2

Japt -h , 8 byte

Cách tiếp cận @Enigma

¸w ñ_¬xc

Hãy thử trực tuyến!


Cách tiếp cận khác

Japt -g , 8 byte

¸ñ@-X¬xc

Hãy thử trực tuyến!


Đồng nhất với những gì tôi sắp đăng. Sự cần thiết cho sự đảo ngược làm phiền tôi; sẽ thích hơn nếu chúng ta có thể xuất ra bất kỳ từ nào trong trường hợp hòa.
Xù xì

@Shaggy nếu điều đó là có thể, tôi có câu trả lời 6 byte cho nó
Luis felipe De jesus Munoz

Tương tự 6 -ter tôi đã bắt đầu với trước khi phát hiện ra yêu cầu đó trong thông số kỹ thuật.
Xù xì

Tôi xin lỗi! Ban đầu khi tôi tham gia thử thách, tôi nghĩ rằng nó có thể đưa ra bất kỳ câu trả lời nào, nhưng tôi đã thay đổi nó sau một chút phản hồi để nó phù hợp hơn
GammaGames

2

Java (JDK) , 117 97 84 byte

-13 byte cảm ơn @Nevay. Rõ ràng tôi không biết tôi cũng có thể sử dụng vartrong Java.

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

Hãy thử trực tuyến!


-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 ký tự

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

Chạy mẫu:

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

Hãy thử trực tuyến!

Ruby 2.4, 40 ký tự

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

(Chưa được kiểm tra.)


1

Bình thường , 33 byte

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

Hãy thử trực tuyến!

Gần như chắc chắn có một cách tốt hơn để làm điều này, nhưng tôi đã dành quá nhiều cho nó để điều này sẽ làm.

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

Tôi đã chuyển qua một bản đồ khác thay vì sử dụng vòng lặp for, nhưng tôi không thể làm cho nó hoạt động được.


Oh boy, một câu trả lời pyth! Cảm ơn đã giải thích, mục tốt đẹp!
GammaGames

1

Than , 20 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔⪪S θ

Tách chuỗi đầu vào trên khoảng trắng và gán cho q.

≔EθΣEι℅λη

Tính tổng các thứ tự của các ký tự trong mỗi từ và gán cho h.

§θ⌕η⌈η

Tìm chỉ số của tổng cao nhất và in từ tại chỉ mục đó.


1

Powershell, 66 byte

Nói thẳng ra. Xem câu trả lời của admBorkBork để tìm ra cách sử dụng Powershell thông minh.

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

Ghi chú! Để sửa công việc với unicode, hãy lưu tệp script của bạn bằng UTF-16hoặc UTF8 with BOMmã hóa.

Kịch bản thử nghiệm:

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

Đầu ra:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.