Word dengan pengulangan terbesar huruf


8

Baru-baru ini ada pertanyaan tentang Stack Overflow di mana OP sedang mencoba untuk menulis fungsi untuk menemukan kata dalam string yang memiliki huruf paling banyak diulang. Tentu saja tidak sulit untuk menulis satu dalam hitungan detik, dan saya menulis satu dalam Javascript sesingkat mungkin untuk bersenang-senang. Tapi saya bukan ahli golf kode, jadi saya ingin tahu seberapa pendek program sederhana ini!


Tantangan

Tulis program atau fungsi yang menggunakan serangkaian kata dan kembalikan atau cetak kata dengan satu huruf yang paling berulang.

Aturan:

  • Pilih kata dengan jumlah huruf tunggal berulang terbanyak (lihat contoh di bawah)

  • Jika tidak ada kata yang memiliki huruf berulang, kembalikan -1.

  • Jika dua kata memiliki jumlah maksimum pengulangan huruf yang sama, pilih yang lebih dekat ke awal string.

  • Pengajuan terpendek dalam byte menang.

Memasukkan

Ambil sebagai input string yang terdiri dari satu atau lebih kata yang dibatasi ruang. Input dapat dari STDIN (atau alternatif terdekat), parameter baris perintah, atau argumen fungsi.

Keluaran

Cetak hasilnya ke STDOUT untuk mengembalikannya.

Contohnya

Pertimbangkan senarnya aaabbb cccc. Ini mengandung dua kata: aaabbbdan cccc. Kata aaabbbmemiliki 3 adan 3 b, dan cccc4 c. Jadi, jumlah maksimum huruf yang diulang aaabbbadalah 3 dan maksimum ccccadalah 4. Kami ingin memilih kata dengan jumlah maksimum huruf tunggal yang diulang, jadi output untuk aaabbb ccccseharusnya cccc.

Kasus uji lainnya:

Today, is the greatest day ever!  --> greatest
This is a great day               --> -1
aaabbb cccc                       --> cccc

Bagaimana jika lebih dari satu kata memiliki # huruf yang sama berulang? Apakah kita mencetak sebagian atau semua?
Maltysen

@Maltysen Lihatlah contoh pertama - lihatever
isaacg

@isaacg tetapi terhebat memiliki dua pengulangan, t dan e.
Maltysen

2
Saya tidak yakin apa yang dimaksud dengan jumlah huruf yang diulang. Saya berasumsi aabbmemiliki 2 surat berulang. Akan aaaabbdianggap memiliki 4 huruf berulang (2, 3, 4 a, 2 b) atau 2 huruf berulang ( adan b).
feersum

1
Perhatikan bahwa pertanyaan aslinya adalah dari Coderbyte. Saya mencari di situs web mereka untuk informasi hak cipta (karena ini adalah reproduksi dari Surat Count I) tetapi saya tidak dapat menemukan apa pun.
Alex A.

Jawaban:


7

C - GCC - 159 145 135 Bytes

x=0,w=0,i,j,c;main(int _,char**z){while(--_)for(j=i=0;_[z][i];j=++i,x=c>x?w=_,c:x)for(c=0;j--;)c+=z[_][i]==z[_][j];puts(x?z[w]:"-1");}

Akan memperbarui ketika saya bisa memotongnya sedikit

Cara mengompilasi: gcc -w cg.c

Cara menjalankan: ./a.out word1 word2 aass ddaaa ssdddd

Output: ssdddd

Tidak-Output / Tidak-cocok: -1

Pertama-tama, saya sedikit curang, dengan mengambil kata-kata sebagai argumen program, tetapi membuat GCC mengurai kata-kata dan memberi saya jumlah kata gratis adalah terlalu banyak hadiah untuk dilewatkan.

Bagaimana cara kerjanya?

Kami memiliki 3 loop bersarang. Peningkatan pertama melalui setiap kata, dua kata berikutnya meniru semacam gelembung untuk membandingkan nilai. Huruf pertama tidak pernah dibandingkan dengan dirinya sendiri, dan setiap huruf berikutnya dibandingkan dengan setiap huruf sebelumnya. Setiap kali suatu kata memiliki lebih banyak huruf yang sama dari kata sebelumnya, kata tersebut disimpan dalam x, dan jumlah berapa banyak huruf yang sama juga disimpan.

Penyalahgunaan GCC

Kami menggunakan del auto int global implisit untuk bilangan bulat kami. Kami mengizinkan argv menjadi int bukan char (saat ini char, ini adalah TODO). Kami menggunakan fungsi default seperti put dan getchar. Kami juga menggunakan operator koma untuk membebani operator trinary (kondisional) kami.

Ingin 2 byte lebih sedikit?

Ganti "-1" dengan * z dan beri nama file -1

Program tidak dikobarkan dan tidak teruji:

int main(int argc, char * argv[])
{
    int word = 0           // Current most repeat letters word
    int count = 0;        // Current most repeat letters
    int i, j, increment; // Counter variables

    while(--argc != 0) // While we have words from program parameters
    {
        for(j = i = 0; argv[argc][i] != '\0'; j = ++i) // Iterate through each letter until end of word
        {
            for(increment = 0; j > 0; j--) // Iterative backwards through each letter
            {
                if(argv[argc][i] == argv[argc][j])
                {
                    increment++;
                }
            }
            if(increment > count) // New greatest lettered word
            {
                word = argc;
                count = increment;
            }
        }
    }

    if(word == 0)
    {
        puts("-1");
    }
    else
    {
        puts(argv[word]);
    }

    return 0;
}

1
Selamat datang di PPCG! Golf yang bagus; jika Anda punya waktu, saya ingin melihat penjelasan tentang cara kerja kode Anda.
Toby Speight

OP yang diperbarui dengan penjelasan
Jake

Tidak ada penyalahgunaan GCC, hanya beberapa gaya lama tapi biasa C
edc65

itu rekor! selamat
Abr001am

4

Pyth, 14 byte

eoeS/LNN+czd_1

Demonstrasi. Uji harness.

eoeS/LNN+czd_1
                  Implicit: z = input(), d = ' '
         czd      chop z on delimeter d.
        +   _1    Add an -1 to the end of the list.
 o                Order the list by
  eS              the maximum of
    /LN           the occurence count in the word
       N          of letters in the word.
                  (If we are mapping over -1, this will give -1/-1 = 1)
                  Since Python's sort is stable, this will leave -1 at the end if
                  all words have maximum repetition count 1.
e                 Take the final element of the resulting list and print it.

Sepertinya masih tidak berfungsi. Sesuai komentar feersum "aaaabb" harus memiliki 4 pengulangan dan karenanya lebih dari "terbesar". Tapi pyth.herokuapp.com/... masih memberi yang terbaik.
Maltysen

Menempatkan lsebelum .-tampaknya melakukannya.
Maltysen

@Maltysen Benar, saya konyol dan berusaha menggunakan penyortiran string.
isaacg

Ini pendek dan indah.
Derek 朕 會 功夫

@Derek 朕 會 功夫 Terima kasih! Pertimbangkan upvoting.
isaacg

2

K, 35 byte (hilang -1 persyaratan, baru diperhatikan, tetapi waktu untuk tidur)

{1#w[>{|/{#:&:x=y}[x]'x}'w:" "\:x]}

bagaimana itu bekerja:

1 ambil

1#

dari kata-kata yang diindeks oleh

w[

indeks untuk dimasukkan ke dalam urutan menaik

>

maksimal

|/

hitung dimana

#:&:

string = char

x=y

untuk setiap kata dalam kata

'x

untuk setiap kata di mana w(kata-kata) berada

'w:

string dipisah berdasarkan spasi

\:x

Jelas saya mengorbankan sedikit presisi untuk mengekspresikan dan keterbacaan dalam penjelasan bahasa Inggris. Saya harap itu menarik.


1
Saya pikir Anda dapat mengikuti persyaratan dengan menambahkan ,-1ke akhir fungsi.
kirbyfan64sos

Anda harus dapat meninggalkan titik dua karena #:&:sejak konteks mereka harus menguraikan sebagai bentuk monadik mereka. Anda juga dapat menggunakan @untuk mengindeks bukan tanda kurung, dan pertama ( *) alih-alih 1#.
JohnE

2

Haskell, 100 byte

import Data.List
f=g.last.sort.map((,)=<<last.sort.map length.group.sort).words
g(1,_)="-1"
g(_,w)=w

Contoh penggunaan: f "Today, is the greatest day ever!"->"greatest"

Bagaimana itu bekerja:

                                                words  -- split input at spaces into list of words
          map(                                 )       -- for each word
              (,)=<<                                   -- build a pair, where the second element is the word itself
                                                       -- and the first element is made by
                                           sort        -- sort the letters
                                      group            -- group equal letters
                            map length                 -- take length of each group
                        sort                           -- sort the lengths
                    last                               -- take the last
                                                       -- now we have a list of (l,w) pairs where l is how often the most frequent letter occurs for word w
     sort                                              -- sort the list
 last                                                  -- take last element
g                                                      -- call g which checks the "-1" case 

Haskell, 79 77 byte (belum diuji)

import Data.List
last.sortOn(last.sort.map length.group.sort).words.(++" -1")

Ini menggunakan sortOndari Data.Listv4.8.0.0, yang belum saya instal, jadi saya tidak bisa mengujinya.


2

CJam, 25 byte

lS/{_$e`$W=0=(\}%2/$W=~W?

Cobalah online

Penjelasan:

lS/   Get input and split at spaces.
{     Start of loop over all words.
  _     Copy, need to keep original word.
  $     Sort letters.
  e`    RLE.
  $     Sort RLE result. Sort is increasing by count.
  W=    Get last count/letter pair, which corresponds to largest count.
  0=    Extract count from pair.
  (     Decrement count, so that it has a falsy value when the count is 1.
  \     Swap count and word, so that we can sort the pairs by count.
}%    End of loop over words.
2/    Split list into pairs, which are the count/word pairs.
$     Sort the pairs.
W=    Get last one, which is the largest count.
~     Unwrap the pair.
W?    Output word if count is truthy, -1 otherwise.

2

Python 2, 97 77 Bytes

Solusi yang cukup mudah, hanya memetakan input (dikelilingi oleh tanda kutip) ke sebuah tuple yang berisi kata dan jumlah karakter yang diulang. Mendapat maksimum, dan mencetak kata jika huruf paling banyak diulangi sama sekali, jika tidak maka akan mencetak -1.

Saya menghemat 20 (!) Byte dengan mengatur ulang urutan input sehingga saya tidak memerlukan kunci untuk menemukan maks.

j=max((max(map(x.count,x)),x)for x in input().split())
print[-1,j[1]][j[0]>1]

1

SWI-Prolog, 158 154 149 byte

a(A,R):-split_string(A," ","",B),findall(X:Z,(member(Z,B),string_codes(Z,D),length(D,L),sort(D,E),length(E,M),X is M-L,X<0),S),sort(S,[_:R|_]);R= -1.

Contoh: a("Today, is the greatest day ever!",R).keluaran R = "greatest" ..


1

JavaScript, 86 111 108 byte

s=>(l=(x=s.split` `,r=x.map(l=>(/(.)\1+/.exec(l)||[''])[0].length),x)[r.indexOf(k=Math.max(...r))],k<2?-1:l)

Jelas golf-bisa, seluruh -1 ditambahkan sekitar 20 byte.


1

R, 107 byte

w=scan(,"");l=sapply(w,function(x)max(table(strsplit(x,"")[[1]])));cat(ifelse(max(l)>1,w[which.max(l)],-1))

Ini membaca dari STDIN dan mencetak ke STDOUT.

Penjelasan + tidak dikumpulkan:

# Read a string and split it into a vector on spaces
w <- scan(, "")

# Get the maximum number of letter repeats in each element of w
l <- sapply(w, function(x) max(table(strsplit(x, "")[[1]])))

# If the largest number in l is 1, print -1, otherwise get the word
cat(ifelse(max(l) > 1, w[which.max(l)], -1)

1

C # 166 Bytes

string a(string i){var z=i.Split(' ');int g=1,c=0;var m="-1";foreach(var w in z)foreach(var l in w.Distinct()){c=w.Where(x=>x==l).Count();if(c>g){g=c;m=w;}}return m;}

Pengodean langsung. Tidak ada yang spesial di sini.

C # menyebalkan untuk kode golf: - /


1

JavaScript ( ES7? ), 99

Menggunakan pemahaman array, yang diterapkan di Firefox tetapi tidak lagi termasuk dalam EcmaScript 6.

Tes menggunakan cuplikan di bawah ini (khusus Firefox)

f=s=>s.split(' ').map(w=>[for(c of(l=[m=0],w))(n=l[c]=-~l[c])>m?m=n:0]&&m>x&&(x=m,v=w),x=1,v=-1)&&v

// TEST
out=x=>O.innerHTML+=x+'\n';

test=x=>out(x+' -> '+f(x))

;["aaabbb cccc","This is a great day","Today, is the greatest  day ever a!"]
.forEach(t=>test(t));
<pre id=O></pre>
Try:<input id=I><button onclick='test(I.value),I.value=""'>-></button>

Tidak Serigala dan lebih kompatibel

function f(s)
{
  v = -1;
  x = 1;
  s.split(' ')
  .forEach(function(w){
    l=[];
    m=0;
    w.split('').forEach(function(c){
      n=l[c]=-~l[c];
      if (n>m) m=n;
    })
    if (m>x) x=m,v=w;
  })
  return v;
}

// TEST
out=function(x) { O.innerHTML+=x+'\n' }

test=function(x) { out(x+' -> '+f(x)) }

;["aaabbb cccc","This is a great day","Today, is the greatest  day ever a!"]
.forEach(function(t) { test(t)} );
<pre id=O></pre>
Try:<input id=I><button onclick='test(I.value),I.value=""'>-></button>


1

Python, 58

max('-1',*input().split(),key=lambda w:len(w)-len(set(w)))

1

C (167)

double m,k,n=k=2,*O,V[256];char*f(char*c,char*s){return*c?((*O=!((n+=!(*c*=*c!=32))>1.1/modf(*(O=V+*c),&m))*m+1/n+1)>k)?f(c+!!(k=*O),c):f(c+1,s):s?!*s?s+1:f(c,s-1):0;}

COBALAH

BAGAIMANA CARA KERJA INI?

  • fungsi ini adalah rekursif dalam satu di dalam fungsi rekursif lain, fungsi orang dalam mengambil awal string di mana karakter inklusif dikembalikan oleh fungsi pertama.
  • jumlah maksimum diberikan dengan mem-hashing karakter di atas tabel ascii.

1

Q (44 byte)

{w l?0|/l:{max(#:)'[(=)x]}'[w:" "vs"-1 ",x]}

ungolfed

{
    words:" " vs "-1 ",x;
    counts:{max count each group x} each words;
    : words counts ? max counts;
}

1

Haskell 96 Bytes


r o=(last.sort.map length$(group.sort)o,o)
w p=n$maximum(map(r)(words p))
n (1,_)="-1"
n (_,w)=w

`` `


radalah fungsi yang mengambil kata dan mengembalikan tuple di (n,w)mana njumlah kemunculan karakter yang paling banyak muncul di dalam kata w. Misalnya x="norep", y="dnredundant", marir x=(1,norep), r y=(3,ndredundant)

w adalah fungsi yang mengambil string yang berisi sejumlah kata yang dipisahkan oleh spasi dan:

  1. Pisahkan daftar pada ruang words p

  2. kata foreach membuat daftar (n,w)

  3. ambil tuple yang memiliki terbesar n(counter kejadian)

  4. Jika n sama dengan 1, cukup kembalikan string -1, kata itu sendiri (disimpan di komponen kedua tuple) sebaliknya.

Misalnya ambil p="Today, is the greatest day ever!"

  1. menghasilkan ["Today,","is","the","greatest","day","ever!"]

  2. [(1,"Today,"),(1,"is"),(1,"the"),(2,"greatest"),(1,"day"),(2,"ever!")]

  3. (2, "terhebat")

  4. 2! = 1 maka greatestsolusinya!


1

Bash Murni (tanpa perintah eksternal) 129 byte

Ini cukup panjang, tetapi masih lebih baik dibandingkan dengan beberapa entri lain yang lebih panjang.

m=1
w=-1
for b;{
declare -A a
for((i=0;i<${#b};i++));{
c=${b:$i:1}
let a[$c]++
d=${a[$c]}
((d>m))&&w=$b&&m=$d
}
unset a
}
echo $w

Saya tidak sepenuhnya senang dengan beberapa constucts, harus menggunakan bagian dalam untuk loop itu mengganggu. Ada saran?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.