Apa kata yang paling sering?

26

Apa kata yang paling sering?

Diberi kalimat, program Anda harus melewatinya, menghitung frekuensi setiap kata, lalu mengeluarkan kata yang paling sering digunakan. Karena kalimat tidak memiliki panjang yang pasti, sehingga bisa sangat panjang, kode Anda harus sesingkat mungkin.

Aturan / Persyaratan

  • Setiap pengajuan harus berupa program atau fungsi lengkap. Jika itu adalah suatu fungsi, itu harus dapat dijalankan dengan hanya perlu menambahkan panggilan fungsi ke bagian bawah program. Hal lain (mis. Tajuk dalam C), harus dimasukkan.
  • Harus ada juru bahasa / kompiler gratis yang tersedia untuk bahasa Anda.
  • Jika memungkinkan, berikan tautan ke situs tempat program Anda dapat diuji.
  • Program Anda tidak boleh menulis apa pun STDERR.
  • Program Anda harus mengambil input dari STDIN(atau alternatif terdekat dalam bahasa Anda).
  • Celah standar dilarang.
  • Program Anda harus peka huruf besar-kecil ( tHe, Thedan thesemua berkontribusi pada hitungan the).
  • Jika tidak ada kata yang paling sering (lihat test case # 3), program Anda seharusnya tidak menghasilkan apa-apa.

Definisi kata ':

Anda mendapatkan daftar kata-kata dengan memisahkan teks input pada spasi. Masukan tidak akan pernah berisi jenis spasi putih selain spasi kosong (khususnya tanpa baris baru). Namun, kata-kata terakhir seharusnya hanya berisi alfanumerik (az, AZ, 0-9), tanda hubung (-) dan apostrof ('). Anda dapat melakukannya dengan menghapus semua karakter lain atau dengan menggantinya dengan spasi sebelum melakukan pemisahan kata. Agar tetap kompatibel dengan versi aturan sebelumnya, apostrof tidak perlu dimasukkan.

Uji Kasus

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

Catatan: Kasus uji ketiga dan ketujuh tidak memiliki output, Anda dapat memilih salah satu dari yang keempat.

Mencetak gol

Program diberi skor berdasarkan byte. Kumpulan karakter yang biasa adalah UTF-8, jika Anda menggunakan yang lain, silakan tentukan.

Ketika tantangan selesai, program dengan byte terkecil (disebut ), akan menang.

Pengajuan

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

George Gibson
sumber
2
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Gagang Pintu
1
Jadi dengan definisi baru Anda tentang 'kata', apa kata yang paling umum di sini don't d'ont dont a a? Apakah akan dont?
DJMcMayhem
@DrGreenEggsandHamDJ Jika Anda memiliki kiriman yang menghapus apostrof,, dont. Jika tidak a,. tetapi sebagian besar pengiriman dilakukan, dan begitu dontjuga jawaban yang benar.
George Gibson
1
Apakah output case-sensitive? Jadi apakah ipv6output yang valid untuk test case terakhir?
kirbyfan64sos
1
Sebuah ujian tambahan dapat digunakan: "Kalimat dengan kata-kata ini memiliki paling banyak dua kata yang paling sering sama." -> <tidak ada>
philcolbourn

Jawaban:

6

Pyke, 26 25 byte

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

Coba di sini!

Atau 23 22 byte (tidak bersaing, tambahkan simpul tempat membunuh tumpukan jika salah)

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

Coba di sini!

Atau dengan tanda baca, 23 byte (saya pikir ini bersaing? Komit sebelum diedit)

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

Coba di sini!

Atau 12 byte (pasti tidak bersaing)

l1.cj.#jR/)e

Coba di sini!

l1           -     input.lower()
  .c         -    punc_split(^)
    j        -   j = ^
     .#   )  -  sort(V(i) for i in ^)
       jR/   -   j.count(i)
           e - ^[-1]
Biru
sumber
Jawaban 23 byte Anda akan bersaing jika satu-satunya tanda baca yang dipertahankan adalah -dan '(tanda hubung dan tanda kutip).
George Gibson
Ini hanya mempertahankan tanda baca yang tidak ada di akhir kata
Biru
Oh, oke (saya tidak mengerti Pyke). Saya kira itu bersaing kemudian ...
George Gibson
1
@ GeorgeGibson Saya cukup yakin versi 23 byte tidak bersaing - itu bisa datang di bawah celah standar. Saya juga tidak berharap orang memahami Pyke, saya menjadikannya sebagai bahasa saya sendiri
Biru
Baik-baik saja maka. Saya pikir Anda masih menang, jadi itu tidak masalah.
George Gibson
11

Pyth - 23 30 byte

Harus ada cara yang lebih baik untuk memasukkan angka dan tanda hubung, tetapi saya hanya ingin memperbaikinya sekarang.

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

Test Suite .

Maltysen
sumber
1
Aturan yang direvisi membutuhkan angka dan tanda hubung yang dipertahankan.
Dennis
@ GeorgeGibson diperbaiki.
Maltysen
6

Oktaf, 115 94 byte

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

Akun untuk kasing tanpa kata yang paling sering digunakan try. Dalam hal ini tidak menghasilkan apa-apa, dan "istirahat" sampai Anda menangkap pengecualian.

Disimpan 21 (!) Byte berkat saran Luis Mendo (menggunakan output ketiga dari modeuntuk mendapatkan kata yang paling umum).


Aturan telah berubah sedikit sejak saya memposting jawaban asli saya. Saya akan melihat ke regex nanti.

Stewie Griffin
sumber
1
Anda mengalahkan saya untuk itu, akan memikirkan sesuatu yang lain sekarang.
Abr001am
Mendaftar modedi cmungkin? Keluaran ketiganya memberikan semua nilai terikat, jika saya ingat dengan benar
Luis Mendo
Saya menghitung 115 byte.
Conor O'Brien
Saya percaya regex Anda seharusnya ['\w\d]karena Anda harus mempertahankan tanda kutip dan angka. Kecuali kalau ada di antara huruf besar dan kecil di ASCII, dalam hal ini abaikan saya karena saya tidak punya meja berguna.
Dana Gugatan Monica
1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])memberiout = {1 2}
Luis Mendo
5

Perl 6, 80 byte

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

Mari kita bagi jawaban menjadi dua bagian ...

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

givenadalah pernyataan kontrol (suka ifatau for). Di Perl 6, mereka diizinkan sebagai postfix. ( a if 1, atau seperti di sini, foo given 3). givenmenempatkan topiknya (sisi kanan) ke dalam variabel khusus $_untuk sisi kiri.

"Topik" itu sendiri menurunkan ( lc), dibagi dengan kata ( words), menempatkan nilai ke dalam Tas (diatur dengan jumlah kejadian), lalu mengurutkan berdasarkan nilai (DESC). Sejak sorthanya tahu bagaimana untuk beroperasi pada daftar, yang Bagberubah menjadi Listdari Pairs di sini.

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

bersyarat sederhana ( ?? !!digunakan dalam Perl 6, bukan ? :).

$_ > 1

Hanya memeriksa bahwa daftar memiliki lebih dari satu elemen.

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

Akses ke $_dapat dipersingkat ... Dengan tidak menentukan variabel. .apersis seperti $_.a. Jadi ini efektif "apakah kedua elemen teratas memiliki jumlah kejadian yang sama" - Jika demikian, maka kita mencetak '' (string kosong).

Jika tidak, kita mencetak kunci atas elemen (hitungan): .[0].key.

Yang Mulia
sumber
7
Ini seperti setengah bahasa Inggris, setengah garis kebisingan. Luar biasa.
kucing
1
ini lucu bagaimana fitur OO-style yang terlihat Inggris-y: P
Ven
2
Juga berhasil menjadi kurang dapat dibaca daripada Perl 5 sementara mengandung lebih banyak bahasa Inggris dari Perl 5. D:
cat
1
@cat memperbaikinya - harus benar-benar tidak dapat dibaca sekarang
Ven
5
value??!!(saya tahu itu operator ternary, hanya menghibur)
kucing
4

05AB1E , 30 byte

Kode:

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

Menggunakan pengodean CP-1252 . Cobalah online! .

Adnan
sumber
hmm?
TessellatingHeckler
3
@TessellatingHeckler Hanya membutuhkan satu jalur input. Kecuali Anda berulang kali menggunakan Iperintah, 05AB1E hanya akan mengambil sebanyak yang dibutuhkan.
George Gibson
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)

Berdasarkan jawaban Blue @ Python.

Neil
sumber
Pengganti regex Anda terlihat seperti angka turun, dan akan merusak test case IPv6, benarkah itu?
TessellatingHeckler
@TessellatingHeckler Definisi kata berubah sejak saya awalnya membaca pertanyaan, tapi saya sudah memperbarui jawaban saya sekarang.
Neil
4

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

( +17 byte, karena tampaknya walaupun ada kata-kata yang lebih sering daripada yang lain, tetapi mereka memiliki frekuensi yang sama, tidak ada yang masih harus dikembalikan. )

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

Seharusnya sekarang memenuhi semua persyaratan. Kiriman ini mengasumsikan bahwa setidaknya 1 kata adalah input.

Cobalah secara Online! (Ideone)

Juga, jika Anda menginginkannya, berikut adalah versi lain dari fungsi saya tanpa ekspresi reguler dengan biaya sekitar 43 byte, walaupun yang ini tidak kompetitif, jadi tidak masalah. Saya hanya meletakkannya di sini untuk itu:

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

Coba Versi Baru Online ini! (Ideone)

R. Kap
sumber
Dari komentar tantangan "jika ada dua kata yang lebih sering daripada yang lain, tetapi dengan frekuensi yang sama", hasilnya adalah 'tidak ada'.
RootTwo
@RootTwo Diperbaiki! :)
R. Kap
@TessellatingHeckler Itu adalah kata-kata yang berbeda. That'sadalah kontraksi untuk that ispadahal thatssebenarnya bukan kata.
R. Kap
@TessellatingHeckler Bisakah Anda memberi saya bukti komentar ini? Karena saya akan melalui semua komentar di posting dan tidak melihat komentar seperti itu.
R. Kap
4

Ruby, 94 92 102 byte

Harus cepat (jawaban FGITW). Mengembalikan kata dalam semua huruf besar, atau niljika tidak ada kata yang paling sering.

Sekarang diperbarui untuk spesifikasi baru, saya pikir. Namun, saya berhasil sedikit menurunkan golf sehingga jumlah byte sama!

->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}
Nilai Tinta
sumber
5
Gotta go fast?
kucing
@cat ya, karena saya adalah FGITW saat ini
Nilai Tinta
3

Pyth, 32 byte

p?tlJeM.MhZrS@Ls++\-GUTcrz0d8ksJ

Suite uji.

Biarawati Bocor
sumber
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>

George Reith
sumber
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

Cobalah online!

Sqlserver 2016, 174 byte

Tidak dapat menangani data seperti contoh ini (menghitung sama dengan 3 kata):

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-clausen.dk
sumber
Saya tidak suka pendekatan variabel karena agak curang :) Satu input -> tidak ada atau sesuatu, dengan pendekatan berbasis set harus lebih lama, karena Anda perlu menambahkan GROUP BY, LEFT JOIN, or PARTITION BYLagi pula SQL Server telah membangun fungsi SPLIT. Demo yang tidak dikelompokkan merasa bebas untuk membuatnya sesingkat mungkin.
lad2025
@ lad2025 terima kasih banyak, tidak tahu fitur apa pun dari 2016. SPLIT_STRING pasti merupakan fitur yang lama tertunda. Saya mencoba memutarkan skrip menggunakan split, menurunkannya menjadi 174, namun skrip tidak dapat memfilter teks seperti "= = ="
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  

Keluaran:

masukkan deskripsi gambar di sini

Masukan jika ada yang tertarik:

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


Biasanya saya akan menggunakan MODE() WITHIN GROUP(...)dan itu akan jauh lebih pendek, tetapi itu akan melanggar:

Jika tidak ada kata yang paling sering (lihat test case # 3), program Anda seharusnya tidak menghasilkan apa-apa.


EDIT:

Penanganan ':

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

Keluaran:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              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            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝
Lad2025
sumber
tidak bisa mendapatkan serendah Anda, sqlserver belum membangun secara terpisah. Namun bagian yang dipilih lebih pendek.
t-clausen.dk
@ GeorgeGibson Tentu, memperbaiki + menambahkan demo langsung.
lad2025
@ lad2025 Dengan persetujuan bersama dalam obrolan, apa yang Anda lakukan tidak lagi diperlukan, silakan kembali.
George Gibson
@ GeorgeGibson Yup, edit akan jauh lebih jelas. Demo langsung berfungsi sekarang, ketika saya menulis jawaban sqlfiddle tidak merespons.
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

Ini adalah fungsi yang menerima string dan mengembalikan string jika satu kata muncul lebih sering daripada yang lain dan NULLsebaliknya. Untuk menyebutnya, tetapkan ke variabel.

Tidak Disatukan:

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
    }
}
Alex A.
sumber
2

Retina, 97 byte

Aturan terus berubah ...

T`L`l
[^-\w ]

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

!`[-\w]+$

Cobalah online!

Suite uji.

Biarawati Bocor
sumber
2
Gagal untuk input ini.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Terima kasih, sudah diperbaiki.
Leaky Nun
1
Dan Anda golf itu 11 byte ._. mengesankan
Conor O'Brien
Juga gagal untuk "Pria kuno makan kue kuno."
t-clausen.dk
Ini juga tidak beres (berharap amenjadi kata paling umum di sana)
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]

Kode di atas mengasumsikan bahwa input memiliki setidaknya dua kata.

RootTwo
sumber
Harus mencintai regex itu, tho.
Biru
Ini salah. Kelas karakter \wtermasuk garis bawah.
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]:'')):'');
MonkeyZeus
sumber
1

Python 2, 218 byte

Mengasumsikan lebih dari 2 kata. Menyingkirkan tanda baca menghancurkan saya ...

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''
Biru
sumber
Apakah strip ini ',-dll?
Tim
@Tim Tidak, saya melakukan tantangan ini sebelum peraturan dibuat sepenuhnya Akan berubah.
Biru
Bisakah Anda menetapkan hasil sortedke tuple daripada harus mengindeks ke dalam array secara manual?
Neil
@Neil maksudmu hanya mendapatkan item pertama dan kedua untuk perbandingan, bukan seluruh array? Saya tidak tahu bagaimana melakukannya
Biru
1

Matlab (225)

  • Aturan yang diubah: /

.

      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
  • Kotak alat diperlukan untuk menjalankan ini.

  • Bagaimana cara kerjanya, salah satu hak istimewa terbaik dari regex ganti di matlab ini itu bidang-mengeksekusi token dengan memanggil fungsi eksternal-lingkungan parameter dengan token yang ditangkap di lingkungan bagian dalam, sehingga setiap urutan "Word_A Word_B .."digantikan oleh bilangan bulat di "A0 A1 A2 B0 B1 B2 ..."mana bilangan bulat pertama adalah numerica ascii tanda tangan kata, yang kedua adalah indeks awal, yang ketiga adalah indeks akhir, dua bilangan bulat terakhir ini tidak menggandakan di seluruh urutan jadi saya mengambil keuntungan ini untuk memindahkannya ke sebuah array, kemudian mode kemudian mencari menghasilkan array itu, sehingga indeks awal / akhir akan mengikuti.

  • Sunting: setelah mengubah beberapa detail, program ini disebut fungsi oleh parameter string.


20 byte disimpan berkat @StewieGriffin, 30 byte menambahkan cela ke celah yang disepakati bersama.

Abr001am
sumber
Anda akan mendapatkan jawaban saya ketika Anda (atau orang lain) menunjukkan bahwa ini benar-benar berfungsi, baik untuk input yang memiliki kata paling umum, maupun untuk input yang tidak. =) (Sayangnya, saya tidak bisa mengujinya)
Stewie Griffin
@StewieGriffin saya pikir programe bertingkah laku buruk dengan kalimat dengan kata-kata equi-frekuensi saya akan memperbaikinya
Abr001am
1

05AB1E , 22 21 20 byte

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

Penjelasan:

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

Catatan: Jika Anda baik-baik saja dengan mengekor baris baru di output untuk saat Anda seharusnya tidak menghasilkan apa-apa, hapus ?di akhir untuk menyimpan byte.

Catatan # 2: Program tidak akan bekerja dengan satu kata, tapi saya ragu ini akan menjadi masalah. Jika Anda ingin memperbaikinya, ganti #dengan ð¡byte tambahan.

05AB1E menggunakan CP-1252 sebagai charset, bukan UTF-8.

Cobalah online!

Okx
sumber
1

Perl, 60 56 55 54 byte

Termasuk +3 untuk -p

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

Jika sebuah kata tidak bisa hanya angka, Anda juga dapat menjatuhkan auntuk skor 53.

Ton Hospel
sumber
Apakah tanda hubung dalam -anEtidak dihitung? Itu dilakukan pada jawaban lain (+2 byte untuk -pbendera) ...
George Gibson
@ GeorgeGibson Tidak, lihat meta.codegolf.stackexchange.com/questions/273/… . Tanda hubung, ruang dan Etidak dihitung. Jawaban lain biasanya hanya harus melakukan +1 bytes -p, tetapi solusinya memiliki 'sehingga tidak dapat dilihat sebagai perpanjangan dari -eatau -E. Jadi dia seharusnya menghitung +3 (bukan +2) karena dia harus menghitung spasi dan tanda hubung (tetapi setiap opsi tambahan hanya akan diberi +1).
Ton Hospel
@ Injil Oh, benar.
George Gibson
Apakah ini dianggap valid mengingat aturan apostrof? [\pL\d-]sepertinya bisa menyusut ke [\w-](kecuali kami peduli tentang garis bawah) tetapi versi mana pun akan melaporkan thatalih-alih that'satau thatsuntuk pengujian 4. Jika tidak, Anda perlu menambahkan 4 byte untuk dimasukkan ke \x27dalam kelas karakter tersebut (kecuali jika Anda memiliki cara yang lebih baik untuk menambahkan apostrof).
Adam Katz
@AdamKatz Definisi 'kata' sedikit berubah saat ini sedang berjalan dan saya tidak pernah sepenuhnya mengadopsi versi terakhir. Tetapi untuk membuat Anda senang, saya membuat versi tetap (dan lebih pendek) :-). Dan ya, saya sangat peduli dengan garis bawah
Ton Hospel
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

Bagian pertama cukup mudah:

  • $input is ~ = stdin
  • Regex mengganti karakter yang tidak relevan dengan apa pun, pertahankan baris baru sehingga kami tidak menumbuk dua kata dari ujung baris dan awal baris berikutnya menjadi satu karena kesalahan. (Tidak ada orang lain yang membahas banyak baris, bisa bermain golf -2 jika inputnya selalu satu baris).
  • Regex split, Groupberdasarkan frekuensi (~ = collections.Counter Python), Sortuntuk memasukkan kata yang paling sering di akhir.
  • PowerShell tidak peka huruf besar-kecil untuk semua.

Menangani jika tidak ada kata yang paling sering:

  • Ambil dua item terakhir [-2, -1] menjadi $ y dan $ z;
  • daftar N-item, di mana N> = 2, menjadikan $ y dan $ z dua item terakhir
  • daftar 1-item menjadikan $ y item terakhir dan $ z nol
  • daftar kosong membuat keduanya nol

Gunakan golf bool-as-array-index palsu-ternary-operator (0,1)[truthyvalue], bersarang, untuk memilih "", $ z atau $ y sebagai output, lalu ambil .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
TessellatingHeckler
sumber
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)
Pengobrol
sumber
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 ( -pbendera) = 86 byte

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

Menggunakan:

> echo "The man walked down the road." | perl -p script.pl
Denis Ibaev
sumber
-pBendera Anda harus meminta penalti 3 byte. Aturannya kira-kira: Setiap flag commandline adalah +1 byte karena itu adalah berapa banyak byte tambahan yang Anda butuhkan untuk memperpanjang -e'code'commandline gaya bebas Anda . Jadi normalnya -phanya +1 byte. Tapi di sini kode Anda sudah 'jadi tidak bisa dijalankan hanya dari commandline tanpa melarikan diri. Jadi, tidak ada penggabungan dengan -edan ruang -serta sebelum pekstra dan harus dihitung juga
Ton Hospel
@TonHospel Diperbaiki.
Denis Ibaev
Ini sebenarnya 84 +1 ( -pbendera) jika Anda memanggilnya pada baris perintah sebagai perl -pe'…'(tersedia dengan menghapus 'seperti yang tercantum dalam komentar pertama)
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())]

Mengambil inputnya seperti ini:

g("Bird is the word")

Haruskah cocok dengan semua persyaratan, meskipun gagal pada string kosong, apakah perlu untuk memeriksa mereka? Maaf atas keterlambatannya.

Saran / umpan balik / tipuan ilmu hitam untuk menghemat byte selalu diterima

Tidakkah Anda Ingin Tahu?
sumber
Hai, dan selamat datang di PPCG! Kami mencetak tantangan kode-golf dengan jumlah byte dalam jawaban. Saya pergi ke depan dan mengeditnya untuk Anda dengan informasi yang benar.
R
2
Selamat datang di PPCG! Sayangnya, kiriman Anda tidak memenuhi semua persyaratan dari tantangan ini karena, pertama-tama, BUKAN case-sensitive. Misalnya, itu TIDAK akan menghitung kemunculan kata Thatsebagai kemunculan kata thatkarena yang pertama dimulai dengan huruf besar Tdan yang terakhir dimulai dengan huruf kecil t. Juga, ini TIDAK menghapus semua bentuk tanda baca lain kecuali tanda hubung ( -) dan, secara opsional, tanda kutip ( ') dan sebagai hasilnya, ini TIDAK akan berfungsi untuk kasus uji keempat yang diberikan dalam pertanyaan.
R. Kap
1
Juga, ini TIDAK menghasilkan apa-apa jika tidak ada kata yang paling sering. Misalnya, menggunakan case uji ketiga ( This sentence has no most frequent word.) sebagai contoh, fungsi Anda menghasilkan [('This', 1)], padahal seharusnya tidak menghasilkan apa-apa. Saya dapat terus dan terus tentang lebih banyak masalah, jadi saya akan merekomendasikan memperbaikinya secepat mungkin.
R. Kap
Akan dilakukan segera, ketika saya punya waktu
Bukankah Anda Ingin Tahu
Ini salah. Kelas karakter \wtermasuk garis bawah.
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]"

(Sayangnya, saya tidak tahu bagaimana cara mendapatkannya lebih kecil dari itu ...)

Penjelasan

Ini menggunakan beberapa idiom Tcl jelas untuk melakukan hal-hal.

  • [join [read stdin] " "] - input string → daftar kata yang dipisahkan spasi
  • lmap ... - beralih ke setiap elemen dari daftar itu. (Lebih pendek dari foreachdan secara identik identik karena hasilnya dibuang.)
  • [regsub ... [string tolower ...]] - Konversi string menjadi huruf kecil dan strip semua karakter kecuali untuk karakter kata dan tanda hubung.
  • [dict incr d ...] - Membuat / memodifikasi kamus / kata → hitung histogram.
  • set y ... - Urutkan nilai kamus, ambil yang terbesar, dan kembalikan semua (kunci, nilai) pasangan yang sesuai dengannya.
  • if... - Harus ada tepat dua elemen: satu pasangan (kunci, nilai), jika tidak ada yang perlu dicetak.
  • puts... - Cetak kunci pada pasangan nilai kunci, jika ada. (Tidak ada kata yang memiliki spasi.)

Anda bisa bermain dengannya menggunakan CodeChef .

Dúthomhas
sumber
182
sergiol
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

Cukup dicetak ...

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
aja
sumber
Saya tidak berpikir ini menangani semua kasus kata-kata yang paling sering diikat - lihat (baru) kasus tes terakhir - saya membuat kesalahan serupa.
philcolbourn
Mudah-mudahan, bahwa ini tetap sekarang
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

Operasi:

mendeklarasikan array asosiatif F dari integer (menyatakan -iA F)

f adalah fungsi yang, mengingat parameter kata $ 1, menambah jumlah frekuensi untuk kata ini (T = ++ F [$ 1]) dan membandingkan dengan jumlah maksimum sejauh ini (M).

Jika sama, kita memiliki dasi sehingga kita tidak akan menganggap kata ini paling sering (I =)

Jika lebih besar dari jumlah maksimum sejauh ini (M), maka atur jumlah maksimum sejauh ini untuk jumlah frekuensi dari kata ini sejauh ini (M = $ T) dan ingat kata ini (I = $ 1)

Fungsi akhir f

Baca garis (baca L) Buat huruf kecil (L = $ {L ,,}) Hapus karakter apa pun kecuali az, 0-9, tanda hubung (-) dan spasi (L = $ {L // [^ - a-z0- 9]}) Buat urutan pernyataan bash yang memanggil f untuk setiap kata (printf -vA "f% s;" $ L). Ini disimpan ke variabel A. eval A dan hasil cetak (eval $ a; echo $ I)

Keluaran:

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: TETAP Saya memiliki bug yang tidak terungkap dalam kasus uji ini. Jika input

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

maka kode saya seharusnya tidak menghasilkan apa-apa.

Saya memiliki perbaikan tetapi saya tampaknya telah memukul bug bash ... Saya mendapatkan perilaku yang sangat aneh adalah M tidak dinyatakan sebagai bilangan bulat: ++ F [$ 1] == M (setelah beberapa kata berulang) menambah kedua F [$ 1 ] dan M !! - kesalahanku.

philcolbourn
sumber
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

Cobalah online

Menghasilkan kata yang paling umum sebagai huruf kecil. Tidak termasuk apostrof karena "apostrof tidak diharuskan untuk dimasukkan."

statistics.mode membutuhkan Python 3.4

Sayangnya, tidak ada output stderryang diizinkan, atau itu akan jauh lebih pendek.

mbomb007
sumber
Anda tidak diizinkan mencetak STDERR, kecuali program ini tidak menghasilkan output kesalahan?
Okx
Program baru Anda tidak mendukung tanda hubung! Saya mencoba inputi- test i-
Okx
Memperbaiki semuanya. Masih pendek.
mbomb007
0

R, 96 byte

19 byte lebih pendek dari jawaban R yang ada , dengan pendekatan yang agak berbeda.

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

Membaca dari stdin, sehingga input secara otomatis dipisahkan oleh spasi. Kami mengonversi menjadi huruf kecil dan digunakan gsubuntuk menghapus semua non-alfanumerik (plus -dan '). Kami menghitung contoh setiap kata dengan tabledan menyimpan hasilnya t. Selanjutnya, kami memeriksa apakah ada lebih dari 1 maksimum dalam t(dengan melihat apakah ada lebih dari satu elemen yang sama dengan max(t). Jika demikian, kami mengembalikan string kosong ''. Jika tidak, kami mengembalikan kata yang sesuai dengan maksimum dalam t.

rturnbull
sumber