Her ünlü harfini içeren kelimeleri bul


28

Programınız tüm kelimeleri bulmak zorundadır bu wordlist tüm sesli harfleri ihtiva ( a e i o u y). Bunu yapmanın kolay yolları var, ama en kısa cevabı arıyorum. Herhangi bir dili alacağım, ama Bash'i görmek istiyorum.

İşte bir örnek (daha da geliştirilebilir):

cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"

Puanınız kodun uzunluğu.

Kelimenin tüm oluşumlarını saymak için -5 puan.

En düşük puan kazanır.


11
böyle bir profil. birçok resim çok doge. vay.
Doorknob

2
17 cevap ve sayılıyor! Sizinki gibi daha fazla soruyu da görmek istiyorum cg, doc. Sık sık burada ilginç bir şey göreceğim, ancak düzgün bir çözüm üretmek için gereken birkaç saatim yok ...
Cary Swoveland

2
Evet, ancak ünlüleri bulmak için adanmış bir dil olamaz.
Doktor

1
@TheDoctor yumruk
Jason C

2
bonus varsa, o zaman kod golf değildir. Bunun yerine kod mücadelesini kullanın.
Tim Seguine,

Yanıtlar:


7

GolfScript, 20 karakter - 5 = 15 puan

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

Howard'ın çözümüne dayanarak , ancak daha kısa bir test ( \-!bir karakterin üzerinde tasarruf sağlar &,6=), daha kısa uzunluk ekleme ( .,+= 3 karakter) ve daha kısa çıkış formatlama (hiç kimsenin çıkışın newline ile ayrılmış olması gerektiğini söylemedi, bu nedenle `bir karakterin üzerinde tasarruf sağlar n*).

İşte girdi olarak küçük harfli kelime listesi verilen çıktı (okunabilirlik için eklenen satır çubukları):

["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]

(Ps. Teknik olarak, zorluğun sadece kodun bu belirli girdi için çalışması n%{'aeiouy'\-!},`43gerektiğini söylediği göz önüne alındığında, henüz bir karakterden daha kısa olacağını söyleyebilirim. Yine de hile yapmayı düşünüyorum.)


Açıklama:

  • n% yeni satırlardaki girişi bir diziye böler.
  • { }, bir "grep" operatörüdür, dizinin her bir elemanı için parantezler arasında kod yürüten ve bunun gerçek bir değer döndürdüğünü seçen bir operatördür.
    • Döngünün içinde, 'aeiouy'\-değişmez dizeyi alır aeiouyve aday kelimede bulunan her karakteri ondan kaldırır. Ardından !, sonuçta ortaya çıkan dizgeyi mantıksal olarak olumsuzlar, dizge 1boşsa 0(true), değilse (false) verir.
  • .,+ Filtrelenen dizinin bir kopyasını yapar, içindeki kelimelerin sayısını sayar ve sonucu orijinal diziye ekler.
  • Son olarak `diziyi serbest bırakır, içeriğini dizge temsiline dönüştürür. (Onsuz, dizideki kelimeler çıktıda birleştirilerek okunamaz bir karışıklık elde edilir.)

Tebrikler!! en küçük cevap !!!!
Doktor

iddialı ve özenli bir şekilde sırayla tüm 6 ünlü olan tek kelimedir. Sadece bunu seninle paylaşacağımı düşündüm. Çok havalı buldum.
dberm22

15

GolfScript, 19 karakter

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

Kullanımı:

golfscript vowels.gs < wordlist.txt

Çıktı:

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

Ayrıca sayımın sonunda çıktısını almak istiyorsanız,

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

dört karakter daha uzun.


1
Bunu sevdim! 4 karakter daha uzun olabilir, ancak bu size 5 puanlık bonus kazandırır
TheDoctor

11

Python - 46 karakter

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

Okunabilir sürüm: zaten oldukça okunabilir :-)


8

APL, 21 - 5 = 16

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

Kelimelerinin listesini bulmayı bekler w. Tüm ünlü harfleri içeren kelimelerin bir listesini ve sayılarını döndürür. Ngn apl ile test edilmiştir . İşte bir örnek .

açıklama

         '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

Yakut 38

Düzenleme 34: Şimdiye kadarki en iyi (@OI'den):

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

Düzenleme 1: Sadece 'y' nin ünlüler arasına girmesini istediğim soruyu fark ettim. @Nik'in cevabına yaptığı bir yorumda işaret ettiği gibi "aeiouy".chars, bir karakterden daha az karakter var %w[a e i o u y], ama ben, fırsattan dolayı kabusları riske atmasam da , çeşitlilik için ikincisini bırakacağım.

Düzenleme 2: Geliştirmeyi önerdiğiniz için @OI'ye teşekkür ederiz:

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

daha önce sahip olduklarımdan 11 karakter kaydeder.

Düzenleme 3 ve 3a: @OI birkaç tane daha kazandı:

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

sonra

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

ve tekrar (3b):

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

Ben sadece bir yazarım!

İşte iki rakipsiz çözüm daha:

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

İlk başta:

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

snewlines ile ayrılmış kelimeleri içeren bir dizedir. sOndan beş sesli harf içeren bir sözcük dizisi döndürülür. Ruby'yi tanımayan okuyucular için%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"] ve &dizi kesişimi .

varsaymak

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

Blokta {...}, başlangıçta

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,

yani "kısaltmalar" seçilmemiştir.

Dize skopya içeriyorsa s.split.select..., ile değiştirilebilirs.split.uniq.select... kaldırmak .

Tıpkı değiştirerek 1 kömürü kurtarabilecek fark size==6ile size>5.


1
...size=5bir hata - olmalıdır...size==5
Uri Agassi

Teşekkürler, @Uri, yazdığım ilk satırdaki yazım hatasını belirttiğim için düzelttim (bir hata değil - 'yukarıdaki "bu yüzden" kısaltmalar "seçili değil).
Cary Swoveland

@CarySwoveland Bunu yaparak kendiniz 11 karakter kaydedebilirsiniz:s.split.select{|w|'aeiouy'.delete(w)==''}
OI

Bu harika, @OI. Bir düzenleme yaptım ve gri hücrelerde bir yer buldum.
Cary Swoveland,

@CarySwoveland Bu 1 fazla karakter kazandıracak: s.split.select{|w|'aeiouy'.tr(w,'')==''}. Nil mantığı ve 'right' String metodunu kullanırsanız bunu 40 karakterin altında bulabileceğinize eminim. Hala bakıyorum ...
OI

6

Haskell - 67

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

2
Bu kod-golf , kodu daha kısa tutmaya çalışmalısınız, örneğin, boşlukları kaldırarak ...
mniip

6

Ruby - 28 karakter (veya yünlülerin dışında tutulursa 27 )

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

Çalıştırmak için komutun tamamı (48 karakter):

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

DÜZENLEME: değiştirilmiştir putsile p@CarySwoveland önerdiği gibi


Güzel, @Nik. %w[a e i o u]3 karakter piçin 1 karakter kazandıracak puts.
Cary Swoveland

Thanx, @CarySwoveland! Unuttum p, nadiren kullanırım. % W [] için, eğer y, ünlüler kümesine dahil edilirse, karakterli sürümler hala daha kısadır.
Nik O'Lai

@ NikO'Lai "aeiouy".delete(s)==''size birkaç karakter kazandırabilir.
OI

Çok hoş! Kendi çözümünüz olarak gönderin, @OI. Bunu affedeceğim
Nik O'Lai

4

AWK - 29

/ A / && / e / && / I / && / o / && / u / && / y /

Çalıştırmak için: Küçük harfli kelime listesini wordlist.txt . O zaman yapın:

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

Sisteminiz yoksa mawk, awksıra kullanılabilir.

Ayrıca programı bir dosyaya kaydederek program.awkve mawkya da yaparak dosyadan çalıştırabilirsiniz awk -f program.awk.


Doğru siparişi seçmek işi hızlandırır: '/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]

"Corncob_lowercase.txt" dosyasını "w" olarak yeniden adlandırdım

Kelimeleri sayın [22 karakter]

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

Çıktı

43

Tüm kelimeleri bul [25 karakter]

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

Tüm ünlüleri içeren toplam 43 kelime (a e i o u y)

Çıktı

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

3

Javascript / JScript 147 (152-5), 158 (163-5) veya 184 (189-5) bayt:

İşte benim Javascript ve JScript korkunç "ungolfyfied" versiyonu (164 152 152-5 = 147 bayt):

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;}

search()Bana bir bayt kazandıran işlev için @GaurangTandon için teşekkür ederiz !

HORRIBLE performansına dayanan RegExp , ancak hem küçük hem de büyük harfleri destekler (163-5 = 158 bayt):

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;}

BETTER performansına dayalı RegExp , BUT çok daha fazla bayt alır (189-5 = 184 bayt):

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;}


Bu sadece eğlence için ise (175-5 bytes) ve cevap olarak sayılmayacaksa:

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;}

İlk cevabı temel alır, ancak bir 'bükülme' vardır: Bir kelimenin kaç kere bulunduğunu bilebilirsin.

Siz sadece bu şekilde yapın:

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

O yana lengthtüm sesli harfleri yoktur, silinebilir olmaz ve hala ikramiye bir cevap olurdu.


Nasıl diyorsun?

"Basit": Fonksiyonu içeriye sararak sonuna kadar ()eklersiniz ('string goes here');.

Bunun gibi: (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');

Bu örnek sadece 1 dizge içeren bir dizi döndürür: yoiuae

Bunun en kötü çözüm olduğunu biliyorum ama işe yarıyor!


Neden -5 sayıyorum?

Peki, Javascript / JScript dizileri, sahip lengtholduğu elemanların sayısını söyleyen dizilerde bir özelliğe ( ) sahiptir.

Soruda onaylandıktan sonra, -5 bonusu kelimelerin sayısını söylemek içindir.

Kelime sayısı bu özellikte olduğu için, otomatik olarak -5 puanına sahibim.


1 karakter kazandırmak search()yerine ilginizi indexOf()çekebilir.
Gaurang

Ayrıca, Bildiğim kadarıyla gördüğünüz gibi, senin en kısa sürümde, sen gerekmez .split()üzerinde "aeiouy". JS aynı şekilde bir dizi ve dize üzerinde döngü. (Kaldırmak size ~ 10 karakter kazandırır)
Gaurang Tandon

2

Yakut 39 38

Şu anda giriş ve çıkış dahil tüm programı sayarken en kısa Ruby girişi .

Bir karakter kullanarak mapyerine bir karakter kaydedildi each:

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

Başka bir sürüm, daha güzel çıktıya sahip 39 karakter:

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

Her iki program da stdin'den veya komut satırı argümanı olarak iletilen bir dosya adı olarak girdi alır:
$ ruby wovels.rb wordlist.txt

Bir dokunma ygibi eklemek için 3 ekstra karaktere mal olur.


Yine de Enumerable#grepbunu kısaltmak için kullanmak ? örneğin, s.split.grep /a*e*i*o*u*y/varsayımlar syeni satırlarla ayrılmış kelimelerin bir dizisidir.
OI

@OI İlginç bir fikir, ancak biraz karışıklığa ihtiyaç duyacak çünkü regex'in sabit sıraları var. Bu yüzden ipi eşleştirmeden önce .*, dokuma kumaşları arasında 5 kez tekrarlıyorum .
daniero

Aydınlatabilir misin? Varsayalım s = "aeiouy\neiouay\nyuaioe\n". Sonra benim için s.split.grep /a*e*i*o*u*y/döner ["aeiouy", "eiouay", "yuaioe"]. pryRuby 2.0.0'da Test Etme . Bu arada harika bir çözüm.
OI

@OI Oh vay, operatörün grepkullanıldığını varsaydım =~, ama görünüşe göre kullanıyor ===. Şüphe ediyorum ki, aynı zamanda tüm pabuçları içermeyen iplerle de eşleşecekti, çünkü örneğin /e*a*i*o*u*y/=~"eioy"çalışıyor. Gerçekten ===bir regex ve bir operatör arasındaki gerçekte ne yaptığını anlamıyorum . Harika bul; Kendini bir cevap olarak göndermeni öneririm. düzenleme Haklıydım: örneğin ile deneyin "heya".
daniero

Bence regex'in ince ayar yapması gerektiği konusunda haklısın. Sızan tüm ünlüleri içermeyen son vakalar buluyorum. Belki de gerçek olamayacak kadar iyi.
OI

2

Mathematica (65 veya 314)

Çok farklı iki yaklaşım, Belisarius tarafından ilk cevabım yorumlarında daha iyi bir yaklaşım önerildi. Öncelikle, algoritma olarak altı sesli harf kombinasyonuyla ("y" dahil) her olası düzenli ifadeyi algoritmik olarak üreten ve sonra hedef kelime listesindeki her kelimeyi bu 720 normal ifadenin her birine karşı kontrol eden kaba çabalarım. Çalışıyor, ama çok özlü değil ve yavaş.

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. Bir kısmı alternatif gösterim kullanılarak kaydedilebilir ve sözlük dosyasını dizelerin bir listesi olarak hazırlayan ek karakterler kaybolur (Mathematica'daki sözlük için doğal biçim. Diğer diller bu hazırlamaya ihtiyaç duymayabilir, ancak Mathematica'da bulunur). Bu adımı atlarsak, bizim için kullanıldığını varsayarsak, aynı yaklaşım 250 karakterin altında yapılabilir ve Mathematica'nın yerleşik sözlüğünü kullanırsak daha da fazla tasarruf elde ederiz.

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

200 karakterin altında. Bulunan kelimelerin sayısının sayılması, yalnızca sonucun Length[Flatten[]], yukarıdaki kod bloğunun etrafına eklenebilecek veya daha sonra örneğin ile yapılabilecek şekilde iletilmesini gerektirir Length@Flatten@%. Bu meydan okuma için belirtilen kelime listesi 43 eşleşme verir ve Mathematica sözlüğü 64 verir (ve çok daha hızlıdır). Her sözlükte diğerinde olmayan kelimeler vardır. Mathematica, örneğin paylaşılan listede bulunmayan "profesyonelce" ifadesini bulur ve paylaşılan liste, Mathematica sözlüğünde bulunmayan "ökaryotik" kelimesini bulur.

Belisarius çok daha iyi bir çözüm önerdi. Kelime listesinin hazırlandığı ve değişkene atandığını varsayarsak, lMathematica'nın StringFreeQ[]işlevine dayanan tek bir test tanımlar , ardından bu testi bu Pick[]işlevi kullanarak kelime listesine uygular . 65 karakter ve benim yaklaşımımdan yaklaşık 400 kat daha hızlı.

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

65 karakter içinde: Sözcük listesi f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]neredel
Dr. belisarius

Bunun nedeni y, bir sesli harf olarak düşünmeyi unuttun (OP gereklilikleri uyarınca!)
Dr. belisarius

@belisarius evet, yorumumu yaptıktan sonra bunu farkettim. Sonuçlarımı bu düzeltmeyle kontrol ediyorum.
Michael Stern,

@belisarius onayladı - çözümünüz benimkinden çok daha özlü ve hızlı. Neden kendi çözümü olarak yayınlamıyorsun? Ben oylayacağım.
Michael Stern,

Teşekkürler! İsterseniz, cevabınızı dahil ederek düzenleyin. Benim için her şey dille ilgili kısa çözümler bulma, rep biriktirme değil :)
Dr. belisarius

2

Perl 6 - 35 karakter

@CarySwoveland'ın Ruby çözümünden ilham aldı:

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

Bu seçer ( grepler) donduğu her satır Trueiçin <a e i o u y> ⊆ *.combsoran sadece süslü bir yoludur, "Set olan ('a','e','i','o','u','y')bir alt ( Set) girdi harfler (oluşan *.comb)?"

Aslında, her ikisi <a e i o u y>ve *.combsadece Lists: (veya (<=)ASCII’de kalmışsanız) onları Setsizin için s’e dönüştürür .

Yazdırılan satır sayısını elde etmek için bu 42 karakter - 5 = 37 punto komut dosyası da şu şekilde çıkacaktır:

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

2

C - 96 bayt

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

Operatör önceliğinin şanslı bir tesadüfü sayesinde birkaç bayt parantez biriktirdim.


2

Javascript - Puan = 124 - 5 = 119 !!!

Düzenleme: 17.02.200

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}

@ Ismael Miguel'e teşekkür ederim ~ 12 karakter !

Yağ okunu gösterme fonksiyon formunu kaldırdım, çünkü kullanılmaya başladığını görmeme rağmen, çalışmıyor. Hiçbir fikrim neden ...


Çalışmasını sağlamak için:

Newline ile ayrılan tüm sözcükleri, aşağıda gösterildiği şekilde işleve argüman olarak iletin.


Ölçek:

// 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
*/


1. satırdaki sözdizimi hatası: beklenen ifade, '>' c = (s, j) => {k = "aeiouy" .split ("
Ismael Miguel

1
Döngünün k="aeiouy".split("")içinde olmak için hareket ettirerek azaltabilirsiniz for(i in k). ;Yeni satırlar yerine kullanmak , Windows'taki bazı baytları kaydeder. Ve yine de, bir kelime listesiyle nasıl başa çıkacağını anlamıyorum. Ve nasıl çalışacağını.
Ismael Miguel,

@IsmaelMiguel Bunu biliyorum (yağ ok gösterimi) çalışmıyor. Ama burada kullanıldığını gördüğümden beri kullandım çünkü karakterleri kurtardı. Ama ben kaldırdım. Ve ipucunu anlamıyorum, kodları incelediğin için teşekkürler. Bayt ipucunu ekle. Ve yeni programım her iki şüphenizi de ortadan kaldırabilir. Okuduğunuz için teşekkürler. :)
Gaurang Tandon

Bunun yerine k="aeiouy";o=0;for(i in k), deneyin o=0;for(i in k='aeiouy'). ve bayt kaydeder kullanarak, değiştirmek için kullanabilirsiniz o+=RegExp(k[i]).test(s)içine o+=RegExp(k[i],'i').test(s)bir byte daha kaplıyor ama üst ve küçük harf ile birlikte çalışacağı.
Ismael Miguel,

Daha iyi algoritma ile güncellendi. Şimdi fikrinizi anlıyorum, ancak neden burada çalıştığını ve burada çalışmadığını anlamıyorum . Lütfen yardım et! Teşekkür :)
Gaurang Tandon

2

Bash + coreutils, 39

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

Stdin'den girdi alır.


Bu 5 puan bonusu için uygun görünüyor.
Glenn Randers-Pehrson

@ GlennRanders-Pehrson Bu bonus bana hiç mantıklı gelmiyor ;-)
Digital Trauma

Mantıklı olsun ya da olmasın, kelime listesinin iki kopyasını içeren bir dosyayı işlerken doğru bir şekilde 86 satır yayarsınız. Anladığım kadarıyla, sadece 43'ü sıralayan ve raporlayan çözümler bu bonusu alamaz.
Glenn Randers-Pehrson

2

sed 29 karakter

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

Sipariş üzerindeki harf sıklığından wikipedia'dan seçilen emir .

Ana bilgisayarımda:

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

ve

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

1
Güzel (+1), ancak bence 36 baytlık bir sayıya "sed-n" eklemeniz gerektiğini düşünüyorum.
Glenn Randers-Pehrson

2

Bash (grep) - 36 bayt

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

Test edilen ünlülerin sırasını not edin, en azından önce sık. Test durumu için bu, test amacıyla yaklaşık 3 kat daha hızlı çalışır. Bu şekilde, ilk test çok sayıda kelimeyi kaldırır, böylece sonraki testler daha az iş yapar. Açıkçası, bunun kodun uzunluğu üzerinde etkisi yoktur. Burada yayınlanan diğer çözümlerin çoğu, bu sırayla testleri yapmaktan benzer şekilde fayda sağlayacaktır.


Neden wc, saymıyoruz, bulamadık mı? Ayrıca, giriş kodunu karakter sayımına sayar mıyız?
orion

"Kelimenin bütün oluşumlarını saymak için -5 puan" bonusunu gerçekten anlamıyorum. Eğer gerçekten "kelimenin tüm oluşumlarını bildirmek" anlamına geliyorsa, komut dosyalarımın "| wc" olmadan yaptığı şey budur. Herhangi bir "giriş kodu" kullanmıyorum çünkü grep standart girişi okuyor, bu yüzden "grep" "giriş kodu" ve ben de saydım. Şimdi "| wc" yi kaldıracağım.
Glenn Randers-Pehrson

Bonusu reddettim.
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]);}

Golfsüz :

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

kullanım :C:\>rdmd vowels.d wordlist.txt

wordlist.txt küçük liste kelimelerini içermelidir.


1

Rebol (104 karakter)

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

Un-golfed:

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

dşimdi bulunan kelimelerin listesini içerir. İşte Rebol konsolundan bir örnek:

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

Küçük konuşma (36/57 karakter)

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

sayımı almak için, sonuçtaki koleksiyona #size gönderin. Sonuç koleksiyonu 43 kelime içeriyor ('kesinlikle' açıkça '' otoriter '' ... 'tartışılmaz' 'tanınmaz')

Yukarıdaki kod 77 karakterden oluşuyordu, ancak wordlist dosyasını 'w' olarak değiştirebilirdim, bu yüzden dosya ismini 1 olarak kabul ettim, bu puan 57 olur.

Dosyayı okumak sorunun bir parçası mı değil mi? Değilse (diğer örneklere bakın) ve kelimelerin listesi zaten bir c koleksiyonundaysa, kod aşağıdakilere indirgenir:

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

36 karakterdir (çıkarılabilir boşluk kaldırılmıştır).


1

güncellendi: gereksiz boşluk kaldırıldı

Çok yavaş ama bashta (81 karakter):

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

EDIT: @ nyuszika7h tarafından önerilen şekilde echo $l|fold -w1değiştirildifold -w1<<<$l


Bu kod golf, kodunuzu biraz daha küçültmek isteyebilirsiniz. Gereksiz boşlukları kaldırarak başlayın. ;)
nyuszika7h

Kullanarak fold -w1<<<$lyerine kodu küçültebilirsiniz echo $l|fold -w1. Not: Geçerli kod 84 karakterdir, sondaki yeni satırı saymamalısınız.
nyuszika7h

Bugüne kadar <<< hakkında hiçbir şey bilmiyordum. Tekrar teşekkürler, @ nyuszika7h. Bana nerede açıklandığını söyleyebilir misin?
Nik O'Lai


1

JavaScript - 95 bayt

İşte benim golf.

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

Ayrıca golfünüzün tüm ünlü harflerini bulamadığını da belirtmek isterim.

Ungolfed:

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

1
Spesifikasyonu daha dikkatli okuyun. [Merakla seviyorum - --- bütün ünlüleri tek kelimeyle içeren kelimeleri arıyor. Buna rağmen, titizlikle sırayla içerdikleri konusunda ısrar etmiyor.
dmckee,

1
Regex'in yanlış. Tüm ileri görüşlülük, ilk karakterin ünlü olup olmadığını kontrol etmektir. (?=.*a)İpte abir yerde olup olmadığını kontrol etmeniz gerekir .
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@dmckee Bu yüzden lookaheads kullandım . Belirli bir düzen gerektirmezler.
Isiah Meadows

@nhahtdh yakalamak için teşekkürler
Isiah Meadows

1

sort + uniq + sed

Bu, bir kelimenin tekrarlanan oluşumları ile eşleşmiyor. Ayrıca, bir kelimenin başında meydana gelirse, 'y' harfiyle eşleşmez.

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' 

Diğer cevabınızdaki gibi, 4 bayttan tasarruf etmek için "sort wordlist.txt | uniq" yerine "sort -u wordlist.txt" yazın.
Glenn Randers-Pehrson

1

darbe

OP'ler kadar kısa değil, Bash'deki bir satır:

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

"Sort | uniq" ı "sort -u" ile değiştirerek dört bayttan tasarruf edebilirsiniz
Glenn Randers-Pehrson

Ayrıca birkaç bayttan tasarruf etmek için boşlukları "|" ve ";" alanlarından kaldırabilirsiniz
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)))));}}

biçimlendirilmiş:

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

Şu an için havasında değil, puhancak sayma uygulamak için kolay olmalıdır. Kelime listesinin (küçük harf) sürümünün yolu programa ilk argüman olarak geçilmelidir:

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

Çıktı:

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

Kelimelerin çıktısını alma ve virgülle ayırma özgürlüğünü aldım; bunlardan hiçbiri kurallarda belirtilmemiştir (hangi devlet "bütün kelimeleri bulmalıdır", nasıl (ve IF) çıktısı alınmaz).

Sayı (+ çıktı) dahil: 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());}}

Çıktı:

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

(Sonundaki sayıya dikkat edin: 43)

Çıktı yok (" tüm kelimeleri bulmalı "): 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)));}}

(Kuralları bir bitm sonra tekrar bükmek: gerçekte değil) Bu , tüm kelimeleri bulur ve sayım çalıştırılarak kullanılabilir r.Count().


1

Cı-Sharp

Bunu daha önce hiç yapmadım ve gönderme prosedürlerinin ne olduğundan emin değilim. Ama bu benim geldiğim şeydi:

185 bayt

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= List<string>tüm kelimelerden bir tanesi.

toplam görüntülemek istiyorsanız:

219 - 5 = 214 bayt

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


Expanded

// 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);
}

Genel olarak, eğer soru bir "program" isterse, yükleme / başlatma vb. Dahil olmak üzere tüm programınızı göndermelisiniz.
ProgramcıDan

Ah tamam. Öyleyse küçültülmüş sürümde her şeyi yalnızca gereksinimi karşılayan çizgiyi içermeli değil mi? Txt dosyasını yüklemek / okumak için koddan yoksun olduklarından, diğer cevaplar tarafından değerlendirilenin ikinci bir karar olduğunu düşündüm.
jzm

Yaklaşımların çeşitliliğini göreceksiniz ve cevabın yaşına bakacak olursak, yeni cevaplar için güçlü olmama olasılığı yüksektir, ancak genel olarak bir "program" sorusu sorulduğunda, derlendiği gibi derlenmeli ve uygulanabilir olmalıdır. Sorunun içindeki örneği ele alalım - bu tek başına duran eksiksiz ve yürütülebilir bir çözümdür.
ProgramcıDan

ahh doğru. Eh, bu durumda 2 kısaltılmış sürümleri bağımsız olarak güncellendi.
jzm

Harika! Cevabınızın metnini güncellediğinizden (“yükleme / okumadan bahsettiğinizden”) emin olun ve puanınızı hesaplayın.
ProgramcıDan

1

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

* 0 + 49c dk

Bu, tüm sesli harfleri içeren tüm kelimeleri içeren bir numaralandırma yaratır.

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. Bu, a) bir program değil, bir programın bir parçası ve b) kelime listesini okumaz / kullanmaz.
RobIII

@RobIII vb.net, temel bir konsol programı için minimum 49c değerine sahiptir. Programın argümanları (bu durumda wordlist) a dizisidir . Ayrıca bazılarının da belirttiği gibi LinqPad'de geçerli bir programdır.
Adam Speight

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.