Từ thường xuyên nhất là gì?


26

Từ thường xuyên nhất là gì?

Đưa ra một câu, chương trình của bạn phải thực hiện theo cách đó, đếm tần số của mỗi từ, sau đó xuất ra từ được sử dụng nhiều nhất. Vì một câu không có độ dài cố định và do đó có thể rất dài, mã của bạn phải càng ngắn càng tốt.

Quy tắc / Yêu cầu

  • Mỗi bài nộp phải là một chương trình hoặc chức năng đầy đủ. Nếu nó là một hàm, nó phải được chạy bằng cách chỉ cần thêm lệnh gọi hàm vào cuối chương trình. Bất cứ điều gì khác (ví dụ như các tiêu đề trong C), phải được bao gồm.
  • Phải có một trình thông dịch / trình biên dịch miễn phí có sẵn cho ngôn ngữ của bạn.
  • Nếu có thể, hãy cung cấp một liên kết đến một trang web nơi chương trình của bạn có thể được kiểm tra.
  • Chương trình của bạn không được viết bất cứ điều gì STDERR.
  • Chương trình của bạn nên lấy đầu vào từ STDIN(hoặc thay thế gần nhất trong ngôn ngữ của bạn).
  • Sơ hở tiêu chuẩn bị cấm.
  • Chương trình của bạn phải là case-insensitive ( tHe, Thethetất cả các đóng góp vào sự đếm the).
  • Nếu không có từ thường xuyên nhất (xem trường hợp thử nghiệm # 3), chương trình của bạn sẽ không xuất ra gì.

Định nghĩa của một 'từ':

Bạn có được danh sách các từ bằng cách chia văn bản đầu vào trên khoảng trắng. Đầu vào sẽ không bao giờ chứa bất kỳ loại khoảng trắng nào khác ngoài không gian đơn giản (đặc biệt không có dòng mới). Tuy nhiên, các từ cuối cùng chỉ nên chứa chữ và số (az, AZ, 0-9), dấu gạch nối (-) và dấu nháy đơn ('). Bạn có thể làm như vậy bằng cách xóa tất cả các ký tự khác hoặc bằng cách thay thế chúng bằng dấu cách trước khi thực hiện chia tách từ. Để vẫn tương thích với các phiên bản trước của quy tắc, dấu nháy đơn không bắt buộc phải được đưa vào.

Các trường hợp thử nghiệm

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

Lưu ý: Các trường hợp thử nghiệm thứ ba và thứ bảy không có đầu ra, bạn có thể chọn một trong hai trường hợp thứ tư.

Chấm điểm

Các chương trình được tính theo byte. Bộ ký tự thông thường là UTF-8, nếu bạn đang sử dụng một ký tự khác, vui lòng chỉ định.

Khi thử thách kết thúc, chương trình có ít byte nhất (được gọi là ), sẽ giành chiến thắng.

Đệ trình

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.


2
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Doorknob

1
Vì vậy, với định nghĩa mới của bạn về 'từ', từ phổ biến nhất ở đây là don't d'ont dont a agì? Nó sẽ là dontgì?
DJMcMayhem

@DrGreenEggsand HamDJ Nếu bạn có một bài viết loại bỏ dấu nháy đơn , dont. Nếu không , a. nhưng hầu hết các bài nộp, và đó dontlà một câu trả lời đúng.
George Gibson

1
Là trường hợp đầu ra nhạy cảm? Vì vậy, ipv6đầu ra hợp lệ cho trường hợp thử nghiệm cuối cùng?
kirbyfan64sos

1
Một trường hợp kiểm tra bổ sung có thể được sử dụng: "Câu này với các từ có nhiều nhất hai từ thường xuyên nhất bằng nhau." -> <nothing>
philcolbourn

Câu trả lời:


6

Pyke, 26 25 byte

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

Hãy thử nó ở đây!

Hoặc 23 22 byte (không lọc, thêm nút trong đó giết stack nếu sai)

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

Hãy thử nó ở đây!

Hoặc với dấu câu, 23 byte (Tôi nghĩ rằng điều này cạnh tranh? Cam kết là trước khi chỉnh sửa)

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

Hãy thử nó ở đây!

Hoặc 12 byte (chắc chắn không lọc)

l1.cj.#jR/)e

Hãy thử nó ở đây!

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

Câu trả lời 23 byte của bạn sẽ cạnh tranh nếu dấu câu duy nhất được giữ nguyên là -'(dấu gạch ngang và dấu nháy đơn).
George Gibson

Nó chỉ giữ nguyên dấu câu không ở cuối từ
Blue

Ồ, được thôi (tôi không hiểu Pyke). Tôi đoán nó sẽ thi đấu sau đó ...
George Gibson

1
@GeorgeGibson Tôi khá chắc chắn rằng phiên bản 23 byte không cạnh tranh - nó có thể xuất hiện dưới những sơ hở tiêu chuẩn. Ngoài ra tôi không mong đợi (m) bất kỳ người nào hiểu Pyke, tôi biến nó thành ngôn ngữ của riêng tôi
Blue

Được rồi. Tôi nghĩ dù sao bạn vẫn chiến thắng, vì vậy nó không thực sự quan trọng.
George Gibson


11

Pyth - 23 30 byte

Phải có một cách tốt hơn để bao gồm các chữ số và dấu gạch nối, nhưng tôi chỉ muốn sửa lỗi này ngay bây giờ.

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

Phòng thử nghiệm .


1
Các quy tắc sửa đổi yêu cầu bảo quản chữ số và dấu gạch nối.
Dennis

@GeorgeGibson đã sửa.
Maltysen

6

Octave, 115 94 byte

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

Tài khoản cho trường hợp không có từ thường xuyên nhất bằng cách sử dụng try. Trong trường hợp này, nó không tạo ra kết quả gì và "tạm nghỉ" cho đến khi bạn bắt được ngoại lệ.

Đã lưu 21 byte (!) Nhờ đề xuất của Luis Mendo (sử dụng đầu ra thứ ba từ modeđể có được từ phổ biến nhất).


Các quy tắc đã thay đổi khá nhiều kể từ khi tôi đăng câu trả lời ban đầu của mình. Tôi sẽ xem xét regex sau.


1
bạn đánh tôi với nó, sẽ nghĩ cho điều gì khác bây giờ.
Abr001am

Áp dụng modetrên ccó thể? Đầu ra thứ ba của nó cung cấp tất cả các giá trị gắn liền, nếu tôi nhớ chính xác
Luis Mendo

Tôi đếm 115 byte.
Conor O'Brien

Tôi tin rằng regex của bạn nên là ['\w\d]vì bạn phải bảo tồn dấu nháy đơn và chữ số. Trừ khi chúng nằm giữa chữ hoa và chữ thường trong ASCII, trong trường hợp này, hãy bỏ qua tôi vì tôi không có bảng tiện dụng.
Vụ kiện của Quỹ Monica

1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])đưa raout = {1 2}
Luis Mendo

5

Perl 6, 80 byte

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

Hãy chia câu trả lời thành hai phần ...

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

givenlà một tuyên bố kiểm soát (như ifhoặc for). Trong Perl 6, chúng được cho phép như hậu tố. ( a if 1hoặc thích ở đây, foo given 3). givenđặt chủ đề của nó (phía bên phải) vào biến đặc biệt $_cho phía bên trái của nó.

Bản thân "chủ đề" chữ thường ( lc), phân tách bằng từ ( words), đặt các giá trị vào một Túi (được đặt với số lần xuất hiện), sau đó sắp xếp theo giá trị (DESC). Vì sortchỉ biết cách vận hành trên các danh sách, nên Bagnó được chuyển thành một Listtrong số Pairđó ở đây.

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

một điều kiện đơn giản ( ?? !!được sử dụng trong Perl 6, thay vì ? :).

$_ > 1

Chỉ cần kiểm tra rằng danh sách có nhiều hơn một yếu tố.

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

Truy cập $_có thể được rút ngắn ... Bằng cách không chỉ định biến. .alà chính xác như thế $_.a. Vì vậy, đây thực sự là "làm cả hai yếu tố hàng đầu có cùng số lần xuất hiện" - Nếu vậy, chúng tôi sẽ in '' (chuỗi trống).

Mặt khác, chúng tôi in khóa của phần tử trên cùng (số đếm) : .[0].key.


7
Nó giống như một nửa tiếng Anh, một nửa tiếng ồn. Kinh ngạc.
con mèo

1
đó thật buồn cười như thế nào đó là tính năng OO kiểu trông tiếng Anh-y: P
Ven

2
Cũng quản lý được ít dễ đọc hơn Perl 5 trong khi chứa nhiều tiếng Anh hơn Perl 5. D:
mèo

1
@cat đã sửa nó - bây giờ hoàn toàn không thể đọc được
Ven

5
value??!!(tôi biết đó là một nhà điều hành ternary, nó chỉ mang tính giải trí)
mèo


4

JavaScript (ES6), 155 byte

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)

Dựa trên câu trả lời Python của @ Blue.


Thay thế regex của bạn trông giống như nó giảm số và sẽ phá vỡ trường hợp kiểm tra IPv6, đúng không?
TessellatingHeckler

@TessellatingHeckler Định nghĩa của từ đã thay đổi kể từ khi tôi đọc câu hỏi ban đầu, nhưng tôi đã cập nhật câu trả lời của mình ngay bây giờ.
Neil

4

Python 3.5, 142 137 134 112 117 110 127 byte:

( +17 byte, vì rõ ràng ngay cả khi có các từ thường xuyên hơn các từ còn lại, nhưng chúng có cùng tần số, vẫn không có gì phải trả về. )

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)]

Nên bây giờ thỏa mãn mọi điều kiện. Trình này giả định rằng ít nhất 1 từ là đầu vào.

Dùng thử trực tuyến! (Ý)

Ngoài ra, nếu bạn muốn một cái, đây là một phiên bản khác của hàm của tôi không có bất kỳ biểu thức chính quy nào với giá khoảng 43 byte, mặc dù đây là phiên bản không cạnh tranh, vì vậy nó không thực sự quan trọng. Tôi chỉ đặt nó ở đây cho cái quái của nó:

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)]

Hãy thử phiên bản mới trực tuyến này! (Ý)


Từ các bình luận thách thức "nếu có hai từ thường xuyên hơn các từ còn lại, nhưng có cùng tần số", đầu ra là "không có gì".
RootTwo

@RootTwo Đã sửa! :)
R. Kap

@TessellatingHeckler Đó là những từ khác nhau. That'slà một cơn co thắt that istrong khi thatsthực sự không phải là một từ.
R. Kap

@TessellatingHeckler Bạn có thể cho tôi một số bằng chứng về nhận xét này? Bởi vì tôi đang xem qua tất cả các bình luận trên bài đăng và không thấy bình luận nào như vậy.
R. Kap

4

Hồng ngọc 94 92 102 byte

Phải đi nhanh (câu trả lời FGITW). Trả về từ trong tất cả chữ hoa hoặc nilnếu không có từ thường xuyên nhất.

Bây giờ cập nhật thông số kỹ thuật mới, tôi nghĩ. Tuy nhiên, tôi đã cố gắng đánh golf xuống một chút để số byte là như nhau!

->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?
con mèo

@cat yeah, 'vì tôi là FGITW lần này
Ink Ink


3

JavaScript (ES6), 99 byte

F=s=>(f={},w=c='',s.toLowerCase().replace(/[\w-']+/g,m=>(f[m]=o=++f[m]||1)-c?o>c?(w=m,c=o):0:w=''),w)
#input { width: 100%; }
<textarea id="input" oninput="output.innerHTML=F(this.value)"></textarea>
<div id="output"></div>


3

Sqlserver 2008, 250 byte

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

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

Sqlserver 2016, 174 byte

Không thể xử lý dữ liệu như ví dụ này (tính bằng 3 từ):

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

Tôi không thích cách tiếp cận biến vì nó là loại gian lận :) Một đầu vào -> không có gì hoặc một cái gì đó, với cách tiếp cận dựa trên tập hợp, nó phải dài hơn, bởi vì bạn cần thêm bổ sung GROUP BY, LEFT JOIN, or PARTITION BYAnyway SQL Server đã tích hợp chức năng SPLIT. Bản demo Ungolfed cảm thấy tự do để làm cho nó càng ngắn càng tốt.
lad2025

@ lad2025 cảm ơn rất nhiều, không biết bất kỳ tính năng nào từ năm 2016. SPLIT_STRING chắc chắn là một tính năng quá hạn. Tôi đã cố gắng giảm kịch bản bằng cách sử dụng phần tách, giảm xuống còn 174, tuy nhiên nó sẽ không thể lọc văn bản như "= = ="
t-clausen.dk

3

PostgreSQL, 246 , 245 byte

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  

Đầu ra:

nhập mô tả hình ảnh ở đây

Đầu vào nếu có ai quan tâm:

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');


Thông thường tôi sẽ sử dụng MODE() WITHIN GROUP(...)và nó sẽ ngắn hơn nhiều, nhưng nó sẽ vi phạm:

Nếu không có từ thường xuyên nhất (xem trường hợp thử nghiệm # 3), chương trình của bạn sẽ không xuất ra gì.


CHỈNH SỬA:

Xử lý ':

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

Đầu ra:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              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            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝

không thể có được mức thấp như bạn, sqlserver chưa được xây dựng tách ra. Tuy nhiên, phần chọn ngắn hơn.
t-clausen.dk

@GeorgeGibson Chắc chắn, đã sửa + thêm bản demo trực tiếp.
lad2025

@ lad2025 Theo thỏa thuận chung trong trò chuyện, những gì bạn đã làm không còn cần thiết nữa, vui lòng hoàn nguyên lại.
George Gibson

@GeorgeGibson Yup, chỉnh sửa sẽ rõ ràng hơn nhiều. Bản demo trực tiếp đang hoạt động, khi tôi viết câu trả lời sqlfiddle không phản hồi.
lad2025

2

R, 115 byte

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

Đây là một hàm chấp nhận một chuỗi và trả về một chuỗi nếu một từ đơn xuất hiện thường xuyên hơn các chuỗi NULLkhác. Để gọi nó, gán nó cho một biến.

Ung dung:

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

Võng mạc, 97 byte

Các quy tắc tiếp tục thay đổi ...

T`L`l
[^-\w ]

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

!`[-\w]+$

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

Bộ thử nghiệm.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Cảm ơn, đã sửa.
Rò rỉ Nun

1
Và bạn đã đánh gôn nó 11 byte ._. ấn tượng
Conor O'Brien

Cũng thất bại cho "Người đàn ông lỗi thời ăn một chiếc bánh kiểu cũ".
t-clausen.dk

Điều này cũng không đúng (hy vọng alà từ phổ biến nhất ở đó)
TessellatingHeckler

2

Python, 132 byte

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]

Mã ở trên giả định rằng đầu vào có ít nhất hai từ.


Phải yêu regex đó, tho.
Màu xanh

Điều này là không chính xác. Lớp nhân vật \wbao gồm dấu gạch dưới.
mbomb007

1

PHP, 223 byte

$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 byte

Giả sử hơn 2 từ. Thoát khỏi dấu chấm câu đã phá hủy tôi ...

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''

Liệu dải này ',-vv?
Tim

@Tim Không, tôi đã thực hiện thử thách này trước khi các quy tắc được bổ sung đầy đủ. Sẽ thay đổi.
Màu xanh

Bạn có thể gán kết quả của sortedmột tuple thay vì phải lập chỉ mục vào mảng bằng tay không?
Neil

@Neil bạn có nghĩa là chỉ cần lấy các mục đầu tiên và thứ hai để so sánh thay vì toàn bộ mảng? Tôi không biết làm thế nào để làm điều đó
Blue

1

Matlab (225)

  • Quy tắc 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
  • Hộp công cụ là cần thiết để chạy này.

  • Cách thức hoạt động của nó, một trong những đặc quyền tốt nhất của regex thay thế trong matlab, nó thực thi mã thông báo bằng cách gọi các hàm môi trường bên ngoài được tham số hóa bởi các mã thông báo bị bắt trong môi trường bên trong, do đó, bất kỳ chuỗi nào "Word_A Word_B .."được thay thế bằng số nguyên "A0 A1 A2 B0 B1 B2 ..."trong đó số nguyên đầu tiên là chữ ký số ascii của từ, thứ hai là chỉ mục bắt đầu, thứ ba là chỉ mục kết thúc, hai số nguyên cuối cùng này không lặp lại trong toàn bộ chuỗi vì vậy tôi đã tận dụng lợi thế này để chuyển nó sang một mảng, sau đó chế độ nó sau đó tìm kiếm dẫn đến mảng đó, do đó các chỉ số bắt đầu / kết thúc sẽ theo sau.

  • Chỉnh sửa: sau khi thay đổi một số chi tiết, chương trình được gọi là hàm bởi một tham số chuỗi.


20 byte được lưu nhờ vào @StewieGriffin, 30 byte thêm lời trách móc vào các lỗ hổng được thống nhất chung.


Bạn sẽ có upvote của tôi khi bạn (hoặc ai đó) cho thấy rằng điều này thực sự hoạt động, cả cho các đầu vào có một từ phổ biến nhất và cho các đầu vào không. =) (Tôi không thể kiểm tra nó, thật không may)
Stewie Griffin

@StewieGriffin tôi nghĩ rằng những hành vi sai trái với những câu có từ thường xuyên tôi sẽ sửa nó
Abr001am

1

05AB1E , 22 21 20 byte

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

Giải trình:

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

Lưu ý: Nếu bạn ổn với các dòng mới ở đầu ra khi bạn không cần phải xuất bất cứ thứ gì, hãy xóa ? phần cuối để lưu một byte.

Lưu ý 2: Chương trình sẽ không hoạt động với một từ duy nhất, nhưng tôi nghi ngờ đây sẽ là một vấn đề. Nếu bạn muốn sửa lỗi này, hãy thay thế# bằng ð¡một byte thừa.

05AB1E sử dụng CP-1252 làm bộ ký tự, không phải UTF-8.

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


1

Perl, 60 56 55 54 byte

Bao gồm +3 cho -p

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

Nếu một từ không thể chỉ là một số, bạn cũng có thể bỏ asố điểm 53.


Có gạch nối trong -anEkhông được tính? Nó thực hiện trên câu trả lời khác (+2 byte cho -pcờ) ...
George Gibson

@GeorgeGibson Không, xem meta.codegolf.stackexchange.com/questions/273/ . Dấu gạch nối, dấu cách và Ekhông được tính. Câu trả lời khác thông thường sẽ chỉ phải thực hiện +1 byte cho -p, nhưng giải pháp của anh ta có 'vì vậy nó không thể được xem như là một phần mở rộng của -ehoặc -E. Vì vậy, trên thực tế anh ta nên đếm +3 (không phải +2) vì anh ta nên đếm khoảng trắng và dấu gạch nối (nhưng mọi tùy chọn bổ sung sẽ chỉ là +1).
TonMedel

@TomH rửa ơi, đúng rồi.
George Gibson

Đây có được coi là hợp lệ cho quy tắc dấu nháy đơn? [\pL\d-]có vẻ như nó có thể được thu nhỏ lại [\w-](trừ khi chúng tôi quan tâm đến dấu gạch dưới) nhưng một trong hai phiên bản sẽ báo cáo thatthay vì that'shoặc thatsđể kiểm tra 4. Nếu không, bạn cần thêm 4 byte để chèn \x27vào lớp ký tự đó (trừ khi bạn có cách thêm tốt hơn một dấu nháy đơn).
Adam Katz

@AdamKatz Định nghĩa của 'từ' đã thay đổi khá nhiều trong khi điều này đang chạy và tôi chưa bao giờ hoàn toàn chấp nhận phiên bản cuối cùng. Nhưng để giữ cho bạn hạnh phúc, tôi đã tạo một phiên bản cố định (và ngắn hơn) :-). Và vâng, tôi quan tâm đến
quần lót

0

PowerShell (v4), 117 byte

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

Phần đầu tiên là đủ dễ dàng:

  • $input là ~ = stdin
  • Regex thay thế các ký tự không liên quan bằng không có gì, giữ các dòng mới để chúng tôi không trộn lẫn hai từ từ cuối dòng và bắt đầu dòng tiếp theo thành một lỗi. (Không ai khác đã thảo luận về nhiều dòng, có thể chơi golf -2 nếu đầu vào luôn là một dòng).
  • Regex split, Grouptheo tần số (~ = Bộ sưu tập của Python. Bộ đếm),Sort để đặt các từ thường xuyên nhất ở cuối.
  • PowerShell không phân biệt chữ hoa chữ thường theo mặc định cho mọi thứ.

Xử lý nếu không có từ thường xuyên nhất:

  • Lấy hai mục cuối [-2, -1] thành $ y và $ z;
  • một danh sách N mục, trong đó N> = 2, tạo ra $ y và $ z hai mục cuối
  • danh sách 1 mục làm cho $ y là mục cuối cùng và $ z null
  • một danh sách trống làm cho cả hai đều rỗng

Sử dụng golf bool-as-Array-index fake-ternary-index (0,1)[truthyvalue], được lồng, để chọn "", $ z hoặc $ y làm đầu ra, sau đó lấy .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 byte

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
Nữ tu bị rò rỉ

if m==v then o=''end->o=m==v and '' or o
Nữ tu bị rò rỉ

0

Perl 5, 96 92 84 + 2 ( -pcờ) = 86 byte

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

Sử dụng:

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

-pCờ của bạn sẽ gọi một hình phạt là 3 byte. Các quy tắc đại khái: Mỗi cờ dòng lệnh là 1 byte vì đó là số lượng byte bạn cần để mở rộng -e'code'dòng lệnh kiểu tự do của bạn . Vì vậy, thông thường -pchỉ là 1 byte. Nhưng ở đây mã của bạn có 'để nó không thể chạy đơn giản từ dòng lệnh mà không thoát. Vì vậy, không có sự kết hợp với -e-không gian trước đó plà thêm và cũng phải được tính
TonMedel

@TonHeach Đã sửa.
Denis Ibaev

Đây thực sự là 84 + 1 ( -pcờ) nếu bạn gọi nó trên dòng lệnh dưới dạng perl -pe'…'(được tạo sẵn bằng cách xóa 'như đã lưu ý trong các nhận xét đầu tiên)
Adam Katz

0

Python, 158 byte

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())]

Đưa đầu vào của nó như thế này:

g("Bird is the word")

Nên phù hợp với tất cả các yêu cầu, mặc dù nó không thành công trên các chuỗi trống, có cần thiết phải kiểm tra các yêu cầu đó không? Xin lỗi về sự chậm trễ.

Lời khuyên / phản hồi / mẹo ma thuật đen để lưu byte luôn được chào đón


Xin chào, và chào mừng đến với PPCG! Chúng tôi chấm điểm các thử thách chơi gôn bằng số byte trong câu trả lời. Tôi đã đi trước và chỉnh sửa nó cho bạn với thông tin chính xác.
Rɪᴋᴇʀ

2
Chào mừng đến với PPCG! Thật không may, bài nộp của bạn không đáp ứng tất cả các yêu cầu của thử thách này, trước hết, đó KHÔNG phải là trường hợp không nhạy cảm. Chẳng hạn, nó sẽ KHÔNG tính số lần xuất hiện của từ Thatlà lần xuất hiện của từ thatvì cái trước bắt đầu bằng chữ hoa Tvà cái sau bắt đầu bằng chữ thường t. Ngoài ra, điều này KHÔNG loại bỏ tất cả các hình thức chấm câu khác ngoại trừ dấu gạch ngang ( -) và, tùy ý, dấu nháy đơn ( ') và kết quả là, điều này sẽ KHÔNG hoạt động cho trường hợp thử nghiệm thứ tư được đưa ra trong câu hỏi.
R. Kap

1
Ngoài ra, điều này KHÔNG tạo ra gì nếu không có từ thường xuyên nhất. Chẳng hạn, sử dụng trường hợp thử nghiệm thứ ba ( This sentence has no most frequent word.) làm ví dụ, hàm của bạn xuất ra [('This', 1)], khi đó nó sẽ không xuất ra gì cả. Tôi có thể tiếp tục và về nhiều vấn đề hơn, vì vậy tôi khuyên bạn nên sửa chúng ngay khi bạn có thể.
R. Kap

Sẽ sớm thôi, khi tôi có thời gian
Bạn sẽ không muốn biết

Điều này là không chính xác. Lớp nhân vật \wbao gồm dấu gạch dưới.
mbomb007

0

Tcl 8.6, 196 byte

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]"

(Than ôi, tôi không thể tìm ra làm thế nào để có được nó nhỏ hơn thế nữa ...)

Giải trình

Nó sử dụng một số thành ngữ Tcl tối nghĩa để làm công cụ.

  • [join [read stdin] " "] - chuỗi đầu vào → danh sách các từ được phân tách bằng khoảng trắng
  • lmap ... - lặp đi lặp lại trên mọi yếu tố của danh sách đó. (Ngắn hơnforeach và hiệu quả giống hệt nhau do kết quả bị loại bỏ.)
  • [regsub ... [string tolower ...]] - Chuyển đổi chuỗi thành chữ thường và tước tất cả các ký tự ngoại trừ các ký tự từ và dấu gạch nối.
  • [dict incr d ...] - Tạo / sửa đổi một từ điển / từ → đếm biểu đồ.
  • set y ... - Sắp xếp các giá trị từ điển, lấy giá trị lớn nhất và trả về tất cả các cặp (khóa, giá trị) tương ứng với nó.
  • if... - Phải có chính xác hai yếu tố: một cặp (khóa, giá trị), nếu không thì không có gì để in.
  • puts... - In khóa trong cặp giá trị khóa, nếu có. (Không có từ nào có khoảng trắng.)

Bạn có thể chơi với nó bằng CodeChef .



0

Rexx, 109 128 122 byte

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

Khá in ...

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

Tôi không nghĩ rằng điều này xử lý tất cả các trường hợp gắn từ thường xuyên nhất - xem (mới) trường hợp kiểm tra cuối cùng - tôi đã mắc lỗi tương tự.
philcolbourn

Hy vọng rằng, điều đó đã được sửa ngay bây giờ
aja

0

bash, 153 146 131 154 149 137 byte

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

Hoạt động:

khai báo một mảng kết hợp F của các số nguyên (khai báo -iA F)

f là một hàm, với tham số từ $ 1, tăng tần số đếm cho từ này (T = ++ F [$ 1]) và so sánh với số lượng tối đa cho đến nay (M).

Nếu bằng nhau, chúng ta có một cà vạt vì vậy chúng ta sẽ không coi từ này là thường xuyên nhất (I =)

Nếu lớn hơn số lượng tối đa cho đến nay (M), thì hãy đặt số lượng tối đa cho đến nay là tần số của từ này (M = $ T) và ghi nhớ từ này (I = $ 1)

Kết thúc chức năng f

Đọc một dòng (đọc L) Tạo chữ thường (L = $ {L ,,}) Xóa bất kỳ ký tự nào ngoại trừ az, 0-9, dash (-) và dấu cách (L = $ {L // [^ - a-z0- 9]}) Tạo một chuỗi các câu lệnh bash gọi f cho mỗi từ (printf -vA "f% s;" $ L). Điều này được lưu vào biến A. eval A và kết quả in (eval $ a; echo $ I)

Đầu ra:

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: CỐ ĐỊNH Tôi có một lỗi không được tiết lộ trong các trường hợp thử nghiệm này. Nếu đầu vào là

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

sau đó mã của tôi sẽ không xuất ra gì.

Tôi có một bản sửa lỗi nhưng dường như tôi đã gặp phải lỗi bash ... Tôi nhận được hành vi rất kỳ quặc là M không được khai báo là số nguyên: ++ F [$ 1] == M (sau một vài từ lặp lại) tăng cả F [$ 1 ] và M!! - lỗi của tôi.


0

Python 3, 76 98 100 byte

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

Dùng thử trực tuyến

Xuất ra từ phổ biến nhất là chữ thường. Không bao gồm dấu nháy đơn vì "dấu nháy đơn không bắt buộc phải được đưa vào."

statistics.mode yêu cầu Python 3,4

Thật không may, không có đầu ra nào stderrđược cho phép, hoặc nó sẽ ngắn hơn nhiều.


Bạn không được phép in STDERR, trừ khi chương trình này không tạo ra bất kỳ lỗi đầu ra nào?
Okx

Chương trình mới của bạn không hỗ trợ dấu gạch nối! Tôi đã thử đầu vàoi- test i-
Okx

Đã sửa tất cả. Vẫn ngắn.
mbomb007

0

R, 96 byte

19 byte ngắn hơn câu trả lời R hiện có , với cách tiếp cận hơi khác.

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

Đọc từ stdin, vì vậy đầu vào được tự động phân tách bằng dấu cách. Chúng tôi chuyển đổi thành chữ thường và sử dụng gsubđể loại bỏ tất cả các chữ và số (cộng -'). Chúng tôi đếm các trường hợp của từng từ tablevà lưu kết quả vào t. Tiếp theo, chúng tôi kiểm tra xem có nhiều hơn 1 tối đa hay không t(bằng cách xem có nhiều hơn một phần tử bằng không max(t). Nếu vậy, chúng tôi trả về chuỗi trống ''. Nếu không, chúng tôi trả về từ tương ứng với tối đa trong t.

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.