Program Anda harus menemukan semua kata dalam daftar kata ini yang berisi semua vokal ( a e i o u y
). Ada cara mudah untuk melakukan ini, tetapi saya mencari jawaban terpendek. Saya akan mengambil bahasa apa pun, tetapi saya ingin melihat Bash.
Berikut ini sebuah contoh (bisa lebih ditingkatkan):
cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"
Skor Anda adalah panjang kode.
-5 poin untuk menghitung semua kemunculan kata.
Skor terendah menang.
code-challenge
natural-language
Dokter
sumber
sumber
Jawaban:
GolfScript, 20 karakter - 5 = 15 poin
Berdasarkan solusi Howard , tetapi menggunakan tes yang lebih pendek (
\-!
menghemat satu karakter&,6=
), penambahan panjang yang lebih pendek (.,+
= 3 karakter) dan format output yang lebih pendek (tidak ada yang mengatakan bahwa output harus dipisahkan dengan baris baru, jadi`
simpan satu karakter lebihn*
).Inilah hasilnya, diberikan daftar kata huruf kecil sebagai input (linebreak dimasukkan untuk dibaca):
(Mz. Secara teknis, mengingat bahwa tantangannya hanya mengatakan bahwa kode harus bekerja untuk input spesifik ini,
n%{'aeiouy'\-!},`43
akan menjadi satu karakter yang lebih pendek. Namun saya menganggap itu curang.)Penjelasan:
n%
membagi input pada baris baru ke dalam array.{ },
adalah operator "grep", yang mengeksekusi kode antara kawat gigi untuk setiap elemen array dan memilih yang mengembalikan nilai sebenarnya.'aeiouy'\-
ambil string literalaeiouy
dan menghapus setiap karakter yang ditemukan dalam kata kandidat. The!
maka secara logis meniadakan string yang dihasilkan, menghasilkan1
(benar) jika string kosong dan0
(palsu) jika tidak..,+
membuat salinan array yang difilter, menghitung jumlah kata di dalamnya, dan menambahkan hasilnya ke array asli.`
un-eval array, mengubahnya menjadi representasi string dari isinya. (Tanpa itu, kata-kata dalam array hanya akan digabungkan dalam output, menghasilkan kekacauan yang tidak dapat dibaca.)sumber
GolfScript, 19 karakter
Pemakaian:
Keluaran:
Jika Anda juga ingin menampilkan jumlah pada akhirnya Anda dapat menggunakan
yang empat karakter lebih panjang.
sumber
Python - 46 karakter
Versi yang mudah dibaca: Ini sudah cukup mudah dibaca :-)
sumber
APL, 21 - 5 = 16
Berharap untuk menemukan daftar kata sebagai
w
. Mengembalikan daftar kata-kata yang berisi semua vokal, ditambah hitungannya. Diuji dengan apl ngn . Ini sebuah contoh .Penjelasan
sumber
Ruby 38
Sunting 34: Terbaik sejauh ini (dari @OI):
Sunting 1: Saya baru saja memperhatikan pertanyaan yang meminta 'y' untuk dimasukkan di antara vokal, jadi saya telah mengedit pertanyaan saya sesuai. Seperti yang ditunjukkan oleh @Nik dalam komentar atas jawabannya,
"aeiouy".chars
adalah satu karakter kurang dari itu%w[a e i o u y]
, tetapi saya akan meninggalkan yang terakhir, untuk keberagaman, meskipun saya mempertaruhkan mimpi buruk atas kesempatan yang hilang.Sunting 2: Terima kasih kepada @OI karena telah menyarankan peningkatan:
yang menyimpan 11 karakter dari apa yang saya miliki sebelumnya.
Sunting 3 dan 3a: @OI telah menghapus beberapa hal lagi:
kemudian
dan lagi (3b):
Saya hanyalah juru tulis!
Berikut adalah dua solusi yang lebih rumit:
Awalnya saya punya:
s
adalah string yang berisi kata-kata, dipisahkan oleh baris baru. Sejumlah kata daris
yang berisi kelima vokal dikembalikan. Untuk pembaca yang tidak terbiasa dengan Ruby,%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]
dan&
merupakan persimpangan array.Seharusnya
Di blok
{...}
, awalnyajadi "singkatan" tidak dipilih.
Jika string
s
mungkin berisi duplikat,s.split.select...
bisa diganti dengans.split.uniq.select...
menghapus duplikat.Hanya melihat aku bisa menghemat 1 Char dengan mengganti
size==6
dengansize>5
.sumber
...size=5
adalah bug - seharusnya...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
s.split.select{|w|'aeiouy'.tr(w,'')==''}
. Saya cukup yakin Anda bisa mendapatkan ini di bawah 40 karakter jika Anda menggunakan logika nil dan metode String 'benar'. Masih mencari ...Haskell - 67
sumber
Ruby - 28 karakter (atau 27 jika
y
dikecualikan dari vokal)Perintah lengkap untuk menjalankan adalah (48 karakter):
EDIT: diganti
puts
denganp
seperti yang disarankan oleh @CarySwovelandsumber
%w[a e i o u]
akan menghemat 1 char,p
untukputs
, 3 lagi.p
, saya jarang menggunakannya. Adapun% w [], jika y termasuk dalam set vokal, versi dengan karakter masih lebih pendek."aeiouy".delete(s)==''
mungkin menghemat beberapa karakter.AWK - 29
Untuk menjalankan: Simpan daftar kata huruf kecil ke
wordlist.txt
. Lalu, lakukan:Jika sistem Anda tidak memiliki
mawk
,awk
dapat digunakan juga.Anda juga dapat menjalankannya dari file dengan menyimpan program ke
program.awk
dan melakukanmawk
atauawk
-f program.awk
.sumber
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 karakter
sumber
k [22-5 = 17 karakter]
Saya telah mengganti nama file "corncob_lowercase.txt" menjadi "w"
Hitung kata-kata [22 karakter]
Keluaran
Temukan semua kata [25 karakter]
Secara keseluruhan 43 kata berisi semua vokal
(a e i o u y)
Keluaran
sumber
Javascript / JScript 147 (152-5), 158 (163-5) atau 184 (189-5) byte:
Ini adalah versi Javascript dan JScript saya yang mengerikan "ungolfyfied" (
164152152-5 = 147 byte):function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}
Terima kasih @ GaurangTandon untuk
search()
fungsinya, yang menyelamatkan saya satu byte!RegExp berbasis dengan kinerja HORRIBLE , tetapi mendukung huruf besar dan kecil (163-5 = 158 byte):
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Berbasis RegExp dengan kinerja LEBIH BAIK , NAMUN membutuhkan lebih banyak byte (189-5 = 184 byte):
function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Yang ini hanya untuk bersenang-senang (175-5 byte) dan tidak akan dihitung sebagai jawaban:
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}
Ini didasarkan pada jawaban pertama, tetapi memiliki 'twist': Anda dapat mengetahui berapa kali sebuah kata telah ditemukan.
Anda cukup melakukan ini:
var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');
b.youaie //should be 4
Karena itu
length
tidak memiliki semua vokal, itu tidak akan dihapus dan masih akan menjadi jawaban untuk bonus.Bagaimana Anda menyebutnya?
"Sederhana": Anda membungkus fungsi di dalamnya
()
dan kemudian menambahkannya('string goes here');
sampai akhir.Seperti ini:
(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');
Contoh ini akan mengembalikan array hanya dengan 1 string: yoiuae
Saya tahu ini adalah solusi terburuk, tetapi berhasil!
Mengapa saya menghitung -5?
Nah, array Javascript / JScript memiliki properti (
length
) dalam array yang memberitahu jumlah elemen yang dimilikinya.Setelah dikonfirmasi dalam pertanyaan, bonus -5 adalah untuk memberi tahu jumlah kata.
Karena jumlah kata ada di properti itu, secara otomatis saya mendapat skor -5.
sumber
search()
bukannyaindexOf()
menyimpan 1 char..split()
aktif"aeiouy"
. JS loop atas array dan string dengan cara yang sama. (Menghapusnya menghemat Anda ~ 10 karakter)Ruby
3938Saat ini entri Ruby terpendek saat menghitung seluruh program termasuk input dan output.
Menyimpan char dengan menggunakan
map
alih-aliheach
:Versi lain, 39 karakter dengan output yang lebih cantik:
Kedua program mengambil input dari stdin atau sebagai nama file yang diteruskan sebagai argumen baris perintah:
$ ruby wovels.rb wordlist.txt
Harganya 3 karakter tambahan untuk dimasukkan
y
sebagai wovel.sumber
Enumerable#grep
untuk mempersingkat ini? misal,s.split.grep /a*e*i*o*u*y/
asumsis
adalah untaian kata-kata yang dipisahkan oleh baris baru..*
antara kedua sekop.s = "aeiouy\neiouay\nyuaioe\n"
. Kemudians.split.grep /a*e*i*o*u*y/
kembali["aeiouy", "eiouay", "yuaioe"]
untukku. Menguji dalampry
Ruby 2.0.0. Omong-omong, solusi yang bagus.grep
digunakan=~
, tetapi ternyata menggunakan===
. Kecurigaan saya adalah bahwa itu juga akan cocok dengan string yang tidak mengandung semua wovel, karena misalnya/e*a*i*o*u*y/=~"eioy"
berfungsi Saya benar-benar tidak mengerti apa yang sebenarnya dilakukan===
antara regex dan operator. Great ditemukan; Saya sarankan Anda mempostingnya sebagai jawaban sendiri. sunting Saya benar: coba dengan misalnya"heya"
.Mathematica (65 atau 314)
Dua pendekatan yang sangat berbeda, yang lebih baik diusulkan oleh Belisarius dalam komentar untuk tanggapan awal saya. Pertama, usaha saya yang brutal, yang secara algoritmik menghasilkan setiap kemungkinan ekspresi reguler yang cocok dengan kombinasi enam vokal (termasuk "y"), dan kemudian memeriksa setiap kata dalam daftar kata target dengan setiap 720 ekspresi reguler ini. Ini bekerja, tetapi tidak terlalu ringkas dan lambat.
~ 320 karakter. Beberapa dapat diselamatkan dengan menggunakan notasi alternatif, dan karakter tambahan hilang mempersiapkan file kamus sebagai daftar string (format alami untuk kamus dalam Mathematica. Bahasa lain mungkin tidak memerlukan persiapan ini, tetapi Mathematica melakukannya). Jika kita menghilangkan langkah itu, menganggapnya telah ditangani untuk kita, pendekatan yang sama dapat dilakukan dalam kurang dari 250 karakter, dan jika kita menggunakan kamus bawaan Mathematica, kita mendapatkan penghematan yang lebih besar,
Di bawah 200 karakter. Menghitung jumlah kata yang ditemukan hanya memerlukan melewati hasilnya
Length[Flatten[]]
, yang dapat ditambahkan di sekitar blok kode di atas, atau dapat dilakukan setelahnya dengan, misalnyaLength@Flatten@%
,. Daftar kata yang ditentukan untuk tantangan ini menghasilkan 43 pertandingan, dan kamus Mathematica memberikan 64 (dan jauh lebih cepat). Setiap kamus memiliki kata-kata yang cocok tidak di yang lain. Mathematica menemukan "secara tidak profesional," misalnya, yang tidak ada dalam daftar bersama, dan daftar bersama menemukan "eukariotik," yang tidak ada dalam kamus Mathematica.Belisarius mengusulkan solusi yang jauh lebih baik. Dengan asumsi daftar kata sudah disiapkan dan ditugaskan ke variabel
l
, ia mendefinisikan tes tunggal berdasarkanStringFreeQ[]
fungsi Mathematica , kemudian menerapkan tes ini ke daftar kata menggunakanPick[]
fungsi. 65 karakter, dan sekitar 400 kali lebih cepat dari pendekatan saya.sumber
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
Di manal
daftar kata-katay
sebagai vokal (sesuai persyaratan OP!)Perl 6 - 35 karakter
Terinspirasi oleh solusi Ruby @CarySwoveland:
Menyeleksi ini (
grep
s) setiap baris yang kembaliTrue
untuk<a e i o u y> ⊆ *.comb
, yang hanya cara mewah untuk meminta "adalah Set('a','e','i','o','u','y')
subset (⊆
) dari Set terdiri dari surat-surat input (*.comb
)?"Sebenarnya, keduanya
<a e i o u y>
dan*.comb
hanya membuatList
s:⊆
(atau(<=)
jika Anda terjebak di ASCII) mengubahnya menjadiSet
untuk Anda.Untuk mendapatkan jumlah baris yang dicetak, 42 karakter ini - 5 = 37 poin skrip akan menghasilkan itu juga:
sumber
C - 96 byte
Saya menghemat beberapa byte kurung berkat kebetulan yang beruntung dari prioritas operator.
sumber
Javascript - Skor = 124 - 5 = 119 !!!
Edit: 17/02/14
Terima kasih banyak kepada @Ismael Miguel karena membantu saya memotong ~ 12 karakter !
Saya menghapus bentuk fungsi notasi panah gemuk karena meskipun saya telah melihatnya mulai digunakan, itu tidak berfungsi. Tidak tahu kenapa ...
Untuk membuatnya bekerja:
Lewati semua kata yang dipisahkan oleh baris baru sebagai argumen ke fungsi seperti yang ditunjukkan di bawah ini.
Uji:
sumber
k="aeiouy".split("")
ke dalamfor(i in k)
lingkaran. Menggunakan;
bukannya baris baru menyimpan beberapa byte di Windows. Namun, saya tidak melihat bagaimana ini akan menangani daftar kata-kata. Dan bagaimana cara membuatnya bekerja.k="aeiouy";o=0;for(i in k)
, cobao=0;for(i in k='aeiouy')
. dan menggunakan byte menghemat, Anda dapat menggunakannya untuk mengubahnyao+=RegExp(k[i]).test(s)
menjadio+=RegExp(k[i],'i').test(s)
, mengambil satu byte lagi, tetapi bekerja dengan huruf besar dan kecil.Bash + coreutils, 39
Mengambil input dari stdin.
sumber
sed 29 chars
Memesan dipilih dari frekuensi Surat di wikipedia untuk mempercepat pemeriksaan.
Di host saya:
dan
sumber
Bash (grep) - 36 byte
Perhatikan urutan vokal yang diuji, paling tidak sering dulu. Untuk uji kasus, ini berjalan sekitar 3 kali lebih cepat dari pengujian agar dapat dilakukan. Dengan cara itu tes pertama menghilangkan sejumlah besar kata sehingga tes selanjutnya memiliki lebih sedikit pekerjaan yang harus dilakukan. Jelas ini tidak berpengaruh pada panjang kode. Banyak solusi lain yang diposting di sini akan mendapat manfaat yang sama dari melakukan tes dalam urutan ini.
sumber
D - 196
Tidak golf :
Penggunaan :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
harus mengandung kata daftar huruf kecil.sumber
Rebol (104 karakter)
Tidak golf:
d
sekarang berisi daftar kata-kata yang ditemukan. Berikut ini contoh dari konsol Rebol:sumber
Smalltalk (36/57 karakter)
untuk mendapatkan penghitungan, kirim #ukuran ke koleksi yang dihasilkan. Koleksi hasil mengandung 43 kata ('abstemiously' 'otoritatively' ... 'tidak diragukan lagi' 'unrecognisably')
Kode di atas memiliki 77 karakter, tetapi saya bisa mengganti nama file daftar kata menjadi 'w', jadi saya menghitung nama file sebagai 1 yang memberikan skor 57.
Apakah membaca file bagian dari masalah atau tidak? Jika tidak (lihat contoh lain), dan daftar kata sudah ada dalam koleksi c, maka kodenya berkurang menjadi:
yaitu 36 karakter (dengan spasi yang bisa dihilangkan dihapus).
sumber
diperbarui: ruang yang tidak perlu dihapus
Sangat lambat tetapi dalam bash (81 karakter):
EDIT:
echo $l|fold -w1
diganti denganfold -w1<<<$l
seperti yang disarankan oleh @ nyuszika7hsumber
fold -w1<<<$l
alih-alihecho $l|fold -w1
. Catatan: Kode saat ini adalah 84 karakter, Anda tidak harus menghitung baris tambahan.JavaScript - 95 byte
Ini golf saya.
Dan saya juga ingin menunjukkan bahwa golf Anda sepertinya tidak menemukan semua kemunculan vokal.
Tidak Terkumpul:
sumber
(?=.*a)
memeriksa apakaha
ada di suatu tempat di string.sortir + uniq + sed
Yang ini tidak cocok dengan kemunculan kata yang berulang. Itu juga tidak cocok dengan huruf 'y' jika ini terjadi pada awal kata.
sumber
Pesta
Tidak sesingkat OP, tetapi satu baris di Bash:
sumber
C # - 170
Diformat:
Tidak mood untuk menerapkan penghitungan tetapi harus mudah.Path ke daftar kata (versi huruf kecil) harus diteruskan ke program sebagai argumen pertama:Keluaran:
Saya mengambil kebebasan mengeluarkan dan memisahkan kata-kata; tak satu pun dari yang ditentukan dalam aturan (yang menyatakan "harus menemukan semua kata", bukan bagaimana (dan JIKA) untuk output).
Termasuk hitungan (+ output): 192 - 5 = 187
Keluaran:
(Catat penghitungan di akhir: 43)
Tidak ada output ("harus menemukan semua kata"): 137 - 5 = 132
(Membengkokkan aturan sedikit demi sedikit: tidak benar-benar) Ini menemukan semua kata dan penghitungan tersedia dengan mengeksekusi
r.Count()
.sumber
C-Sharp
Saya belum pernah melakukan ini sebelumnya dan saya tidak yakin apa prosedur postingnya. Tapi inilah yang saya pikirkan:
185 byte
wordList
= aList<string>
dari semua kata.jika Anda ingin menampilkan total:
219 - 5 = 214 byte
Diperluas
sumber
vb.net (Nilai 91 = 96c - 5) * 0
* 0 + 49c mnt
Ini menciptakan enumerasi yang berisi semua kata yang berisi semua vokal.
sumber
Your program must find all the words in this wordlist
. Ini a) bukan program tetapi potongan program dan b) tidak membaca / menggunakan daftar kata.Mathematica -
136102Tautan yang disingkat pergi ke http://www.mieliestronk.com/corncob_lowercase.txt
sumber
http://bit.ly/1iZE9kY
.Characters["aeiou"]
atau lebih jika Anda sertakany
.