Temukan kata yang mengandung setiap vokal


28

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.


11
profil seperti itu. banyak gambar. sangat doge. Wow.
Gagang Pintu

2
17 jawaban dan terus bertambah! Saya ingin melihat lebih banyak pertanyaan seperti pertanyaan Anda di cg, doc. Seringkali saya akan melihat sesuatu yang menarik di sini, tetapi tidak memiliki beberapa jam waktu yang dibutuhkan untuk menghasilkan solusi yang layak ...
Cary Swoveland

2
Ya, tapi itu bukan bahasa yang didedikasikan untuk menemukan vokal.
TheDoctor

1
@TheDoctor Shakes fist
Jason C

2
jika memiliki bonus, maka itu bukan kode-golf. Gunakan tantangan kode sebagai gantinya.
Tim Seguine

Jawaban:


7

GolfScript, 20 karakter - 5 = 15 poin

n%{'aeiouy'\-!},.,+`

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 lebih n*).

Inilah hasilnya, diberikan daftar kata huruf kecil sebagai input (linebreak dimasukkan untuk dibaca):

["abstemiously" "authoritatively" "behaviourally" "consequentially" "counterrevolutionary"
"disadvantageously" "educationally" "encouragingly" "eukaryotic" "evolutionarily"
"evolutionary" "exclusionary" "facetiously" "gregariously" "heterosexuality" "homosexuality"
"importunately" "inconsequentially" "instantaneously" "insurrectionary" "intravenously"
"manoeuvrability" "neurologically" "neurotically" "ostentatiously" "pertinaciously"
"precariously" "precautionary" "questionably" "revolutionary" "simultaneously"
"supersonically" "tenaciously" "uncomplimentary" "uncontroversially" "unconventionally"
"undemocratically" "unemotionally" "unequivocally" "uninformatively" "unintentionally"
"unquestionably" "unrecognisably" 43]

(Mz. Secara teknis, mengingat bahwa tantangannya hanya mengatakan bahwa kode harus bekerja untuk input spesifik ini, n%{'aeiouy'\-!},`43akan 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.
    • Di dalam loop, 'aeiouy'\-ambil string literal aeiouydan menghapus setiap karakter yang ditemukan dalam kata kandidat. The !maka secara logis meniadakan string yang dihasilkan, menghasilkan 1(benar) jika string kosong dan 0(palsu) jika tidak.
  • .,+ membuat salinan array yang difilter, menghitung jumlah kata di dalamnya, dan menambahkan hasilnya ke array asli.
  • Akhirnya, `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.)

Selamat !! jawaban terkecil !!!!
TheDoctor

abstemiously dan facetiously adalah satu-satunya kata dengan semua 6 vokal dalam urutan Kupikir aku akan membagikannya denganmu. Saya menemukan itu keren.
dberm22

15

GolfScript, 19 karakter

n%{'aeiouy'&,6=},n*

Pemakaian:

golfscript vowels.gs < wordlist.txt

Keluaran:

abstemiously
authoritatively
behaviourally
[...]
uninformatively
unintentionally
unquestionably
unrecognisably

Jika Anda juga ingin menampilkan jumlah pada akhirnya Anda dapat menggunakan

n%{'aeiouy'&,6=},.n*n@,

yang empat karakter lebih panjang.


1
Saya suka itu! Mungkin 4 chars lebih lama, tapi itu memberi Anda bonus -5 pt
TheDoctor

11

Python - 46 karakter

filter(lambda x:set(x)>=set("AEIOUY"),open(f))

Versi yang mudah dibaca: Ini sudah cukup mudah dibaca :-)


8

APL, 21 - 5 = 16

(,≢)w/⍨∧⌿'aeiouy'∘.∊w

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

         'aeiouy'∘.∊w   # generate a truth table for every vowel ∊ every word
       ∧⌿               # reduce with ∧ along the rows (vowels)
    w/⍨                 # select the words that contain all the vowels
(,≢)                    # hook: append to the list its own tally

8

Ruby 38

Sunting 34: Terbaik sejauh ini (dari @OI):

a.split.select{|w|'aeiouy'.count(w)>5} 

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".charsadalah 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:

s.split.select{|w|'aeiouy'.delete(w)==''}

yang menyimpan 11 karakter dari apa yang saya miliki sebelumnya.

Sunting 3 dan 3a: @OI telah menghapus beberapa hal lagi:

s.split.select{|w|'aeiouy'.tr(w,'')==''}

kemudian

s.split.reject{|w|'aeiouy'.tr(w,'')[1]}

dan lagi (3b):

a.split.select{|w|'aeiouy'.count(w)>5} 

Saya hanyalah juru tulis!

Berikut adalah dua solusi yang lebih rumit:

s.split.group_by{|w|'aeiouy'.delete(w)}['']       (43)
s.gsub(/(.+)\n/){|w|'aeiouy'.delete(w)==''?w:''} (48)

Awalnya saya punya:

s.split.select{|w|(w.chars&%w[a e i o u y]).size==6}

sadalah string yang berisi kata-kata, dipisahkan oleh baris baru. Sejumlah kata dari syang 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

s = "abbreviations\nabduction\n"
s.split #=> ["abbreviations", "abduction"] 

Di blok {...}, awalnya

w             #=> "abbreviations"
w.chars       #=> ["a", "b", "b", "r", "e", "v", "i", "a", "t", "i", "o", "n", "s"]
w.chars & %w[a e i o u y] #=> ["a", "e", "i", "o"]
(w.chars & %w[a e i o u y]).size == 6 #=> (4 == 6) => false,

jadi "singkatan" tidak dipilih.

Jika string smungkin berisi duplikat, s.split.select...bisa diganti dengan s.split.uniq.select...menghapus duplikat.

Hanya melihat aku bisa menghemat 1 Char dengan mengganti size==6dengan size>5.


1
...size=5adalah bug - seharusnya...size==5
Uri Agassi

Terima kasih, @Uri, untuk menunjukkan kesalahan ketik pada baris pertama, yang telah saya perbaiki (bukan bug - lihat baris di atas 'jadi "singkatan" tidak dipilih').
Cary Swoveland

@CarySwoveland Anda dapat menyelamatkan 11 karakter dengan melakukan ini:s.split.select{|w|'aeiouy'.delete(w)==''}
OI

Itu bagus, @OI. Saya telah melakukan edit dan menemukan tempat yang ada di sel abu-abu.
Cary Swoveland

@CarySwoveland ini akan menghemat 1 lebih banyak karakter: 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 ...
OI

6

Haskell - 67

main=interact$unlines.filter(and.flip map "aeiouy".flip elem).lines

2
Ini adalah kode-golf , Anda harus mencoba membuat kode lebih pendek, misalnya, dengan menghapus spasi ...
mniip

6

Ruby - 28 karakter (atau 27 jika ydikecualikan dari vokal)

("ieaouy".chars-s.chars)==[]

Perintah lengkap untuk menjalankan adalah (48 karakter):

ruby -nle 'p $_ if ("ieaouy".chars-$_.chars)==[]'

EDIT: diganti putsdengan pseperti yang disarankan oleh @CarySwoveland


Bagus, @Nik. %w[a e i o u]akan menghemat 1 char, puntuk puts, 3 lagi.
Cary Swoveland

Terima kasih, @CarySwoveland! Saya lupa p, saya jarang menggunakannya. Adapun% w [], jika y termasuk dalam set vokal, versi dengan karakter masih lebih pendek.
Nik O'Lai

@ NikO'Lai "aeiouy".delete(s)==''mungkin menghemat beberapa karakter.
OI

Sangat bagus! Kirimkan sebagai solusi Anda sendiri, @OI. Saya akan
mendukungnya

4

AWK - 29

/ a / && / e / && / i / && / o / && / u / && / y /

Untuk menjalankan: Simpan daftar kata huruf kecil ke wordlist.txt . Lalu, lakukan:

mawk "/ a / && / e / && / i / && / o / && / u / && / y /" wordlist.txt

Jika sistem Anda tidak memiliki mawk,awk dapat digunakan juga.

Anda juga dapat menjalankannya dari file dengan menyimpan program ke program.awkdan melakukan mawkatau awk -f program.awk.


Memilih pesanan yang tepat mempercepat pekerjaan: '/y/&&/u/&&/i/&&/o/&&/a/&&/e/'!!
F. Hauri

4

Python, 45 karakter

[w for w in open(f) if set('aeiouy')<=set(w)]

3

k [22-5 = 17 karakter]

Saya telah mengganti nama file "corncob_lowercase.txt" menjadi "w"

Hitung kata-kata [22 karakter]

+/min'"aeiouy"in/:0:`w

Keluaran

43

Temukan semua kata [25 karakter]

x@&min'"aeiouy"in/:x:0:`w

Secara keseluruhan 43 kata berisi semua vokal (a e i o u y)

Keluaran

"abstemiously"
"authoritatively"
"behaviourally"
..
..
"unintentionally"
"unquestionably"
"unrecognisably"

3

Javascript / JScript 147 (152-5), 158 (163-5) atau 184 (189-5) byte:

Ini adalah versi Javascript dan JScript saya yang mengerikan "ungolfyfied" (164 152 152-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 lengthtidak 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.


Mungkin tertarik search()bukannya indexOf()menyimpan 1 char.
Gaurang Tandon

Selanjutnya, Sejauh yang saya bisa lihat, dalam versi terpendek Anda, Anda tidak perlu .split()aktif "aeiouy". JS loop atas array dan string dengan cara yang sama. (Menghapusnya menghemat Anda ~ 10 karakter)
Gaurang Tandon

2

Ruby 39 38

Saat ini entri Ruby terpendek saat menghitung seluruh program termasuk input dan output.

Menyimpan char dengan menggunakan mapalih-alih each:

$<.map{|w|w*5=~/a.*e.*i.*o.*u/m&&p(w)}

Versi lain, 39 karakter dengan output yang lebih cantik:

puts$<.select{|w|w*5=~/a.*e.*i.*o.*u/m}

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 ysebagai wovel.


Pokoknya gunakan Enumerable#grepuntuk mempersingkat ini? misal, s.split.grep /a*e*i*o*u*y/asumsi sadalah untaian kata-kata yang dipisahkan oleh baris baru.
OI

@ OI Sebuah ide yang menarik, tetapi akan membutuhkan beberapa mengutak-atik karena regex memiliki sekop dalam urutan tetap. Itu sebabnya saya ulangi string 5 kali sebelum mencocokkannya, dengan di .*antara kedua sekop.
daniero

Bisakah Anda mengklarifikasi? Misalkan s = "aeiouy\neiouay\nyuaioe\n". Kemudian s.split.grep /a*e*i*o*u*y/kembali ["aeiouy", "eiouay", "yuaioe"]untukku. Menguji dalam pryRuby 2.0.0. Omong-omong, solusi yang bagus.
OI

@ OI Oh wow, saya berasumsi operator yang grepdigunakan =~, 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".
daniero

Saya pikir Anda benar bahwa regex perlu mengutak-atik. Saya menemukan case edge yang tidak mengandung semua vokal yang bocor. Mungkin terlalu bagus untuk menjadi kenyataan.
OI

2

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.

b = Permutations[{"a", "e", "i", "o", "u","y"}]; Table[
 Select[StringSplit[
  URLFetch["http://www.mieliestronk.com/corncob_lowercase.txt"]], 
  StringMatchQ[#, (___ ~~ b[[i]][[1]] ~~ ___ ~~ 
      b[[i]][[2]] ~~ ___ ~~ b[[i]][[3]] ~~ ___ ~~ 
      b[[i]][[4]] ~~ ___ ~~ b[[i]][[5]]~~ ___ ~~ b[[i]][[6]] ~~ ___)] &], {i, 1, 
  Length[b]}]

~ 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,

Map[DictionaryLookup[(___ ~~ #[[1]] ~~ ___ ~~ #[[2]] ~~ ___ ~~ #[[3]] 
~~ ___ ~~ #[[4]] ~~ ___ ~~ #[[5]]~~ ___ ~~ #[[6]] ~~ ___) .., IgnoreCase -> True] &, 
 Permutations[{"a", "e", "i", "o", "u","y"}]]

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, misalnya Length@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 berdasarkan StringFreeQ[]fungsi Mathematica , kemudian menerapkan tes ini ke daftar kata menggunakan Pick[]fungsi. 65 karakter, dan sekitar 400 kali lebih cepat dari pendekatan saya.

f@u_ := And @@ (! StringFreeQ[u, #] & /@ Characters@"aeiouy"); Pick[l,f /@ l]

Dalam 65 karakter: f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]Di mana ldaftar kata-kata
Dr. belisarius

Itu karena Anda lupa untuk menganggapnya ysebagai vokal (sesuai persyaratan OP!)
Dr. belisarius

@belisarius ya, saya perhatikan setelah berkomentar. Saya memeriksa hasil saya dengan perbaikan itu.
Michael Stern

@belisarius mengonfirmasi - solusi Anda jauh lebih ringkas dan lebih cepat daripada milik saya. Mengapa Anda tidak mempostingnya sebagai solusi sendiri? Saya akan memilih itu.
Michael Stern

Terima kasih! Jika Anda suka, edit jawaban Anda termasuk itu. Bagi saya ini semua tentang menemukan solusi singkat dengan bahasa, tidak mengumpulkan perwakilan :)
Dr. belisarius

2

Perl 6 - 35 karakter

Terinspirasi oleh solusi Ruby @CarySwoveland:

say grep <a e i o u y>⊆*.comb,lines

Menyeleksi ini ( greps) setiap baris yang kembali Trueuntuk <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 *.combhanya membuat Lists: (atau (<=)jika Anda terjebak di ASCII) mengubahnya menjadi Setuntuk Anda.

Untuk mendapatkan jumlah baris yang dicetak, 42 karakter ini - 5 = 37 poin skrip akan menghasilkan itu juga:

say +lines.grep(<a e i o u y>⊆*.comb)».say

2

C - 96 byte

 char*gets(),*i,j[42];main(p){while(p=0,i=gets(j)){while(*i)p|=1<<*i++-96;~p&35684898||puts(j);}}

Saya menghemat beberapa byte kurung berkat kebetulan yang beruntung dari prioritas operator.


2

Javascript - Skor = 124 - 5 = 119 !!!

Edit: 17/02/14

function(l){z=[],l=l.split("\n"),t=0;while(r=l[t++]){o=0;for(i in k="aeiouy")o+=!~r.search(k[i]);if(o==0)z.push(r)}return z}

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:

// string is "facetiously\nabstemiously\nhello\nauthoritatively\nbye"

var answer = (function(l){z=[],l=l.split("\n"),t=0;while(r=l[t++]){o=0;for(i in k="aeiouy")o+=!~r.search(k[i]);if(o==0)z.push(r)}return z})("facetiously\nabstemiously\nhello\nauthoritatively\nbye")

console.log(answer);
console.log(answer.length);

/* output ->    
    ["facetiously", "abstemiously", "authoritatively"]
    3 // count
*/


Kesalahan sintaks pada baris 1: ekspresi yang diharapkan, didapat '>' c = (s, j) => {k = "aeiouy" .split ("
Ismael Miguel

1
Anda dapat mengurangi jika dengan pindah k="aeiouy".split("")ke dalam for(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.
Ismael Miguel

@ IsmaelMiguel Saya tahu itu (notasi panah gemuk) tidak berfungsi. Tetapi karena saya telah melihatnya digunakan di sini, jadi saya menggunakannya karena menghemat biaya. Tapi saya menghapusnya. Dan saya tidak mengerti tip Anda, terima kasih sudah memeriksa kode. Memasukkan tip byte Anda. Dan program baru saya seharusnya bisa menghapus keraguan Anda. Terima kasih sudah membaca. :)
Gaurang Tandon

Alih-alih k="aeiouy";o=0;for(i in k), coba o=0;for(i in k='aeiouy'). dan menggunakan byte menghemat, Anda dapat menggunakannya untuk mengubahnya o+=RegExp(k[i]).test(s)menjadi o+=RegExp(k[i],'i').test(s), mengambil satu byte lagi, tetapi bekerja dengan huruf besar dan kecil.
Ismael Miguel

Diperbarui dengan algoritma yang lebih baik. Meskipun saya sekarang mengerti ide Anda, tetapi saya tidak mengerti mengapa itu bekerja di sini dan tidak di sini . Tolong bantu! Terima kasih :)
Gaurang Tandon

2

Bash + coreutils, 39

eval cat`printf "|grep %s" a e i o u y`

Mengambil input dari stdin.


Ini terlihat memenuhi syarat untuk bonus 5 poin.
Glenn Randers-Pehrson

@ GlennRanders-Pehrson Bonus itu tidak masuk akal bagi saya sama sekali ;-)
Digital Trauma

Entah masuk akal atau tidak, Anda memancarkan 86 baris dengan benar saat memproses file yang berisi dua salinan daftar kata. Solusi semacam itu dan hanya melaporkan 43 tidak akan mendapatkan bonus, seperti yang saya mengerti.
Glenn Randers-Pehrson

2

sed 29 chars

/y/{/u/{/o/{/i/{/a/{/e/p}}}}}

Memesan dipilih dari frekuensi Surat di wikipedia untuk mempercepat pemeriksaan.

Di host saya:

time sed -ne '/a/{/e/{/i/{/o/{/u/{/y/p}}}}}' </usr/share/dict/american-english >/dev/null 
real    0m0.046s

dan

time sed -ne '/y/{/u/{/i/{/o/{/a/{/e/p}}}}}'</usr/share/dict/american-english >/dev/null 
real    0m0.030s

1
Bagus (+1), tapi saya pikir Anda harus memasukkan "sed -n" dalam skrip, untuk hitungan 36 byte.
Glenn Randers-Pehrson

2

Bash (grep) - 36 byte

g=grep;$g y|$g u|$g o|$g i|$g a|$g e

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.


Mengapa kami tidak menemukan, tidak menghitung? Juga, apakah kita menghitung kode input ke dalam jumlah karakter?
orion

Saya tidak begitu mengerti bonusnya, "-5 poin untuk menghitung semua kemunculan kata". Jika itu benar-benar berarti "melaporkan semua kemunculan kata", itulah yang dilakukan skrip saya, tanpa "| wc". Saya tidak menggunakan "kode input" karena grep membaca input standar, jadi "grep" adalah "kode input" dan saya menghitungnya. Saya akan menghapus "| wc" sekarang.
Glenn Randers-Pehrson

Saya telah menafikan bonus.
Glenn Randers-Pehrson

1

D - 196

import std.regex,std.stream;void main(string[]a){auto f=new File(a[1]);while(!f.eof)if(!(a[0]=f.readLine.idup).match("(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*").empty)std.stdio.writeln(a[0]);}

Tidak golf :

import std.regex, std.stream;

void main( string[] a )
{
    auto f = new File( a[1] );

    while( !f.eof )
        if( !( a[0] = f.readLine.idup ).match( "(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*" ).empty )
            std.stdio.writeln( a[0] );
}

Penggunaan :C:\>rdmd vowels.d wordlist.txt

wordlist.txt harus mengandung kata daftar huruf kecil.


1

Rebol (104 karakter)

remove-each w d: read/lines %wordlist.txt[6 != length? collect[foreach n"aeiouy"[if find w n[keep n]]]]

Tidak golf:

remove-each w d: read/lines %wordlist.txt [
    6 != length? collect [foreach n "aeiouy" [if find w n [keep n]]]
]

dsekarang berisi daftar kata-kata yang ditemukan. Berikut ini contoh dari konsol Rebol:

>> ; paste in golf line.  This (REMOVE-EACH) returns the numbers of words removed from list

>> remove-each w d: read/lines %wordlist.txt[6 != length? collect[foreach n"aeiouy"[if find w n[keep n]]]]
== 58067

>> length? d
== 43

1

Smalltalk (36/57 karakter)

'corncob_lowercase.txt' asFilename contents select:[:w | w includesAll:'aeiouy']

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:

c select:[:w | w includesAll:'aeiouy']

yaitu 36 karakter (dengan spasi yang bisa dihilangkan dihapus).


1

diperbarui: ruang yang tidak perlu dihapus

Sangat lambat tetapi dalam bash (81 karakter):

while read l;do [ `fold -w1<<<$l|sort -u|tr -dc ieaouy|wc -m` = 6 ]&&echo $l;done

EDIT: echo $l|fold -w1diganti dengan fold -w1<<<$lseperti yang disarankan oleh @ nyuszika7h


Ini adalah kode golf, Anda mungkin ingin memperkecil sedikit kode Anda. Mulailah dengan menghapus spasi yang tidak dibutuhkan. ;)
nyuszika7h

Anda selanjutnya dapat memperkecil kode dengan menggunakan fold -w1<<<$lalih-alih echo $l|fold -w1. Catatan: Kode saat ini adalah 84 karakter, Anda tidak harus menghitung baris tambahan.
nyuszika7h

Sampai hari ini saya tidak tahu apa-apa tentang <<<. Sekali lagi terima kasih, @ nyuszika7h. Bisakah Anda memberi tahu saya, di mana dijelaskan.
Nik O'Lai


1

JavaScript - 95 byte

Ini golf saya.

function f(s){return[var a=s.match(/^(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*/),a.length];}

Dan saya juga ingin menunjukkan bahwa golf Anda sepertinya tidak menemukan semua kemunculan vokal.

Tidak Terkumpul:

function countVowels(string) {
  var regex   = /^(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*/;
  var matches = string.match(regex);
  var length  = matches.length;
  return [matches, length];

1
Baca spec lebih hati-hati. Dia mencari kata-kata yang --- seperti dengan ceroboh --- mengandung semua vokal dalam satu kata. Meskipun dia tidak bersikeras bahwa mereka terkandung dalam urutan seperti dalam bercanda.
dmckee

1
Regex Anda salah. Semua yang melihat ke depan secara efektif memeriksa apakah karakter pertama adalah vokal. Anda perlu (?=.*a)memeriksa apakah aada di suatu tempat di string.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ dmckee Itu sebabnya saya menggunakan lookaheads . Mereka tidak memerlukan pesanan khusus.
Isiah Meadows

@nhahtdh Terima kasih atas tangkapannya
Isiah Meadows

1

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.

sort wordlist.txt | uniq | sed -n '/a/p' | sed -n '/e/p' | sed -n '/i/p' | sed -n '/o/p' | sed -n '/u/p' | sed -nr '/^[^y]+y/p' 

Seperti pada jawaban Anda yang lain, ganti "sort wordlist.txt | uniq" dengan "sort -u wordlist.txt" untuk menyimpan 4 byte.
Glenn Randers-Pehrson

1

Pesta

Tidak sesingkat OP, tetapi satu baris di Bash:

while read p; do if [ $(sed 's/[^aeiouy]//g' <<< $p | fold -w1 | sort | uniq | wc -l) -eq 6 ] ; then echo $p; fi; done < wordlist.txt

Anda dapat menyimpan empat byte dengan mengganti "sort | uniq" dengan "sort -u"
Glenn Randers-Pehrson

Anda juga dapat menghapus spasi dari "|" dan ";" untuk menyimpan beberapa byte lagi
Glenn Randers-Pehrson

1

C # - 170

using System.Linq;class P{static void Main(string[]a){System.Console.Write(string.Join(",",System.IO.File.ReadAllLines(a[0]).Where(w=>"aeiouy".All(c=>w.Contains(c)))));}}

Diformat:

using System.Linq;
class P
{
    static void Main(string[] a) { 
        System.Console.Write(
            string.Join(",", System.IO.File.ReadAllLines(a[0])
                .Where(w => "aeiouy".All(c => w.Contains(c))))); 
    }
}

Tidak mood untuk menerapkan penghitungan huhtetapi harus mudah. Path ke daftar kata (versi huruf kecil) harus diteruskan ke program sebagai argumen pertama:

program.exe D:\foo\bar\corncob_lowercase.txt

Keluaran:

abstemiously,authoritatively,behaviourally,consequentially,counterrevolutionary,
disadvantageously,educationally,encouragingly,eukaryotic,evolutionarily,evolutio
nary,exclusionary,facetiously,gregariously,heterosexuality,homosexuality,importu
nately,inconsequentially,instantaneously,insurrectionary,intravenously,manoeuvra
bility,neurologically,neurotically,ostentatiously,pertinaciously,precariously,pr
ecautionary,questionably,revolutionary,simultaneously,supersonically,tenaciously
,uncomplimentary,uncontroversially,unconventionally,undemocratically,unemotional
ly,unequivocally,uninformatively,unintentionally,unquestionably,unrecognisably

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

using System.Linq;class P{static void Main(string[]a){var r=System.IO.File.ReadAllLines(a[0]).Where(w=>"aeiouy".All(c=>w.Contains(c)));System.Console.Write(string.Join(",",r)+" "+r.Count());}}

Keluaran:

abstemiously,authoritatively,behaviourally,consequentially,counterrevolutionary,
disadvantageously,educationally,encouragingly,eukaryotic,evolutionarily,evolutio
nary,exclusionary,facetiously,gregariously,heterosexuality,homosexuality,importu
nately,inconsequentially,instantaneously,insurrectionary,intravenously,manoeuvra
bility,neurologically,neurotically,ostentatiously,pertinaciously,precariously,pr
ecautionary,questionably,revolutionary,simultaneously,supersonically,tenaciously
,uncomplimentary,uncontroversially,unconventionally,undemocratically,unemotional
ly,unequivocally,uninformatively,unintentionally,unquestionably,unrecognisably 4
3

(Catat penghitungan di akhir: 43)

Tidak ada output ("harus menemukan semua kata"): 137 - 5 = 132

using System.Linq;class P{static void Main(string[]a){var r=System.IO.File.ReadAllLines(a[0]).Where(w=>"aeiouy".All(c=>w.Contains(c)));}}

(Membengkokkan aturan sedikit demi sedikit: tidak benar-benar) Ini menemukan semua kata dan penghitungan tersedia dengan mengeksekusi r.Count().


1

C-Sharp

Saya belum pernah melakukan ini sebelumnya dan saya tidak yakin apa prosedur postingnya. Tapi inilah yang saya pikirkan:

185 byte

Action<string>x=(s=>s.Split('\n').ToList().ForEach(w=>{if("aeiouy".All(v=>w.Contains(v)))Console.Write(w);}));using(var s=new StreamReader(@"C:\corncob_lowercase.txt"))x(s.ReadToEnd());

wordList= a List<string>dari semua kata.

jika Anda ingin menampilkan total:

219 - 5 = 214 byte

Action<string>x=(s=>{var t=0;s.Split('\n').ToList().ForEach(w=>{if("aeiouy".All(v=>w.Contains(v))){Console.Write(w);t++;}});Console.Write(t);});using(var s=new StreamReader(@"C:\corncob_lowercase.txt"))x(s.ReadToEnd());


Diperluas

// init
var words = "";
var vowels = "aeiouy";
var total = 0;

using (var stream = new StreamReader(@"C:\corncob_lowercase.txt"))
{
    // read file
    words = stream.ReadToEnd();

    // convert word to List<string>
    var wordList = words.Split('\n').ToList();

    // loop through each word in the list
    foreach (var word in wordList)

        // check if the current word contains all the vowels
        if(vowels.All (w => word.ToCharArray().Contains(w)))
        {
            // Count total
            total += 1;
            // Output word
            Console.Write(word);
        }

    // Display total
    Console.WriteLine(total);
}

Umumnya jika pertanyaannya meminta "program", Anda harus memposting program lengkap Anda termasuk memuat / inisialisasi, dll. Kerja bagus kalau tidak!
ProgrammerDan

Oh oke. Jadi dalam versi yang diperkecil, saya harus menyertakan semuanya, bukan hanya baris yang memenuhi persyaratan? Saya pikir itu adalah jawaban terakhir dari jawaban lain karena mereka tidak memiliki kode untuk memuat / membaca file txt.
jzm

Anda akan melihat variasi pendekatan, dan mengingat usia kurasi jawaban cenderung tidak sekuat pada jawaban baru, tetapi secara umum jika pertanyaannya meminta "program" itu harus dapat dikompilasi dan dapat dijalankan seperti yang diposting. Ambil contoh dalam pertanyaan itu sendiri - itu adalah solusi yang lengkap dan dapat dieksekusi, yang berdiri sendiri.
ProgrammerDan

ahh benar. baik, dalam hal ini saya telah memperbarui 2 versi singkat menjadi mandiri.
jzm

Besar! Pastikan untuk memperbarui teks jawaban Anda (Anda menyebutkan "tanpa memuat / membaca") dan menghitung skor Anda.
ProgrammerDan

1

vb.net (Nilai 91 = 96c - 5) * 0

* 0 + 49c mnt

Ini menciptakan enumerasi yang berisi semua kata yang berisi semua vokal.

Dim r=IO.File.ReadLines(a(0)).Where(Function(w)"aeiou".Intersect(w).Count=5)
Dim c=r.Count

Your program must find all the words in this wordlist. Ini a) bukan program tetapi potongan program dan b) tidak membaca / menggunakan daftar kata.
RobIII

@RobIII vb.net memiliki minimum 49c untuk program konsol dasar. Argumen untuk program (dalam hal ini daftar kata) adalah array a . Plus seperti yang ditunjukkan beberapa orang lainnya, ini adalah program yang valid di LinqPad.
Adam Speight

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.