สตริงผลรวมสูงสุด


15

สตริงผลรวมสูงสุด

รับสตริงอินพุตคืนคำด้วยผลรวมสูงสุดของอักขระยูนิโค้ดแต่ละตัว

กฎระเบียบ

  • อินพุตควรถูกคั่นด้วยช่องว่าง
  • ค่าของแต่ละคำขึ้นอยู่กับผลรวมของตัวละครแต่ละตัวในรหัส UTF-16 ของคำ
  • ผลลัพธ์ควรเป็นคำแรกที่มีค่าสูงสุด (ในกรณีที่เป็นผลรวมซ้ำ)

ตัวอย่าง

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

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดชนะ! โชคดี :)


จะมีอย่างน้อยหนึ่งช่องว่าง (อย่างน้อย 2 คำ) หรือไม่
Emigna

2
สิ่งนี้น่าสนใจยิ่งขึ้นกับ ASCII แทนที่จะเป็น Unicode เนื่องจากมีภาษาอื่น ๆ เข้าร่วมมากขึ้น การสนับสนุน Unicode ที่ต้องการดูเหมือนจะไม่เพิ่มอะไรเลยกับความท้าทาย
หลุยส์เมนโด

1
ฉันใช้ Unicode เป็นส่วนใหญ่เพราะมันมี emojis lol
GammaGames

2
เนื่องจากคำตอบปัจจุบันจำนวนมากดูเหมือนจะใช้ผลรวมของหน่วยรหัส UTF-8 หรือ UTF-32 คุณควรเพิ่มกรณีทดสอบเพิ่มเติม ตัวอย่างเช่น "αää" ให้ผลลัพธ์ที่แตกต่างด้วย UTF-8 (383 <718) และ UTF-16 (945> 456)
nwellnhof

1
ใช่อนุญาตให้ขึ้นบรรทัดใหม่ได้ แท็บด้วย!
GammaGames

คำตอบ:


3

เยลลี่ขนาด 7 ไบต์

ḲOS$ÐṀḢ

ลองออนไลน์!

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

หากสเป็คผ่อนคลายกับการป้อนข้อมูลที่ได้รับอนุญาตเป็นรายการของคำO§MḢị
Jonathan Allan

@JonathanAllan OP พูดว่าอนุญาตแล้วที่ไหน
dylnan

ไม่เพียง แต่ถ้า ...
Jonathan Allan

@JanathanAllan Ah, gotcha
dylnan

1
@GammaGames มันจะช่วยถ้าฉันอาจจะใช้รายการของสตริง, ["abc", "def"]เช่น แต่ ณ จุดนี้มีคำตอบมากมายดังนั้นฉันไม่แนะนำให้เพิ่มวิธีการใหม่ในการป้อนข้อมูล
dylnan


6

R , 77 69 59 58 56 44 ไบต์

ความพยายามของกลุ่มในขณะนี้

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

ลองออนไลน์!

แปลงเป็นรหัสจุดรวมคำแต่ละคำคัดค้านเรียงลำดับ (เสถียร) ส่งคืนองค์ประกอบแรก

ในทางเทคนิคค่าส่งคืนคือ "เวกเตอร์ที่ระบุชื่อ" ซึ่งมีค่าเป็นผลรวมและชื่อเป็นคำที่ชนะ หากคุณต้องการที่จะกลับคำชนะเป็นสตริงคุณจะมีการใช้จ่ายมากขึ้น 7 names()ไบต์และห่อในข้างต้น


มีเหตุผลที่มีช่องว่างด้านหน้าคำหรือไม่ เมื่อฉันเรียกใช้มัน"💀 👻 🤡 🦇 🕷️ 🍬 🎃"จะพิมพ์ออกมา" 🕷️ "(มีช่องว่างด้านหน้า)
GammaGames

2
@GammaGames ผลลัพธ์คือสิ่งที่เรียกว่า "ชื่อเวกเตอร์" ในอาร์ในกรณีนี้ค่าคือผลรวมของรหัสคะแนนของคำที่ชนะและชื่อจะถูกพิมพ์ไปพร้อมกับมันซึ่งในกรณีนี้คือคำที่ชนะ ตัวเอง ชื่อจะจัดชิดขวากับหมายเลขด้านล่าง
ngm

โอ้เรียบร้อย! ดูเหมือนว่าจะเป็นไปตามกฎดังนั้นฉันจะอนุญาต รายการที่ยอดเยี่ยม!
GammaGames

sort(-sapply(...))สั้นลง 3 ไบต์
Giuseppe

3
@JayCe mapplyทำunlistฟรี
ngm

5

05AB1E , 8 ไบต์

ð¡RΣÇO}θ

ลองออนไลน์!

คำอธิบาย

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

ว้าวฉันประหลาดใจเสมอกับคำตอบในภาษากอล์ฟโดยเฉพาะ!
GammaGames

ทำไมคุณต้องย้อนกลับรายการผลลัพธ์ มันจะถูกจัดเรียงอย่างไรต่อไปใช่มั้ย หรือRย้อนกลับรายการจริงหรือไม่หลังจากที่เรียงลำดับ?
FireCubez

@FireCubez สำหรับกรณีทดสอบและมีเดียวกันผลรวม Unicode ที่ใหญ่ที่สุด โดยไม่ต้องย้อนกลับจะถูกส่งออกแทน Btw, Emigna ใช้เพื่อบันทึกไบต์ ;) แก้ไข: ไม่เป็นไร ฉันเห็นว่ามันไม่ได้รวมอินพุตไว้ในรายการสำหรับอินพุตคำเดียว .. โชคไม่ดี àà as a testààtesttestàà#
Kevin Cruijssen

4

JavaScript (ES6), 81 ไบต์

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

ลองออนไลน์!


นั่นเป็นวิธีที่ดีกว่ารหัสที่ฉันคิดขึ้นมาตอนที่ฉันเขียนความท้าทายฉันมีความยาวประมาณ 200 ตัวอักษร!
GammaGames


@ guest271314 ไม่ทำงานสำหรับกรณีทดสอบครั้งที่สองและบางกรณีที่รุนแรงเช่นf("😂 龘龘龘龘龘")
Shieru Asakoto

@ShieruAsakoto ดูเหมือนจะส่งคืนผลลัพธ์ที่ถูกต้องที่นี่tio.run/##y0osSyxOLsosKNHNy09J/ …? ผลลัพธ์ที่คาดหวังคือ"😂 龘龘龘龘龘"อะไร
guest271314

โอ้ nvm 隣(\uf9f1)เป็นหนึ่งใน CJK Compatibility Ideograph block แทน lol คิดว่าเป็น隣(\u96a3)สิ่งหนึ่งในบล็อก CJI Unified Ideograph
Shieru Asakoto

4

jq, 61 43 57 37 ตัวอักษร

( 57 39 53 33 ตัวอักษรรหัส + ตัวเลือกบรรทัดคำสั่ง 4 ตัว)

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

วิ่งตัวอย่าง:

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

ลองออนไลน์!


จริง พลาดกรณีนั้นไป ☹ขอบคุณ @nimi
จัดการ

4

Pyth, 8 ไบต์

h.MsCMZc

ชุดทดสอบ

ฉันรู้ว่ามีคำตอบของ Pyth อยู่แล้ว แต่ฉันรู้สึกว่านี่ใช้แนวทางที่แตกต่างกันไปและมันก็สั้นกว่าด้วย

คำอธิบาย:
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

ว้าวนั่นแม่นยำจริงๆ! ขอบคุณสำหรับคำอธิบาย!
GammaGames

4

PowerShell , 74 52 ไบต์

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

ลองออนไลน์!

ขอบคุณ mazzy สำหรับ whopping -22 bytes

-splitการป้อนข้อมูล$argsบนช่องว่างท่อที่sortมีกลไกการเรียงลำดับเฉพาะ{...}และ-uแฟล็ก nique

ที่นี่เรากำลังใช้คำปัจจุบัน$_เปลี่ยนเป็นtoCharArra yจากนั้นสำหรับจดหมายแต่ละฉบับที่เราเพิ่มเข้าไปใน$result ของเรา ที่เปลี่ยนสตริงเป็นตัวเลขตามการแสดง UTF-16

ครั้งหนึ่ง PowerShell ที่มีสตริงทั้งหมดเป็น UTF-16 ในพื้นหลังเป็นเครื่องมือช่วยชีวิต!

จากนั้นเราจะสรุปผลลัพธ์เหล่านั้น(...)เพื่อแปลงให้เป็นอาร์เรย์และนำผลลัพธ์สุดท้าย[-1]มากล่าวคือผลลัพธ์ที่ใหญ่ที่สุดซึ่งใกล้เคียงกับจุดเริ่มต้นของประโยคมากที่สุด สิ่งนี้ใช้งานได้เนื่องจาก-uแฟล็ก nique กล่าวคือหากมีองค์ประกอบในภายหลังที่มีค่าเท่ากันก็จะถูกลบทิ้ง คำนั้นถูกทิ้งไว้บนไพพ์ไลน์และเอาท์พุทก็เป็นนัย


มันฉลาด ขอบคุณ 2 ช่วงเวลา: ทำไมไม่sort -uลองย้อนกลับล่ะ สามารถ+แปลงเป็นจำนวนเพียงพอหรือไม่ (-split$args|sort{($_|% t*y|%{+$_})-join"+"|iex} -u)[-1]
mazzy

กอล์ฟมากขึ้น: (-split$args|sort{$r=0;$_|% t*y|%{$r+=$_};$r}-u)[-1]:)
mazzy

@ mazzy ใช่ขอบคุณ!
AdmBorkBork

3

Python 3 , 55 52 ไบต์

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

ลองออนไลน์!

  • -3 ไบต์ขอบคุณ Gigaflop สำหรับการชี้ให้เห็นว่าไม่จำเป็นต้องมีอาร์กิวเมนต์ในsplitวิธีการ

คุณสามารถบันทึก 3 ไบต์โดยไม่ผ่าน args ไปsplit()ตามที่มันแยกในกลุ่มของช่องว่างใด ๆ
Gigaflop

2

MATLAB, 57 ไบต์

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

ใน MATLAB R2016a ของฉันการทดสอบทั้งหมดผ่านไปแล้วยกเว้นว่าอิโมจิไม่ได้แสดงผลอย่างถูกต้อง แต่ตัวละครจะถูกส่งกลับอย่างถูกต้อง


2

Japt -h , 8 ไบต์

วิธี @Enigma

¸w ñ_¬xc

ลองออนไลน์!


แนวทางอื่น

Japt -g , 8 ไบต์

¸ñ@-X¬xc

ลองออนไลน์!


เหมือนกับสิ่งที่ฉันกำลังจะโพสต์ ความจำเป็นในการกลับรายการทำให้รำคาญฉัน; จะเป็นที่ต้องการถ้าเราสามารถส่งออกคำใด ๆ ในกรณีที่เสมอกัน
Shaggy

@Shaggy ถ้าเป็นไปได้ฉันมี 6 ไบต์คำตอบสำหรับมัน
Luis felipe De jesus Munoz

6-byter เดียวกันฉันเริ่มด้วยก่อนที่จะระบุข้อกำหนดนั้นในสเป็ค
Shaggy

ฉันขอโทษ! เดิมทีเมื่อฉัน sandboxed ความท้าทายที่ฉันคิดว่ามันสามารถออกคำตอบใด ๆ แต่ฉันเปลี่ยนหลังจากข้อเสนอแนะเล็ก ๆ น้อย ๆ ดังนั้นมันจึงสอดคล้องกันมากขึ้น
GammaGames

2

Java (JDK) , 117 97 84 ไบต์

-13 ไบต์ขอบคุณ @Nevay เห็นได้ชัดว่าฉันไม่รู้ว่าฉันยังสามารถใช้varใน Java ได้

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

ลองออนไลน์!


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


1

Pyth , 33 ไบต์

FHmCdmcd)Kczd aYu+GHmCdH0)@KxYeSY

ลองออนไลน์!

มีวิธีที่ดีกว่าในการทำเช่นนี้ แต่ฉันใช้เวลามากเกินไปเพื่อทำสิ่งนี้

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

ฉันจะผ่านการลดลงในแผนที่อื่นแทนที่จะใช้ for for loop แต่ฉันไม่สามารถใช้มันได้


โอ้เด็กชายคำตอบ Pyth! ขอบคุณสำหรับคำอธิบายรายการที่ดี!
GammaGames

1

ถ่าน 20 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⪪S θ

qแยกสายป้อนในช่องว่างและกำหนดให้

≔EθΣEι℅λη

hคำนวณผลรวมของเลขของตัวละครในแต่ละคำและกำหนดที่จะ

§θ⌕η⌈η

ค้นหาดัชนีของผลรวมสูงสุดและพิมพ์คำที่ดัชนีนั้น


1

Powershell, 66 ไบต์

ซื่อตรง ดูคำตอบของAdmBorkBorkเพื่อค้นพบการใช้ Powershell อย่างชาญฉลาด

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

บันทึก! หากต้องการแก้ไขการทำงานกับ unicode ให้บันทึกไฟล์สคริปต์ด้วยUTF-16หรือUTF8 with BOMเข้ารหัส

สคริปต์ทดสอบ:

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

เอาท์พุท:

True: e
True: world
True: test
True: àà
True: α
True: 隣隣隣
True: 🕷️
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.