คำที่บ่อยที่สุดคืออะไร


26

คำที่บ่อยที่สุดคืออะไร

ให้ประโยคของคุณโปรแกรมของคุณต้องผ่านมันนับความถี่ของแต่ละคำจากนั้นส่งออกคำที่ใช้มากที่สุด เนื่องจากประโยคไม่มีความยาวคงที่และสามารถยาวได้มากรหัสของคุณจึงต้องสั้นที่สุด

กฎ / ความต้องการ

  • การส่งแต่ละครั้งควรเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ ถ้ามันเป็นฟังก์ชั่นมันจะต้องสามารถเรียกใช้งานได้โดยเพียงแค่ต้องเพิ่มการเรียกฟังก์ชั่นที่ด้านล่างของโปรแกรม ต้องรวมสิ่งอื่นใด (เช่นส่วนหัวใน C)
  • จะต้องมีล่าม / คอมไพเลอร์ฟรีสำหรับภาษาของคุณ
  • ถ้าเป็นไปได้ให้ลิงค์ไปยังเว็บไซต์ที่สามารถทดสอบโปรแกรมของคุณ
  • STDERRโปรแกรมของคุณไม่ต้องเขียนอะไรไป
  • โปรแกรมของคุณควรรับข้อมูลจากSTDIN(หรือเป็นทางเลือกที่ใกล้เคียงที่สุดในภาษาของคุณ)
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • โปรแกรมของคุณจะต้องคำนึงถึงตัวพิมพ์tHeเล็กTheและตัวพิมพ์ใหญ่ ( และtheทุกอย่างมีส่วนร่วมในการนับthe)
  • หากไม่มีคำที่พบบ่อยที่สุด (ดูกรณีทดสอบ # 3) โปรแกรมของคุณจะไม่แสดงผลอะไร

คำจำกัดความของ 'คำ':

คุณได้รับรายชื่อคำโดยแยกข้อความอินพุตบนช่องว่าง ข้อมูลที่ป้อนจะไม่ประกอบด้วยช่องว่างประเภทอื่นนอกเหนือจากช่องว่างธรรมดา (โดยเฉพาะอย่างยิ่งไม่มีบรรทัดใหม่) อย่างไรก็ตามคำสุดท้ายควรประกอบด้วยตัวอักษรและตัวเลข (az, AZ, 0-9), ยัติภังค์ (-) และ apostrophes (') คุณสามารถทำได้โดยลบอักขระอื่น ๆ ทั้งหมดหรือโดยแทนที่ด้วยช่องว่างก่อนทำการแยกคำ เพื่อให้เข้ากันได้กับกฎรุ่นก่อนหน้านี้ไม่จำเป็นต้องรวมอะพอสโทรฟี

กรณีทดสอบ

The man walked down the road.
==> the

-----

Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
==> he

-----

This sentence has no most frequent word.
==> 

-----

"That's... that's... that is just terrible!" he said.
==> that's / thats

-----

The old-fashioned man ate an old-fashioned cake.
==> old-fashioned

-----

IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
==> IPv6

-----

This sentence with words has at most two equal most frequent words.
==>

หมายเหตุ: กรณีทดสอบที่สามและเจ็ดไม่มีผลลัพธ์คุณสามารถเลือกได้ทั้งสี่กรณี

เกณฑ์การให้คะแนน

โปรแกรมได้คะแนนตามไบต์ ชุดอักขระปกติคือ UTF-8 หากคุณใช้ตัวอื่นโปรดระบุ

เมื่อการท้าทายเสร็จสิ้นโปรแกรมที่มีจำนวนไบต์น้อยที่สุด (เรียกว่า ) จะชนะ

การส่ง

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

ลีดเดอร์บอร์ด

นี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา


2
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Doorknob

1
ดังนั้นเมื่อนิยามใหม่ของคำว่า 'word' แล้วคำที่พบบ่อยที่สุดที่นี่don't d'ont dont a aคืออะไร? มันจะเป็นdontอย่างไร
DJMcMayhem

@DrGreenEggsandHamDJ ถ้าคุณมีการส่งที่ไม่ apostrophes dontลบ, aถ้าไม่ แต่การส่งส่วนใหญ่ทำและdontเป็นคำตอบที่ถูกต้อง
George Gibson

1
คำนึงถึงตัวพิมพ์เล็กหรือไม่ ดังนั้นipv6ผลลัพธ์ที่ถูกต้องสำหรับกรณีทดสอบครั้งสุดท้ายคืออะไร?
kirbyfan64sos

1
อาจมีการใช้กรณีทดสอบพิเศษ: "ประโยคนี้มีคำที่มีคำที่พบบ่อยที่สุดเท่ากันสองคำ" -> <ไม่มี>
philcolbourn

คำตอบ:


6

Pyke, 26 25 ไบต์

l1dcD}jm/D3Sei/1qIi@j@
(;

ลองที่นี่!

หรือ23 22 ไบต์ (ไม่ใช่การเข้ารหัสให้เพิ่มโหนดที่ฆ่าสแต็กหากเป็นเท็จ)

l1cD}jm/D3Sei/1q.Ii@j@

ลองที่นี่!

หรือด้วยเครื่องหมายวรรคตอน 23 ไบต์ (ฉันคิดว่าการแข่งขันนี้เกิดขึ้นก่อนที่จะแก้ไข)

l1.cD}jm/D3Sei/1q.Ii@j@

ลองที่นี่!

หรือ 12 ไบต์ (ไม่ใช่การแข่งขันอย่างแน่นอน)

l1.cj.#jR/)e

ลองที่นี่!

l1           -     input.lower()
  .c         -    punc_split(^)
    j        -   j = ^
     .#   )  -  sort(V(i) for i in ^)
       jR/   -   j.count(i)
           e - ^[-1]

คำตอบที่ 23 ไบต์ของคุณจะแข่งขันถ้าเครื่องหมายวรรคตอนเพียงเก็บรักษาไว้เป็น-และ'(ยัติภังค์และเครื่องหมายวรรคตอน)
George Gibson

เพียงรักษาเครื่องหมายวรรคตอนที่ไม่สิ้นสุดคำ
Blue

โอ้ตกลง (ฉันไม่เข้าใจ Pyke) ฉันเดาว่ามันจะแข่งขันกันแล้ว ...
George Gibson

1
@ GeorgeGibson ฉันค่อนข้างมั่นใจว่าเวอร์ชั่น 23 ไบต์ไม่สามารถแข่งขันได้ - มันอาจมาภายใต้ช่องโหว่มาตรฐาน นอกจากนี้ฉันไม่ได้คาดหวัง (m) คนที่จะเข้าใจ Pyke ฉันทำให้มันเป็นภาษาของตัวเอง
Blue

เอาล่ะแล้ว ฉันคิดว่าคุณยังคงชนะอยู่ดีดังนั้นมันไม่สำคัญเลย
George Gibson


11

Pyth - 23 30 ไบต์

จะต้องมีวิธีที่ดีกว่าในการรวมตัวเลขและเครื่องหมายขีดคั่น แต่ฉันต้องการแก้ไขในตอนนี้

Kc@s+++GUTd\-rzZ)I!tJ.M/KZ{KhJ

Test Suite


1
กฎที่แก้ไขต้องมีการรักษาตัวเลขและเครื่องหมายขีดคั่น
Dennis

@GeorgeGibson แก้ไขแล้ว
Maltysen

6

อ็อกเทฟ115 94 ไบต์

[a,b,c]=unique(regexp(lower(input('')),'[A-z]*','match'));[~,~,d]=mode(c); try disp(a{d{:}})

tryบัญชีสำหรับกรณีที่มีไม่มีคำที่พบบ่อยที่สุดโดยใช้ ในกรณีนี้มันจะไม่แสดงผลใด ๆ และ "หยุดพัก" จนกว่าคุณจะตรวจพบข้อยกเว้น

ไบต์ที่บันทึกไว้ 21 (!) ขอบคุณคำแนะนำของ Luis Mendo (ใช้ผลลัพธ์ที่สามจากmodeเพื่อให้ได้คำที่พบบ่อยที่สุด)


กฎมีการเปลี่ยนแปลงเล็กน้อยตั้งแต่ฉันโพสต์คำตอบเดิมของฉัน ฉันจะดูใน regex ภายหลัง


1
คุณเอาชนะฉันมันจะต้องคิดอย่างอื่นแล้ว
Abr001am

ใช้modeกับcอาจ? เอาต์พุตที่สามของมันให้ค่าที่เชื่อมโยงทั้งหมดหากฉันจำได้ถูกต้อง
Luis Mendo

ฉันนับ 115 ไบต์
Conor O'Brien

ฉันเชื่อว่า regex ของคุณควรเป็น['\w\d]เพราะคุณต้องรักษาเครื่องหมายวรรคตอนและตัวเลข ยกเว้นกรณีที่อยู่ระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็กใน ASCII ซึ่งในกรณีนี้จะไม่สนใจฉันเพราะฉันไม่มีตารางที่สะดวก
คดีของกองทุนโมนิกา

1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])ให้out = {1 2}
Luis Mendo

5

Perl 6, 80 ไบต์

{$_>1&&.[0].value==.[1].value??""!!.[0].key given .lc.words.Bag.sort:{-.value}}

ลองแบ่งคำตอบออกเป็นสองส่วน ...

given .lc.words.Bag.sort:{-.value}

givenเป็นคำสั่งควบคุม (เช่นifหรือfor) ใน Perl 6 พวกเขาจะได้รับอนุญาตเป็น postfix ( a if 1หรือชอบที่นี่foo given 3) givenวางหัวข้อ (ด้านขวา) ลงในตัวแปรพิเศษ$_สำหรับด้านซ้าย

"หัวข้อ" ตัวเองพิมพ์เล็ก ( lc) แยกตามคำ ( words) ใส่ค่าลงในกระเป๋า (ตั้งค่าด้วยจำนวนที่ปรากฏ) จากนั้นเรียงลำดับตามค่า (DESC) เนื่องจากsortรู้เพียงว่าจะดำเนินการกับรายการได้อย่างไรBagจึงถูกเปลี่ยนเป็นส่วนหนึ่งListของPairที่นี่

$_>1&&.[0].value==.[1].value??""!!.[0].key

เงื่อนไขง่าย ๆ ( ?? !!ใช้ใน Perl 6 แทน? :)

$_ > 1

เพียงตรวจสอบว่ารายการมีองค์ประกอบมากกว่าหนึ่งรายการ

.[0].value==.[1].value

การเข้าถึง$_สามารถสั้นลง ... โดยไม่ระบุตัวแปร .aเป็นเหมือน$_.aเป็นเหมือนดังนั้นนี่คือ "ทำองค์ประกอบด้านบนทั้งสองอย่างมีจำนวนครั้งที่เท่ากัน" - ถ้าเป็นเช่นนั้นเราจะพิมพ์ '' (สตริงว่าง)

มิฉะนั้นเราพิมพ์คีย์องค์ประกอบด้านบนของ .[0].key(นับ):


7
มันเหมือนกับภาษาอังกฤษครึ่งเสียงครึ่งเสียง น่าอัศจรรย์
แมว

1
มันตลกว่ามันเป็นคุณสมบัติของ OO แบบไหนที่ดูเป็นภาษาอังกฤษ -y: P
Ven

2
นอกจากนี้ยังจัดการให้สามารถอ่านได้น้อยกว่า Perl 5 ในขณะที่มีภาษาอังกฤษมากกว่า Perl 5 D:
cat

1
@cat คงได้ - ควรจะอ่านไม่ได้โดยสิ้นเชิงในขณะนี้
Ven

5
value??!!(ฉันรู้ว่าเป็นผู้ประกอบการที่สามมันแค่สนุกสนาน)
แมว

4

05AB1E , 30 ไบต์

รหัส:

lžj¨„ -«Ãð¡©Ùv®yQOˆ}®¯MQÏDg1Q×

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .



3
@TessellatingHeckler ใช้เพียงหนึ่งอินพุตเท่านั้น ยกเว้นว่าคุณใช้Iคำสั่งซ้ำ ๆ กัน05AB1E จะใช้เวลามากเท่าที่ต้องการ
George Gibson

4

JavaScript (ES6), 155 ไบต์

s=>(m=new Map,s.toLowerCase().replace(/[^- 0-9A-Z]/gi,'').split(/\ +/).map(w=>m.set(w,-~m.get(w))),[[a,b],[c,d]]=[...m].sort(([a,b],[c,d])=>d-b),b==d?'':a)

ตามคำตอบ Python ของ @ Blue


การแทนที่ regex ของคุณดูเหมือนว่าจะลดจำนวนลงและจะแบ่งกรณีทดสอบ IPv6 ใช่ไหม?
TessellatingHeckler

@TessellatingHeckler ความหมายของคำเปลี่ยนไปจากเดิมที่ฉันอ่านคำถาม แต่ฉันได้อัปเดตคำตอบของฉันตอนนี้
Neil

4

Python 3.5, 142 137 134 112 117 110 127 ไบต์:

( +17 ไบต์เนื่องจากเห็นได้ชัดว่าแม้จะมีคำบ่อยกว่าที่เหลือ แต่พวกเขามีความถี่เดียวกันไม่มีอะไรควรจะกลับมา )

def g(u):import re;q=re.findall(r"\b['\-\w]+\b",u.lower());Q=q.count;D=[*map(Q,{*q})];return['',max(q,key=Q)][1in map(D.count,D)]

ตอนนี้ควรตอบสนองทุกเงื่อนไข การส่งนี้ถือว่ามีการป้อนข้อมูลอย่างน้อย 1 คำ

ลองออนไลน์! (Ideone)

นอกจากนี้หากคุณต้องการอันนี้นี่เป็นอีกเวอร์ชั่นของฟังก์ชั่นของฉันที่ไม่มีการแสดงออกปกติใด ๆ ที่ราคาประมาณ 43 ไบท์ถึงแม้ว่าอันนี้จะไม่ใช่การแข่งขันก็ตามดังนั้นมันจึงไม่สำคัญ ฉันเพิ่งวางมันไว้ที่นี่

def g(u):import re;q=''.join([i for i in u.lower()if i in[*map(chr,range(97,123)),*"'- "]]).split();Q=q.count;D=[*map(Q,{*q})];return['',max(q,key=Q)][1in map(D.count,D)]

ลองเวอร์ชั่นใหม่นี้ออนไลน์! (Ideone)


จากความคิดเห็นที่ท้าทาย "ถ้ามีสองคำที่บ่อยกว่าที่เหลือ แต่ด้วยความถี่เดียวกัน" ผลลัพธ์คือ 'ไม่มีอะไร'
RootTwo

@RootTwo แก้ไขแล้ว! :)
R. Kap

@TessellatingHeckler คำเหล่านั้นต่างกัน That'sคือการหดตัวthat isในขณะที่thatsไม่ได้คำจริงๆ
R. Kap

@TessellatingHeckler คุณช่วยให้ฉันพิสูจน์ความคิดเห็นนี้ได้ไหม? เพราะฉันจะผ่านความคิดเห็นทั้งหมดในโพสต์และไม่เห็นความคิดเห็นดังกล่าว
R. Kap

4

Ruby, 94 92 102 ไบต์

ต้องไปอย่างรวดเร็ว (คำตอบ FGITW) ส่งคืนคำในตัวพิมพ์ใหญ่ทั้งหมดหรือnilหากไม่มีคำที่ใช้บ่อยที่สุด

ฉันคิดว่าตอนนี้ได้รับการปรับปรุงรายละเอียดใหม่ อย่างไรก็ตามฉันจัดการลงสนามได้เล็กน้อยดังนั้นการนับจำนวนไบต์จึงเหมือนกัน!

->s{w=s.upcase.tr("_'",'').scan /[-\w]+/;q=->x{w.count x};(w-[d=w.max_by(&q)]).all?{|e|q[e]<q[d]}?d:p}

5
Gotta go fast?
แมว

@cat ใช่ 'cuz ฉันเป็น FGITW ในครั้งนี้
Value Ink



3

Sqlserver 2008, 250 ไบต์

DECLARE @ varchar(max) = 'That''s... that''s... that is just terrible!" he said.';

WITH c as(SELECT
@ p,@ x
UNION ALL
SELECT LEFT(x,k-1),STUFF(x,1,k,'')FROM
c CROSS APPLY(SELECT patindex('%[^a-z''-]%',x+'!')k)k
WHERE''<x)SELECT max(p)FROM(SELECT top 1with ties p
FROM c WHERE p>''GROUP BY p
ORDER BY count(*)DESC
)j HAVING count(*)=1

ลองออนไลน์!

Sqlserver 2559, 174 ไบต์

ไม่สามารถจัดการข้อมูลเช่นตัวอย่างนี้ (นับเท่ากับ 3 คำ):

DECLARE @ varchar(max) = 'That''s... that''s... that is just terrible!" he said. = = ='

SELECT max(v)FROM(SELECT TOP 1WITH TIES value v
FROM STRING_SPLIT(REPLACE(REPLACE(REPLACE(@,'"',''),',',''),'.',''),' ')GROUP
BY value ORDER BY count(*)DESC)x HAVING count(*)=1

ฉันไม่ชอบวิธีการแปรผันเนื่องจากเป็นการโกง :) อินพุตหนึ่ง -> อะไรเลยหรืออะไรบางอย่างด้วยวิธีการตั้งค่ามันต้องใช้เวลานานเพราะคุณจำเป็นต้องเพิ่มGROUP BY, LEFT JOIN, or PARTITION BYAnyway SQL Server เพิ่มเติมในตัว SPLIT การสาธิต Ungolfed อย่าลังเลที่จะทำให้มันสั้นที่สุด
lad2025

@ lad2025 ขอบคุณมากไม่ทราบว่ามีฟีเจอร์ใดจากปี 2559 แน่นอนว่า SPLIT_STRING เป็นคุณลักษณะที่เกินกำหนดมานาน ฉันพยายามเล่นสคริปต์โดยใช้ split ให้ลงมาที่ 174 แต่จะไม่สามารถกรองข้อความเช่น "= = ="
t-clausen.dk

3

PostgreSQL, 246 , 245 ไบต์

WITH z AS(SELECT DISTINCT*,COUNT(*)OVER(PARTITION BY t,m)c FROM i,regexp_split_to_table(translate(lower(t),'.,"''',''),E'\\s+')m)
SELECT t,CASE WHEN COUNT(*)>1 THEN '' ELSE MAX(m)END
FROM z WHERE(t,c)IN(SELECT t,MAX(c)FROM z GROUP BY t)
GROUP BY t  

เอาท์พุท:

enter image description here

ป้อนข้อมูลหากใครสนใจ:

CREATE TABLE i(t TEXT);

INSERT INTO i(t)
VALUES ('The man walked down the road.'), ('Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.'),
       ('This sentence has no most frequent word.'), ('"That''s... that''s... that is just terrible!" he said. '), ('The old-fashioned man ate an old-fashioned cake.'), 
       ('IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.'), ('a   a            a b b b c');


ปกติฉันจะใช้MODE() WITHIN GROUP(...)และมันจะสั้นกว่ามาก แต่มันจะละเมิด:

หากไม่มีคำที่พบบ่อยที่สุด (ดูกรณีทดสอบ # 3) โปรแกรมของคุณจะไม่แสดงผลอะไร


แก้ไข:

การจัดการ':

WITH z AS(SELECT DISTINCT*,COUNT(*)OVER(PARTITION BY t,m)c FROM i,regexp_split_to_table(translate(lower(t),'.,"!',''),E'\\s+')m)
SELECT t,CASE WHEN COUNT(*)>1 THEN '' ELSE MAX(m)END
FROM z WHERE(t,c)IN(SELECT t,MAX(c)FROM z GROUP BY t)
GROUP BY t  

SqlFiddleDemo

เอาท์พุท:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              t                                                ║      max      ║
╠═══════════════════════════════════════════════════════════════════════════════════════════════╬═══════════════╣
║ a a a b b b c                                                                                 ║               ║
║ The old-fashioned man ate an old-fashioned cake.                                              ║ old-fashioned ║
║ IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.  ║ ipv6          ║
║ This sentence has no most frequent word.                                                      ║               ║
║ "That's... that's... that is just terrible!" he said.                                         ║ that's        ║
║ The man walked down the road.                                                                 ║ the           ║
║ Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.        ║ he            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝

ไม่สามารถรับได้ต่ำตามที่คุณ sqlserver ยังไม่ได้สร้างในแยก อย่างไรก็ตามส่วนที่เลือกจะสั้นกว่า
t-clausen.dk

@GeorgeGibson แน่นอนแก้ไข + เพิ่มการสาธิตสด
lad2025

@ lad2025 จากข้อตกลงทั่วไปในการแชทสิ่งที่คุณทำไม่จำเป็นอีกต่อไปอย่าลังเลที่จะเปลี่ยนกลับ
George Gibson

@GeorgeGibson Yup การแก้ไขจะชัดเจนมาก การสาธิตสดทำงานในขณะนี้เมื่อฉันเขียนคำตอบ sqlfiddle ไม่ตอบสนอง
lad2025

2

R, 115 ไบต์

function(s)if(sum(z<-(y=table(tolower((x=strsplit(s,"[^\\w']",,T)[[1]])[x>""])))==max(y))<2)names(which(z))else NULL

ฟังก์ชั่นนี้เป็นที่ยอมรับสตริงและกลับสตริงถ้าคำเดียวปรากฏบ่อยขึ้นกว่าคนอื่น ๆ และNULLอย่างอื่น หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

Ungolfed:

f <- function(s) {
    # Create a vector of words by splitting the input on characters other
    # than word characters and apostrophes
    v <- (x <- strsplit(s, "[^\\w']", perl = TRUE))[x > ""]

    # Count the occurrences of each lowercased word
    y <- table(tolower(v))

    # Create a logical vector such that elements of `y` which occur most
    # often are `TRUE` and the rest are fase
    z <- y == max(y)

    # If a single word occurs most often, return it, otherwise `NULL`
    if (sum(z) < 2) {
        names(which(z))
    } else {
        NULL
    }
}

2

เรติน่า 97 ไบต์

กฎมีการเปลี่ยนแปลง ...

T`L`l
[^-\w ]

O`[-\w]+
([-\w]+)( \1\b)*
$#2;$1
O#`[-\w;]+
.*\b(\d+);[-\w]+ \1;[-\w]+$

!`[-\w]+$

ลองออนไลน์!

ชุดทดสอบ



@ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณแก้ไขแล้ว
Leun Nun

1
และคุณตีกอล์ฟได้ 11 ไบต์ ประทับใจ
Conor O'Brien

นอกจากนี้ยังล้มเหลวสำหรับ "ชายแก่กินเค้กที่ล้าสมัย"
t-clausen.dk

สิ่งนี้ดูไม่ถูกต้องเช่นกัน (คาดว่าaจะเป็นคำที่พบบ่อยที่สุด)
TessellatingHeckler

2

Python ขนาด 132 ไบต์

import collections as C,re
def g(s):(a,i),(b,j)=C.Counter(re.sub('[^\w\s-]','',s.lower()).split()).most_common(2);return[a,''][i==j]

โค้ดด้านบนสมมติว่าอินพุตมีคำอย่างน้อยสองคำ


ต้องรัก regex นั้นเถอะ
บลู

สิ่งนี้ไม่ถูกต้อง คลาสตัวละคร\wรวมถึงขีดล่าง
mbomb007

1

PHP, 223 ไบต์

$a=array_count_values(array_map(function($s){return preg_replace('/[^A-Za-z0-9]/','',$s);},explode(' ',strtolower($argv[1]))));arsort($a);$c=count($a);$k=array_keys($a);echo($c>0?($c==1?$k[0]:($a[$k[0]]!=$a[$k[1]]?$k[0]:'')):'');

1

Python 2, 218 bytes

Assumes more than 2 words. Getting rid of punctuation destroyed me...

import string as z
def m(s):a=[w.lower()for w in s.translate(z.maketrans('',''),z.punctuation).split()];a=sorted({w:a.count(w)for w in set(a)}.items(),key=lambda b:b[1],reverse=1);return a[0][0]if a[0][1]>a[1][1]else''

Does this strip ',- etc?
Tim

@Tim No, I did this challenge before the rules were fully fleshed. Will change.
Blue

Can you assign the result of sorted to a tuple rather than having to index into the array manually?
Neil

@Neil you mean just get the first and second items for comparison instead of the entire array? I don't know how to do that
Blue

1

Matlab (225)

  • Rules chaneged :/

.

      function c=f(a),t=@(x)feval(@(y)y(y>32),num2str(lower(x)-0));f=@(x)num2str(nnz(x)+1);e=str2num(regexprep(a,'([\w''-]+)',' ${t($1)} ${f($`)} ${f([$`,$1])}'));[u,r,d]=mode(e);try c=find(e==d{:});c=a((e(c(1)+1)):(e(c(1)+2)));end
  • Toolbox is necessary to run this.

  • How does this work, one of the nicest privileges of regex replace in matlab this it field-executes tokens by calling external-environmental functions parameterized by the tokens caught in the inner environment, so any sequence of "Word_A Word_B .." is replaced by integers "A0 A1 A2 B0 B1 B2 ..." where the first integer is the numerica ascii signature of the word, the second is the starting index, the third is the ending index, these last two integers dont reduplicate in the whole sequence so i took this advantage to transpose it to an array, then mode it then search the result in that array, so the starting/ending indices will consequently follow.

  • Edit: after changing some details, the program is called function by a string parameter.


20 bytes saved thanks to @StewieGriffin, 30 bytes added reproaches to common-agreed loopholes.


You'll have my upvote when you (or someone else) show that this actually works, both for inputs that have a most common word, and for inputs that don't. =) (I can't test it, unfortunately)
Stewie Griffin

@StewieGriffin i think the programe misbehaves with sentences with equi-frequence words i will fix that
Abr001am

1

05AB1E, 22 21 20 bytes

žK„- JÃl#{D.MDgiJëõ?

Explanation:

žK                     # Push [a-zA-Z0-9]
  „-                   # Push 2-char string containing a hyphen and a space
     J                 # Join the stack into a single element
      Ã                # Removes all characters from implicit input except those specified above
       l               # Converts to lowercase
        #              # Split string by spaces
         {             # Sorts array
          D            # Duplicates
           .M          # Finds most common element
             Dg        # Gets length of string without popping
                 iJ    # If length == 1, then convert the array to a string (otherwise the output would be ['example'] instead of example
                   ëõ? # Else push an empty string.

Note: If you're fine with trailing newlines in the output for when you're not supposed to output anything, remove the ? at the end to save a byte.

Note #2: The program will not work with a single word, but I doubt this would be a problem. If you want to fix this, replace # with ð¡ for an extra byte.

05AB1E uses CP-1252 as the charset, not UTF-8.

Try it online!


1

Perl, 60 56 55 54 bytes

Includes +3 for -p

#!/usr/bin/perl -p
s/[\pL\d'-]+/$;[$a{lc$&}++]++or$\=$&/eg}{$\x=2>pop@

If a word cannot be just a number you can also drop the a for a score of 53.


Does the hyphen in the -anE not count? It does on the other answer (+2 bytes for -p flag)...
George Gibson

@GeorgeGibson No, see meta.codegolf.stackexchange.com/questions/273/…. The hyphen, the space and the E do not count. The other answer would normally only have to do +1 bytes for -p, but his solution has ' so it cannot be seen as an extension of -e or -E. So he should in fact count +3 (not +2) since he should count the space and the hyphen (but every extra option would only be +1).
Ton Hospel

@TomHospel Oh, right.
George Gibson

Is this considered valid given the apostrophe rule? [\pL\d-] looks like it could be shrunken down to [\w-] (unless we care about underscores) but either version will report that instead of that's or thats for test 4. Otherwise, you need to add 4 bytes to insert \x27 in that character class (unless you have a better way of adding an apostrophe).
Adam Katz

@AdamKatz The definition of 'word' changed quite a bit while this was running and I never fully adopted the last version. But to keep you happy I created a fixed (and shorter) version :-). And yes, I do care about underscores
Ton Hospel

0

PowerShell (v4), 117 bytes

$y,$z=@($input-replace'[^a-z0-9 \n-]'-split'\s'|group|sort Count)[-2,-1]
($y,($z,'')[$y.Count-eq$z.Count])[!!$z].Name

The first part is easy enough:

  • $input is ~= stdin
  • Regex replace irrelevant characters with nothing, keep newlines so we don't mash two words from the end of a line and the beginning of the next line into one by mistake. (Nobody else has discussed multiple lines, could golf -2 if the input is always a single line).
  • Regex split, Group by frequency (~= Python's collections.Counter), Sort to put most frequent words at the end.
  • PowerShell is case insensitive by default for everything.

Handling if there isn't a most frequent word:

  • Take the last two items [-2,-1] into $y and $z;
  • an N-item list, where N>=2, makes $y and $z the last two items
  • a 1-item list makes $y the last item and $z null
  • an Empty list makes them both null

Use the bool-as-array-index fake-ternary-operator golf (0,1)[truthyvalue], nested, to choose "", $z or $y as output, then take .Name.

PS D:\> "The man walked down the road."|.\test.ps1
The

PS D:\> "Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy."|.\test.ps1
he

PS D:\> "`"That's... that's... that is just terrible!`" he said."|.\test.ps1
Thats

PS D:\> "The old-fashioned man ate an old-fashioned cake."|.\test.ps1
old-fashioned

PS D:\> "IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses."|.\test.ps1
IPv6

0

Lua, 232 199 175 bytes

w,m,o={},0;io.read():lower():gsub("[^-%w%s]",""):gsub("[%w-]+",function(x)w[x]=(w[x]or 0)+1 end)for k,v in pairs(w)do if m==v then o=''end if(v>m)then m,o=v,k end end print(o)

1
if not w[x]then w[x]=0 end w[x]=w[x]+1 end -> w[x]=(w[x]or0)+1
Leaky Nun

if m==v then o=''end -> o=m==v and '' or o
Leaky Nun

0

Perl 5, 96 92 84 + 2 (-p flag) = 86 bytes

++$h{+lc}for/\w(?:\S*\w)?/g}{$m>$e[1]||$e[1]>$m&&(($_,$m)=@e)||($_="")while@e=each%h

Using:

> echo "The man walked down the road." | perl -p script.pl

Your -p flag should invoke a penalty of 3 bytes. The rules are roughly: Each commandline flag is +1 byte since that is how many extra bytes you need to extend your free -e'code' style commandline. So normally -p is only +1 byte. But here your code has ' so it cannot be run simply from the commandline without escaping. So no combining with -e and the - and the space before the p are extra and must be counted too
Ton Hospel

@TonHospel Fixed.
Denis Ibaev

This is actually 84 + 1 (-p flag) if you invoke it on the command line as perl -pe'…' (made available by removing the ' as noted in the first comments)
Adam Katz

0

Python, 158 bytes

def g(s):import collections as c,re;l=c.Counter(re.sub('[^\w\s-]',"",s.lower()).split());w,f=l.most_common(1)[0];return[w,""][all(f==i[1]for i in l.items())]

Takes its input like this:

g("Bird is the word")

Should match all the requirements, although it does fail on empty strings, is it necessary to check for those? Sorry for the delay.

Advice / feedback / black magic tips for saving bytes are always welcome


Hi, and welcome to PPCG! We score code-golf challenges by the number of bytes in the answer. I went ahead and edited it for you with the correct information.
Rɪᴋᴇʀ

2
Welcome to PPCG! Unfortunately, your submission does not satisfy all the requirements of this challenge as, first of all, it's NOT case insensitive. For instance, it will NOT count occurrences of the word That as occurrences of the word that since the former begins with an uppercase T and the latter begins with a lowercase t. Also, this does NOT remove all other forms of punctuation except hyphens (-) and, optionally, apostrophes (') and as a result, this would NOT work for the fourth test case given in the question.
R. Kap

1
Also, this does NOT output nothing if there is no most frequent word. For instance, using the third test case (This sentence has no most frequent word.) as an example, your function outputs [('This', 1)], when it should instead be outputting nothing. I could go on and on about more issues, so I would recommend fixing them as soon as you can.
R. Kap

Will do soon, when I have time
Wouldn't You Like To Know

This is incorrect. The character class \w includes underscores.
mbomb007

0

Tcl 8.6, 196 bytes

lmap s [join [read stdin] \ ] {dict incr d [regsub -all {[^\w-]} [string tol $s] {}]}
set y [dict fi $d v [lindex [lsort [dict v $d]] end]]
if {[llength $y]!=2} {set y {}}
puts "==> [lindex $y 0]"

(Alas, I can't figure out how to get it any smaller than that...)

Explanation

It uses several obscure Tcl idioms to do stuff.

  • [join [read stdin] " "] — input string→list of whitespace-separated words
  • lmap ... — iterate over every element of that list. (Shorter than foreach and effectually identical since the result is discarded.)
  • [regsub ... [string tolower ...]] — Convert the string to lowercase and strip all characters except for word characters and the hyphen.
  • [dict incr d ...] — Create/modify a dictionary/word→count histogram.
  • set y ... — Sort the dictionary values, take the largest one, and return all (key,value) pairs corresponding to it.
  • if... — There must be exactly two elements: a single (key,value) pair, else there is nothing to print.
  • puts... — Print the key in the key value pair, if any. (No word has spaces.)

You can play with it using CodeChef.



0

Rexx, 109 128 122 bytes

pull s;g.=0;m=0;do i=1 to words(s);w=word(s,i);g.w=g.w+1;if g.w>=m then do;m=g.w;g.m=g.m+1;r=w;end;end;if g.m=1 then say r

Pretty printed...

pull s
g.=0
m=0
do i=1 to words(s)
  w=word(s,i)
  g.w=g.w+1
  if g.w>=m
  then do
    m=g.w
    g.m=g.m+1
    r=w
  end
end
if g.m=1 then say r

I don't think this handles all cases of tied most frequent words - see (new) last test case - I made similar mistake.
philcolbourn

Hopefully, that's fixed it now
aja

0

bash, 153 146 131 154 149 137 bytes

declare -iA F
f(){ (((T=++F[$1])==M))&&I=;((T>M))&&M=$T&&I=$1;}
read L
L=${L,,}
L=${L//[^- a-z0-9]}
printf -vA "f %s;" $L
eval $A;echo $I

Operation:

declare an associative array F of integers (declare -iA F)

f is a function that, given a word parameter $1, increments frequency count for this word (T=++F[$1]) and compares to max count so far (M).

If equal, the we have a tie so we will not consider this word to be most frequent (I=)

If greater than max count so far (M), then set max count so far to frequency count of this word so far (M=$T) and remember this word (I=$1)

End function f

Read a line (read L) Make lowercase (L=${L,,}) Remove any character except a-z, 0-9, dash(-) and space (L=${L//[^- a-z0-9]}) Make a sequence of bash statements that calls f for each word (printf -vA "f %s;" $L). This is saved to variable A. eval A and print result (eval $a;echo$I)

Output:

This quick brown fox jumps over this lazy dog.
-->this
This sentence with the words has at most two equal most frequent the words.
-->
The man walked down the road.
-->the
This sentence has no most frequent word.
-->
Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
-->he
"That's... that's... that is just terrible!" he said.
-->thats
The old-fashioned man ate an old-fashioned cake.
-->old-fashioned
IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
-->ipv6

Bug: FIXED I have a bug that is not revealed in these test cases. If input is

This sentence with words has at most two equal most frequent words.

then my code should output nothing.

I have a fix but I seem to have hit a bash bug... I get very odd behaviour is M is not declared an integer: ++F[$1]==M (after a few repeated words) increments both F[$1] and M!! - my mistake.


0

Python 3, 76 98 100 bytes

import re,statistics as S
try:print(S.mode(re.split("([a-z0-9-]+)",input().lower())[1::2]))
except:1

Try it online

Outputs the most common word as lowercase. Does not include apostrophes because "apostrophes are not required to be included."

statistics.mode requires Python 3.4

Unfortunately, no output to stderr is allowed, or it'd be much shorter.


You're not allowed to print to STDERR, unless this program doesn't produce any error output?
Okx

Your new program doesn't support hyphens! I tried the input i- test i-
Okx

Fixed it all. Still short.
mbomb007

0

R, 96 bytes

19 bytes shorter than the existing R answer, with a somewhat different approach.

t=table(gsub("[^a-z0-9'-]","",tolower(scan(,''))))
`if`(sum(t==max(t))-1,'',names(which.max(t)))

Reads from stdin, so the input is automatically separated by spaces. We convert to lowercase and use gsub to remove all non-alphanumerics (plus - and '). We count the instances of each word with table and save the result to t. Next, we check if there is more than 1 maximum in t (by seeing if there is more than one element which is equal to max(t). If so, we return the empty string ''. If not, we return the word corresponding to the maximum in t.

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