最もよく使われる言葉は何ですか?


26

最もよく使われる言葉は何ですか?

文が与えられると、プログラムはそれを通り抜け、各単語の頻度をカウントしてから、最も使用されている単語を出力する必要があります。文には固定長がないため、非常に長くなる可能性があるため、コードはできるだけ短くする必要があります。

ルール/要件

  • 各提出は、完全なプログラムまたは機能である必要があります。関数である場合、プログラムの下部に関数呼び出しを追加するだけで実行可能でなければなりません。他のもの(Cのヘッダーなど)を含める必要があります。
  • ご使用の言語に対応した無料のインタープリター/コンパイラーが必要です。
  • 可能であれば、プログラムをテストできるサイトへのリンクを提供します。
  • プログラムはに何も書き込まないでくださいSTDERR
  • あなたのプログラムはSTDIN(またはあなたの言語で最も近い代替物)から入力を受け取るべきです。
  • 標準的な抜け穴は禁止されています。
  • プログラムは大文字と小文字を区別しない必要があります(tHeTheおよび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.
==>

注:3番目と7番目のテストケースには出力がありません。4番目のいずれかを選択できます。

得点

プログラムは、バイトに従ってスコア付けされます。通常の文字セットはUTF-8です。別の文字セットを使用している場合は指定してください。

チャレンジが終了すると、最小バイト(と呼ばれる)のプログラムが勝ちます。

提出

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。


2
コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ドアノブ

1
「単語」の新しい定義を考えると、ここで最も一般的な単語はdon't d'ont dont a a何ですか?そうでしょうdontか?
DJMcMayhem

@DrGreenEg​​gsandHamDJアポストロフィを削除するサブミッションがある場合、dont。そうでない場合、a。しかし、ほとんどの提出物はそうでdontあり、正解です。
ジョージギブソン

1
出力では大文字と小文字が区別されますか?ではipv6、最後のテストケースの有効な出力はありますか?
kirbyfan64sos

1
追加のテストケースが役立つ場合があります。「単語を含むこの文には、最大で2つの等しい最頻出単語があります。」-> <なし>
philcolbourn

回答:


6

パイク、26 25バイト

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

ここで試してみてください!

または23 22バイト(非競合、falseの場合にスタックを強制終了するノードを追加)

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]

保持される句読点が-and '(ハイフンとアポストロフィ)のみである場合、23バイトの回答は競合します。
ジョージギブソン

単語の末尾にない句読点のみが保持されます
ブルー

ああ、わかりました(パイクがわかりません)。私は...それはその後、競合推測
ジョージ・ギブソン

1
@GeorgeGibson 23バイトバージョンは競合しないと確信しています。標準的な抜け穴に陥る可能性があります。また、私は(m)誰もがPykeを理解することを期待していません。私はそれを自分の言語として作成しています
-Blue

じゃあ とにかくあなたはまだ勝つと思うので、それは本当に重要ではありません。
ジョージギブソン


11

パイス-23 30バイト

数字とハイフンを含めるにはより良い方法が必要ですが、今すぐ修正したいだけです。

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

テストスイート


1
改訂された規則では、数字とハイフンを保持する必要があります。
デニス

@GeorgeGibsonが修正されました。
マルティセン

6

オクターブ、115 94バイト

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

を使用して、最も頻出する単語がないケースを説明しtryます。この場合、何も出力せず、例外をキャッチするまで「休憩します」。

Luis Mendoの提案のおかげで21(!)バイトを節約しました(3番目の出力を使用しmodeて最も一般的な単語を取得します)。


元の回答を投稿してから、ルールはかなり変更されました。後で正規表現を調べます。


1
あなたは私にそれを打ち負かし、今何か他のものを考えます。
-Abr001am

たぶん応募modecますか?3番目の出力は、正しく思い出せば、すべてのタイ値を提供します
ルイスメンドー

115バイトをカウントします。
コナーオブライエン

['\w\d]アポストロフィと数字を保持する必要があるため、正規表現はそうあるべきだと思います。ASCIIで大文字と小文字の間にある場合を除き、その場合はテーブルが手元にないので無視してください。
ファンドモニカの訴訟

1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])が与えるout = {1 2}
ルイスメンドー

5

Perl 6、80バイト

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

答えを2つの部分に分けましょう...

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

given制御ステートメント(ifまたはなどfor)です。Perl 6では、後置として許可されています。(a if 1、またはここのようにfoo given 3)。givenトピック(右側)を特殊変数に入れます$_左側の。

「トピック」自体は小文字(lc)で分割され、単語()で分割されwords、値をBag(発生回数で設定)に入れてから、値でソート(DESC)されます。以来sortのみのリストを操作する方法を知っている、Bagに変換されるListPair、ここでS。

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

単純な条件付き(?? !!Perl 6ではの代わりに使用され? :ます)。

$_ > 1

リストに複数の要素があることを確認するだけです。

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

へのアクセス$_は短縮できます...変数を指定しないことにより。.aはまさにのようなもの$_.aです。したがって、これは事実上「両方の最上位要素の出現回数が同じである」ことです。そうであれば、 ''(空の文字列)を出力します。

それ以外の場合は、最上位要素のキー(カウント)を出力します.[0].key


7
半分の英語、半分のラインノイズのようなものです。すごい。

1
英語のように見えるオブジェクト指向スタイルの機能がどのように面白いか:P
Ven

2
また、Perl 5よりも英語が多く含まれている一方で、Perl 5よりも読みにくくなっています。D:
cat

1
今は全く読めなくする必要があります- @catは、それが固定
ヴェン

5
value??!!(私はそれだけで楽しまだ、それは三項演算子を知っている)


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)

@BlueのPythonの回答に基づいています。


あなたの正規表現の置換は数字を落とすように見え、IPv6テストケースを壊します、そうですか?
TessellatingHeckler

@TessellatingHeckler定義言葉は、私はもともと質問を読んでいるので変更しましたが、私は今、私の答えを更新しました。
ニール

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つの単語が入力されていることを前提としています。

オンラインでお試しください!(イデオン)

また、必要な場合は、約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)]

この新しいバージョンをオンラインでお試しください!(イデオン)


「残りよりも頻繁にあるが同じ頻度の2つの単語がある場合」のチャレンジコメントから、出力は「何もありません」です。
-RootTwo

@RootTwo修正済み!:)
R. Kap

@TessellatingHecklerしかし、これらは異なる言葉です。That's以下のための収縮であるthat isのに対し、thats本当に言葉ではありません。
R. Kap

@TessellatingHecklerこのコメントの証拠を教えていただけますか?投稿に対するすべてのコメントを調べているので、そのようなコメントは表示されないからです。
R.ガプス

4

ルビー、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、私はFGITWこの時間」だったcuzを
バリューインク


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

私は変数アプローチが好きではありません。それは一種の不正行為です:)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チャットでの一般的な合意により、あなたがしたことはもはや必要ではなくなりました。
ジョージギブソン

@GeorgeGibsonうん、編集は非常に明確になります。私が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

これは、文字列を受け入れ、1つの単語が他の単語よりも頻繁に出現する場合に文字列を返し、 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ʀɪᴇɴありがとう、修正。
漏れの修道女

1
そして、あなたはそれを11バイトゴルフしました._。印象的
コナーオブライエン

また、「昔ながらの男が昔ながらのケーキを食べた」ために失敗します。
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]

上記のコードでは、入力に少なくとも2つの単語があると想定しています。


その正規表現を愛するようになった、カントー。
ブルー

これは間違っています。文字クラスに\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バイト

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

このストリップ',-など?
ティム

@ティムいいえ、私はルールが完全に具体化される前にこの挑戦をしました。変更されます。
ブルー

sorted配列のインデックスを手動で作成するのではなく、結果をタプルに割り当てることはできますか?
ニール

@Neilは、配列全体ではなく、比較のために最初と2番目のアイテムを取得するだけですか?その方法がわからない
ブルー

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
  • これを実行するにはツールボックスが必要です。

  • これはどのように機能しますか?正規表現の最も優れた特権の1つは、内部環境でキャッチされたトークンによってパラメーター化された外部環境関数を呼び出すことでトークンをフィールド実行します。そのため、シーケンスはすべて、最初の整数が"Word_A Word_B .."整数"A0 A1 A2 B0 B1 B2 ..."で置き換えられます単語の数値アスキー署名、2番目は開始インデックス、3番目は終了インデックス、これらの最後の2つの整数はシーケンス全体で重複しないので、この利点を利用して配列に転置し、それから モードを検索します結果としてその配列になるため、結果として開始/終了インデックスが続きます。

  • 編集:詳細を変更した後、プログラムは文字列パラメーターによって関数と呼ばれます。


@StewieGriffinのおかげで20バイトが節約され、30バイトが一般的な合意の抜け穴に非難を加えました。


あなた(または他の誰か)が、これが実際に機能することを示すとき、最も一般的な単語を持つ入力とそうでない入力の両方に対して、私の賛成票を持っています。=)(私は残念ながら、それをテストすることはできません)
Stewieグリフィン

@StewieGriffin私は、プログラムが等頻度の単語を含む文で誤動作すると思います。それを修正します
Abr001am

1

05AB1E22 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:プログラムは1つの単語では機能しませんが、これが問題になるとは思いません。あなたはこれを修正したい場合は、交換する#ð¡、余分なバイトのために。

05AB1Eは、UTF-8ではなくCP-1252を文字セットとして使用します。

オンラインでお試しください!


1

Perl、60 56 55 54バイト

+3を含む -p

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

単語が単なる数字にならない場合はa、53のスコアでドロップすることもできます。


のハイフン-anEはカウントされませんか?これは、他の回答(のための2バイトで行い-p旗)...
ジョージ・ギブソン

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