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: aaabbb
dan cccc
. Kata aaabbb
memiliki 3 a
dan 3 b
, dan cccc
4 c
. Jadi, jumlah maksimum huruf yang diulang aaabbb
adalah 3 dan maksimum cccc
adalah 4. Kami ingin memilih kata dengan jumlah maksimum huruf tunggal yang diulang, jadi output untuk aaabbb cccc
seharusnya cccc
.
Kasus uji lainnya:
Today, is the greatest day ever! --> greatest
This is a great day --> -1
aaabbb cccc --> cccc
ever
aabb
memiliki 2 surat berulang. Akanaaaabb
dianggap memiliki 4 huruf berulang (2, 3, 4a
, 2b
) atau 2 huruf berulang (a
danb
).Jawaban:
C - GCC -
159145135 BytesAkan 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:
sumber
Pyth, 14 byte
Demonstrasi. Uji harness.
sumber
l
sebelum.-
tampaknya melakukannya.K, 35 byte (hilang -1 persyaratan, baru diperhatikan, tetapi waktu untuk tidur)
bagaimana itu bekerja:
1 ambil
dari kata-kata yang diindeks oleh
indeks untuk dimasukkan ke dalam urutan menaik
maksimal
hitung dimana
string = char
untuk setiap kata dalam kata
untuk setiap kata di mana
w
(kata-kata) beradastring dipisah berdasarkan spasi
Jelas saya mengorbankan sedikit presisi untuk mengekspresikan dan keterbacaan dalam penjelasan bahasa Inggris. Saya harap itu menarik.
sumber
,-1
ke akhir fungsi.#:&:
sejak konteks mereka harus menguraikan sebagai bentuk monadik mereka. Anda juga dapat menggunakan@
untuk mengindeks bukan tanda kurung, dan pertama (*
) alih-alih1#
.Haskell, 100 byte
Contoh penggunaan:
f "Today, is the greatest day ever!"
->"greatest"
Bagaimana itu bekerja:
Haskell,
7977 byte (belum diuji)Ini menggunakan
sortOn
dariData.List
v4.8.0.0, yang belum saya instal, jadi saya tidak bisa mengujinya.sumber
CJam, 25 byte
Cobalah online
Penjelasan:
sumber
Python 2,
9777 BytesSolusi 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.
sumber
SWI-Prolog,
158154149 byteContoh:
a("Today, is the greatest day ever!",R).
keluaranR = "greatest" .
.sumber
JavaScript,
86111108 byteJelas golf-bisa, seluruh -1 ditambahkan sekitar 20 byte.
sumber
R, 107 byte
Ini membaca dari STDIN dan mencetak ke STDOUT.
Penjelasan + tidak dikumpulkan:
sumber
C # 166 Bytes
Pengodean langsung. Tidak ada yang spesial di sini.
C # menyebalkan untuk kode golf: - /
sumber
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)
Tidak Serigala dan lebih kompatibel
sumber
Python, 58
sumber
C (167)
COBALAH
BAGAIMANA CARA KERJA INI?
sumber
Q (44 byte)
ungolfed
sumber
Haskell 96 Bytes
`` `
r
adalah fungsi yang mengambil kata dan mengembalikan tuple di(n,w)
manan
jumlah kemunculan karakter yang paling banyak muncul di dalam kataw
. Misalnyax="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:Pisahkan daftar pada ruang
words p
kata foreach membuat daftar
(n,w)
ambil tuple yang memiliki terbesar
n
(counter kejadian)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!"
menghasilkan
["Today,","is","the","greatest","day","ever!"]
[(1,"Today,"),(1,"is"),(1,"the"),(2,"greatest"),(1,"day"),(2,"ever!")]
(2, "terhebat")
2! = 1 maka
greatest
solusinya!sumber
Bash Murni (tanpa perintah eksternal) 129 byte
Ini cukup panjang, tetapi masih lebih baik dibandingkan dengan beberapa entri lain yang lebih panjang.
Saya tidak sepenuhnya senang dengan beberapa constucts, harus menggunakan bagian dalam untuk loop itu mengganggu. Ada saran?
sumber