가장 빈번한 단어는 무엇입니까?


26

가장 빈번한 단어는 무엇입니까?

문장이 주어지면 프로그램은 각 단어의 빈도를 세어 가장 많이 사용되는 단어를 출력해야합니다. 문장의 길이는 고정되어 있지 않으므로 매우 길어질 수 있으므로 코드는 가능한 짧아야합니다.

규칙 / 요구 사항

  • 각 제출물은 전체 프로그램 또는 기능이어야합니다. 함수 인 경우 프로그램 맨 아래에 함수 호출을 추가하기 만하면 실행 가능해야합니다. 다른 것 (예 : C의 헤더)이 포함되어야합니다.
  • 귀하의 언어에 맞는 무료 통역사 / 컴파일러가 있어야합니다.
  • 가능하면 프로그램을 테스트 할 수있는 사이트에 대한 링크를 제공하십시오.
  • 프로그램은에 아무 것도 쓰지 않아야합니다 STDERR.
  • 귀하의 프로그램은 STDIN(또는 귀하의 언어로 가장 가까운 대안으로) 의견을 수렴해야합니다 .
  • 표준 허점 은 금지되어 있습니다.
  • 여러분의 프로그램은 대소 문자를 구분해야합니다 ( tHe, The그리고 the모두의 수에 포함 the).
  • 가장 빈번한 단어가 없으면 (테스트 사례 # 3 참조) 프로그램이 아무 것도 출력하지 않아야합니다.

'단어'의 정의 :

입력 텍스트를 공백으로 분할하여 단어 목록을 얻습니다. 입력에는 일반 공백 이외의 다른 유형의 공백이 포함되지 않습니다 (특히 줄 바꿈 없음). 그러나 마지막 단어는 영숫자 (az, AZ, 0-9), 하이픈 (-) 및 아포스트로피 ( ') 만 포함해야합니다. 단어 분리를 수행하기 전에 다른 모든 문자를 제거하거나 공백으로 바꾸면됩니다. 이전 버전의 규칙과 호환되도록 아포스트로피를 포함 할 필요는 없습니다.

테스트 사례

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입니다. 다른 문자를 사용하는 경우 지정하십시오.

챌린지가 끝나면 가장 적은 바이트를 가진 프로그램 ( 라고 함 )이 이길 것입니다.

제출물

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# 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

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.


2
의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Doorknob

1
따라서 'word'에 대한 새로운 정의가 주어지면 여기에서 가장 일반적인 단어는 무엇 don't d'ont dont a a입니까? 그럴까요 dont?
DJMcMayhem

@DrGreenEggsandHamDJ 아포스트로피를 제거하는 제출이있는 경우 dont. 그렇지 않은 경우 a. 그러나 대부분의 제출물이 dont그러하며 정답입니다.
George Gibson

1
출력은 대소 문자를 구분합니까? 그래서입니다 ipv6마지막 테스트 케이스에 대한 유효 출력은?
kirbyfan64sos

1
여분의 테스트 사례가 사용될 수 있습니다. "단어가 포함 된이 문장에는 최대 두 개의 동일한 빈번한 단어가 있습니다." -> <아무것도>
Philcolbourn

답변:


6

파이크, 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

오, 그래요 (파이크를 이해하지 못합니다). 그때 경쟁이 될 것 같습니다 ...
조지 깁슨

1
@GeorgeGibson 23 바이트 버전이 경쟁하지 않을 것이라고 확신합니다. 표준 허점에 빠질 수 있습니다. 또한 나는 어떤 사람들도 파이크를 이해하기를 기대하지 않는다. 나는 그것을 나의 언어로 만들고있다
Blue

좋아, 그럼. 어쨌든 당신은 여전히 ​​이길 것이라고 생각합니다. 그래서 그것은 중요하지 않습니다.
조지 깁슨


11

Pyth- 23 30 바이트

숫자와 하이픈을 포함시키는 더 좋은 방법이 있어야하지만 지금 바로이 문제를 해결하고 싶습니다.

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

테스트 스위트 .


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합니다. 이 경우 아무 것도 출력하지 않으며 예외를 잡을 때까지 "휴식을 취합니다".

Luis Mendo의 제안 덕분에 21 (!) 바이트가 절약되었습니다 ( mode가장 일반적인 단어를 얻기 위해의 세 번째 출력 사용 ).


원래 답변을 게시 한 이후 규칙이 약간 변경되었습니다. 나중에 정규식을 살펴 보겠습니다.


1
당신은 저를 때리고 지금 다른 것을 생각할 것입니다.
Abr001am

적용 modec어쩌면? 올바르게 기억한다면 세 번째 출력은 모든 묶인 값을 제공합니다.
Luis Mendo

115 바이트를 셉니다.
코너 오브라이언

나는 정규 표현식이 ['\w\d]아포스트로피와 숫자를 보존 해야 하기 때문에 있어야한다고 생각합니다 . 그것들이 ASCII에서 대문자와 소문자 사이에 있지 않으면, 편리한 테이블이 없기 때문에 나를 무시하십시오.
기금 모니카의 소송

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

5

펄 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에서는 접미사로 허용됩니다. ( a if 1또는 여기와 같이 foo given 3). given주제 (오른쪽)를 $_왼쪽 의 특수 변수 에 넣습니다 .

"주제"자체는 소문자 ( lc), 단어 ( words)로 나누고 값을 백에 넣고 (발생 횟수로 설정) 값 (DESC)으로 정렬합니다. 이후 sort에만이 목록에서 작동하는 방법을 알고는이 Bag로 변환 ListPair여기의.

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

간단한 조건부 ( ?? !!대신 Perl 6에서 사용됨 ? :).

$_ > 1

목록에 둘 이상의 요소가 있는지 확인하십시오.

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

$_변수를 지정하지 않으면 액세스 시간을 단축 할 수 있습니다. .a정확히 같습니다 $_.a. 따라서 이것은 효과적으로 "상단 두 요소가 같은 수의 발생을 갖는가"입니다 – 그렇다면, 우리는 ''(빈 문자열)을 인쇄합니다.

그렇지 않으면 상단 요소의 키 (횟수)를 인쇄합니다 .[0].key.


7
반 영어, 반 라인 노이즈와 같습니다. 놀랄 만한.
고양이

1
영어 -y처럼 보이는 OO 스타일의 기능이 얼마나
재밌는가

2
또한 Perl 5보다 영어를 더 많이 포함시키면서 Perl 5 보다 가독성이 떨어집니다 . D :
cat

1
@cat 고쳤습니다 – 지금 완전히 읽을 수 없습니다
Ven

5
value??!!(나는 그것이 삼항 연산자라는 것을 알고있다, 그것은 단지 재미있다)
cat


4

자바 스크립트 (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)

@Blue의 Python 답변을 기반으로합니다.


정규식 대체는 숫자가 떨어지는 것처럼 보이며 IPv6 테스트 사례를 위반합니다. 맞습니까?
TessellatingHeckler

@TessellatingHeckler 처음에 질문을 읽은 이후 로 단어 의 정의가 바뀌었지만 지금 내 대답을 업데이트했습니다.
Neil

4

파이썬 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)]

이제 모든 조건을 충족해야합니다. 이 제출은 적어도 하나의 단어가 입력되었다고 가정합니다.

온라인으로 사용해보십시오! (아이디어)

또한 하나를 원한다면 약 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)]

이 새 버전을 온라인으로 사용해보십시오! (아이디어)


도전 의견에서 "나머지 단어보다 빈번하지만 빈도가 같은 두 단어가 있다면"출력은 '아무것도 없습니다'.
RootTwo

@RootTwo 고정! :)
R. Kap

@TessellatingHeckler 다른 단어들입니다. That's의 수축입니다 that is반면 thats정말 단어가 아닙니다.
R. Kap

@TessellatingHeckler이 의견에 대한 증거를 제공해 주시겠습니까? 게시물에 대한 모든 의견을 검토하고 해당 의견을 보지 않기 때문입니다.
R. Kap

4

루비, 94 92102 바이트

빨리 가야합니다 (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 yeah, 'cuz 이번에는 FGITW였습니다
Value Ink


3

JavaScript (ES6), 99 바이트

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 바이트

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 2016, 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 BY. Ungolfed 데모 는 가능한 한 짧게 만들 수 있습니다.
lad2025

@ lad2025 감사합니다 .2016 년부터 기능을 몰랐습니다. SPLIT_STRING은 기한이 지난 기능입니다. 그러나 나는 그것을 "= = ="와 같은 텍스트 필터링 할 수 없습니다, (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 Sure, 고정 + 라이브 데모 추가.
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. 호출하려면 변수에 지정하십시오.

언 골프 드 :

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ʀɪᴇɴ 감사합니다.
Leaky Nun

1
그리고 당신은 그것을 11 바이트 골프했습니다 ._. 인상적
Conor O'Brien

"구식 인이 구식 케이크를 먹었다"도 실패합니다.
t-clausen.dk

이것도 옳게 보이지 않습니다 ( a가장 일반적인 단어 일 것으로 예상 )
TessellatingHeckler

2

파이썬, 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]

위의 코드는 입력에 적어도 두 단어가 있다고 가정합니다.


그 정규 표현식을 좋아해야합니다.
블루

이것은 올바르지 않습니다. 문자 클래스 \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

파이썬 2, 218 바이트

2 단어 이상을 가정합니다. 구두점을 제거하면 나를 파괴했습니다 ...

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

이 스트립 ',-등입니까?
Tim

@Tim 아니요, 규칙이 완전히 충족되기 전에이 과제를 수행했습니다. 바뀔 것이다.
Blue

sorted배열에 수동으로 색인을 생성하지 않고 튜플에 결과를 할당 할 수 있습니까 ?
Neil

@ Neil 당신은 전체 배열 대신 비교를 위해 첫 번째와 두 번째 항목을 얻는 것을 의미합니까? 어떻게해야할지 모르겠어요
Blue

1

MATLAB (225)

  • 찬성하는 규칙 : /

.

      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
  • 이를 실행하려면 도구 상자가 필요합니다.

  • 의 순서 어떻게이 일, 정규 표현식의 가장 좋은 특권 중 하나는 MATLAB이 IT 분야 - 실행하는 대체됩니까은, 내부 환경에서 잡은 토큰에 의해 파라미터 외부 환경 함수를 호출하여 토큰을 "Word_A Word_B .."정수로 대체가 "A0 A1 A2 B0 B1 B2 ..."첫 번째 정수입니다 단어의 numerica ascii 서명, 두 번째는 시작 색인, 세 번째는 끝 색인,이 마지막 두 정수는 전체 시퀀스에서 중복되지 않으므로이 이점을 사용하여 배열로 바꾼 다음 모드 를 검색합니다. 결과적으로 해당 배열이 만들어 지므로 시작 / 종료 인덱스가 따라옵니다.

  • 편집 : 일부 세부 사항을 변경 한 후 프로그램은 문자열 매개 변수에 의해 함수라고합니다.


@StewieGriffin 덕분에 20 바이트가 절약되었으며, 공통 바이트 허점에 30 바이트가 추가되었습니다.


가장 일반적인 단어를 가진 입력과 그렇지 않은 입력 모두에 대해 실제로 작동한다는 것을 보여 주면 내 의견을 알 수 있습니다. =) (안타깝게도 테스트 할 수 없습니다)
Stewie Griffin

@StewieGriffin 나는 프로그램이 같은 주파수 단어로 문장과 잘못 작동한다고 생각합니다. 내가 고칠 것입니다
Abr001am

1

05AB1E , 22 21 20 바이트

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

설명:

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

참고 : 아무것도 출력하지 않을 때 출력에 줄 바꿈 문자가 있으면 ?, 끝에 줄을 제거하여 바이트를 저장하십시오.

참고 # 2 :이 프로그램은 한 단어로 작동하지 않지만 이것이 문제가 될지 의심됩니다. 이 문제를 해결하려면 교체#ð¡여분의 바이트.

05AB1E는 UTF-8이 아닌 CP-1252를 문자 세트로 사용합니다.

온라인으로 사용해보십시오!


1

펄, 60 56 55 54 바이트

에 +3 포함 -p

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

단어가 숫자가 될 수없는 경우 a53 점으로 떨어 뜨릴 수도 있습니다 .


하이픈이 포함 -anE되지 않습니까? 그것은 다른 답변 ( -p플래그의 경우 + 2 바이트 )에 해당합니다 ...
George Gibson

@GeorgeGibson 아니요, meta.codegolf.stackexchange.com/questions/273/…를 참조하십시오 . 하이픈, 공백 및 E개수는 포함되지 않습니다. 다른 대답은 일반적으로 +1 바이트 만 수행해야 -p하지만 그의 해결책은 또는 '확장으로 볼 수 없습니다 . 따라서 실제로 공백과 하이픈을 계산해야하므로 +3 (+2 아님)을 계산해야합니다 (그러나 모든 추가 옵션은 +1 일 것임). -e-E
Ton Hospel

@TomHospel 아, 맞아.
George Gibson

아포스트로피 규칙을 고려할 때 이것이 유효한 것으로 간주됩니까? 밑줄에 신경 쓰지 않는 한 [\pL\d-]축소 될 수 [\w-]있지만 버전 4 that대신 that's또는 thats테스트 4 로보 고됩니다. 그렇지 않으면 \x27해당 문자 클래스 에 삽입 할 4 바이트를 추가해야합니다 (더 나은 방법을 추가하지 않는 한) 아포스트로피).
Adam Katz

@AdamKatz 'word'의 정의는 이것이 실행되는 동안 상당히 바뀌었고 마지막 버전을 완전히 채택하지 않았습니다. 그러나 당신을 행복하게하기 위해 고정 된 (더 짧은) 버전을 만들었습니다 :-). 그리고 예, 나는 밑줄에 관심이 있습니다
Ton Hospel

0

PowerShell (v4), 117 바이트

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

첫 번째 부분은 충분히 쉽습니다.

  • $input ~ = stdin입니다
  • 정규식은 관련이없는 문자를 아무것도 아닌 것으로 바꾸고 줄 바꿈을 유지하여 한 줄의 끝과 다음 줄의 시작 부분에서 실수로 두 단어를 으 깨지 않습니다. (아무도 여러 줄을 논의한 적이 없으며, 입력이 항상 한 줄이면 골프 -2를 할 수 있습니다).
  • Group빈도별로 정규식 분할 (~ = Python의 컬렉션. 카운터),Sort to put most frequent words at the end.
  • PowerShell은 기본적으로 대소 문자를 구분하지 않습니다.

가장 빈번한 단어가없는 경우 처리 :

  • 마지막 두 항목 [-2, -1]을 $ y 및 $ z로 가져갑니다.
  • N> = 2 인 N- 항목 목록은 $ y와 $ z를 마지막 두 항목으로 만듭니다.
  • 1 항목 목록은 $ y를 마지막 항목으로 만들고 $ z는 null로 만듭니다.
  • 빈 목록은 둘 다 null로 만듭니다.

bool-as-array-index 색인 가짜 삼항 연산자 골프 (0,1)[truthyvalue]를 사용하여 "", $ z 또는 $ 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 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.