Znajdź słowa zawierające każdą samogłoskę


28

Twój program musi znaleźć wszystkie słowa z tej listy słów, które zawierają wszystkie samogłoski ( a e i o u y). Są na to łatwe sposoby, ale szukam najkrótszej odpowiedzi. Wezmę dowolny język, ale chciałbym zobaczyć Basha.

Oto przykład (można go znacznie poprawić):

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

Twój wynik to długość kodu.

-5 punktów za policzenie wszystkich wystąpień słowa.

Najniższy wynik wygrywa.


11
taki profil. wiele zdjęć. bardzo doża. łał.
Klamka

2
17 odpowiedzi i wciąż rośnie! Chciałbym zobaczyć więcej pytań takich jak twoje na cg, doc. Często widzę tu coś interesującego, ale nie mam kilku godzin czasu potrzebnych na wypracowanie przyzwoitego rozwiązania ...
Cary Swoveland

2
Tak, ale nie może to być język poświęcony wyszukiwaniu samogłosek.
TheDoctor

1
@TheDoctor Shakes fist
Jason C

2
jeśli ma bonus, to nie jest to golf golfowy. Zamiast tego użyj kodu-wyzwanie.
Tim Seguine

Odpowiedzi:


7

GolfScript, 20 znaków - 5 = 15 punktów

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

Oparty na rozwiązaniu Howarda , ale przy użyciu krótszego testu ( \-!zapisuje jeden znak &,6=), krótszego dodawania długości ( .,+= 3 znaki) i krótszego formatowania danych wyjściowych (nikt nie powiedział, że dane wyjściowe muszą być oddzielone znakiem nowej linii, więc `zapisuje się jeden znak n*).

Oto wynik, biorąc pod uwagę listę słów pisaną małymi literami jako dane wejściowe (wstawiono podział wierszy w celu zapewnienia czytelności):

["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. Technicznie, biorąc pod uwagę, że wyzwanie mówi tylko, że kod musi działać dla tego konkretnego wkładu, n%{'aeiouy'\-!},`43byłby jeszcze o jeden znak krótszy. Myślę jednak, że to oszustwo.)


Wyjaśnienie:

  • n% dzieli dane wejściowe na nowej linii na tablicę.
  • { }, jest operatorem „grep”, który wykonuje kod między nawiasami klamrowymi dla każdego elementu tablicy i wybiera te, dla których zwraca prawdziwą wartość.
    • Wewnątrz pętli 'aeiouy'\-bierze dosłowny ciąg znaków aeiouyi usuwa z niego wszystkie znaki znalezione w kandydującym słowie. !Następnie logicznie neguje wynikowy ciąg, otrzymując 1(prawda), jeśli ciąg jest pusta i 0(fałsz), jeśli tak nie jest.
  • .,+ tworzy kopię filtrowanej tablicy, liczy liczbę słów w niej i dołącza wynik do oryginalnej tablicy.
  • Na koniec `un-ewaluuje tablicę, przekształcając ją w ciąg znaków reprezentujący jej zawartość. (Bez tego słowa w tablicy byłyby po prostu konkatenowane w danych wyjściowych, powodując nieczytelny bałagan).

Gratulacje!! najmniejsza odpowiedź !!!!
TheDoctor,

abstemicznie i żartobliwie to jedyne słowo z wszystkimi 6 samogłoskami w kolejności. Pomyślałem, że podzielę się tym z tobą. Uważam, że to fajne.
dberm22,

15

GolfScript, 19 znaków

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

Stosowanie:

golfscript vowels.gs < wordlist.txt

Wydajność:

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

Jeśli chcesz również podać liczbę na końcu, możesz użyć

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

który jest o cztery znaki dłuższy.


1
Lubię to! Może być o 4 znaki dłuższy, ale daje to premię -5 pkt
TheDoctor

11

Python - 46 znaków

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

Wersja do odczytu: Jest już dość czytelna :-)


8

APL, 21-5 = 16

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

Oczekuje znaleźć listę słów jako w. Zwraca listę słów zawierających wszystkie samogłoski oraz ich liczbę. Testowane przy pomocy ngn apl . Oto przykład .

Wyjaśnienie

         '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

Rubinowy 38

Edycja 34: Najlepsze do tej pory (z @OI):

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

Edycja 1: Właśnie zauważyłem pytanie o włączenie „y” wśród samogłosek, więc odpowiednio zmodyfikowałem swoje pytanie. Jak zauważył @Nik w komentarzu do swojej odpowiedzi, "aeiouy".charsjedna postać jest mniejsza niż %w[a e i o u y], ale zostawiam tę drugą, dla różnorodności, mimo że ryzykuję koszmary z powodu utraconej okazji.

Edycja 2: Podziękowania dla @OI za zasugerowanie ulepszenia:

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

co oszczędza 11 znaków od tego, co miałem wcześniej.

Edytuj 3 i 3a: @OI straciło jeszcze kilka:

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

następnie

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

i ponownie (3b):

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

Jestem zwykłym pisarzem!

Oto dwa kolejne niekonkurencyjne rozwiązania:

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

Początkowo miałem:

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

sjest ciągiem zawierającym słowa oddzielone znakami nowej linii. Zwracana jest tablica słów szawierająca wszystkie pięć samogłosek. Dla czytelników niezaznajomionych z Ruby %w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]i &przecięciem tablic.

Przypuszczać

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

{...}Początkowo w bloku

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,

więc „skróty” nie są zaznaczone.

Jeśli ciąg smoże zawierać duplikaty, s.split.select...może zostać zastąpiony przez, s.split.uniq.select...aby usunąć duplikaty.

Właśnie zauważyłem, że mogę uratować 1 znak, zastępując size==6go size>5.


1
...size=5jest błędem - powinien być...size==5
Uri Agassi

Dzięki, @Uri, za wskazanie literówki w pierwszym wierszu, który naprawiłem (nie jest to błąd - patrz wiersz powyżej „więc„ skróty ”nie są zaznaczone”).
Cary Swoveland

@CarySwoveland Możesz zaoszczędzić 11 znaków w ten sposób:s.split.select{|w|'aeiouy'.delete(w)==''}
OI

To świetnie, @OI. Dokonałem edycji i znalazłem miejsce w szarych komórkach.
Cary Swoveland,

@CarySwoveland To pozwoli zaoszczędzić 1 więcej charakteru: s.split.select{|w|'aeiouy'.tr(w,'')==''}. Jestem prawie pewien, że możesz uzyskać to poniżej 40 znaków, jeśli użyjesz logiki zerowej i metody „właściwego” ciągu. Wciąż szuka ...
OI

6

Haskell - 67

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

2
To jest golf golfowy , powinieneś spróbować skrócić kod, na przykład usuwając białe spacje ...
mniip

6

Rubinowy - 28 znaków (lub 27, jeśli ywykluczono z samogłosek)

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

Pełne polecenie do uruchomienia to (48 znaków):

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

EDYCJA: zastąpiona zgodnie putsz psugestią @CarySwoveland


Niezły, @Nik. %w[a e i o u]zaoszczędziłby 1 znak, pna putskolejne 3.
Cary Swoveland,

Dzięki, @CarySwoveland! Zapomniałem o tym p, rzadko go używam. Jeśli chodzi o% w [], jeśli y jest zawarte w zestawie samogłosek, wersja z znakami jest jeszcze krótsza.
Nik O'Lai

@ NikO'Lai "aeiouy".delete(s)==''może uratować ci kilka znaków.
OI

Bardzo dobrze! Opublikuj jako własne rozwiązanie, @OI. Będę głosować
Nik O'Lai

4

AWK - 29

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

Aby uruchomić: Zapisz listę słów pisaną małymi literami wordlist.txt. Następnie wykonaj:

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

Jeśli twój system nie ma mawk, awkmożna go również użyć.

Możesz również uruchomić go z pliku, zapisując program program.awki wykonując mawklub awk -f program.awk.


Wybór odpowiedniej kolejności przyspiesza pracę: '/y/&&/u/&&/i/&&/o/&&/a/&&/e/'!!
F. Hauri


3

k [22-5 = 17 znaków]

Nazwa pliku „corncob_lowercase.txt” zmieniłem na „w”

Policz słowa [22 znaków]

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

Wydajność

43

Znajdź wszystkie słowa [25 znaków]

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

Ogółem 43 słowa zawierające wszystkie samogłoski (a e i o u y)

Wydajność

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

3

JavaScript / JScript 147 (152-5), 158 (163-5) lub 184 (189-5) bajtów:

Oto moja wersja JavaScript i JScript strasznie „niefunkcjonalna” (164 152 152-5 = 147 bajtów):

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

Dziękuję @GaurangTandon za search()funkcję, która uratowała mi bajt!

RegExp oparty na wydajności HORRIBLE , ale obsługuje zarówno wielkie, jak i małe litery (163-5 = 158 bajtów):

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

RegExp oparty na lepszej wydajności, ALE zajmuje o wiele więcej bajtów (189-5 = 184 bajtów):

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


Ten, jeśli tylko dla zabawy (175-5 bajtów) i nie będzie liczony jako odpowiedź:

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

Opiera się na pierwszej odpowiedzi, ale ma „zwrot akcji”: możesz wiedzieć, ile razy znaleziono słowo.

Po prostu robisz tak:

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

Ponieważ lengthto nie ma wszystkich samogłosek, nie zostanie usunięte i nadal będzie odpowiedzią na bonus.


Jak to nazywasz?

„Prosty”: zawijasz funkcję w środku, ()a następnie dodajesz ('string goes here');do końca.

Lubię to: (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');

Ten przykład zwróci tablicę tylko z 1 ciągiem: yoiuae

Wiem, że to najgorsze rozwiązanie, ale działa!


Dlaczego liczę -5?

Cóż, tablice JavaScript / JScript mają w tablicach właściwość ( length), która określa liczbę elementów, które ma.

Po potwierdzeniu w pytaniu premia -5 oznacza podanie liczby słów.

Ponieważ liczba słów znajduje się w tej właściwości, automatycznie mam wynik -5.


Może być zainteresowany search()zamiast indexOf()oszczędzać 1 znak.
Gaurang Tandon

Dodatkowo, w miarę widzę, w najkrótszej wersji, nie potrzebne .split()na "aeiouy". JS zapętla tablicę i ciąg znaków w ten sam sposób. (Usunięcie go oszczędza ~ 10 znaków)
Gaurang Tandon

2

Rubinowy 39 38

Obecnie najkrótszy wpis w języku Ruby podczas liczenia całego programu, w tym wejścia i wyjścia.

Zapisano znak, używając mapzamiast each:

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

Inna wersja, 39 znaków z ładniejszym wyjściem:

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

Oba programy pobierają dane wejściowe ze standardowego wejścia lub jako nazwę pliku przekazywaną jako argument wiersza poleceń:
$ ruby wovels.rb wordlist.txt

Kosztuje 3 dodatkowe postacie, aby wznosić się yjako wowel.


W każdym razie użyć, Enumerable#grepaby to skrócić? np. s.split.grep /a*e*i*o*u*y/zakładając , że sjest to ciąg słów oddzielonych znakami nowej linii.
OI

@OI Ciekawy pomysł, ale wymagałoby to trochę majstrowania, ponieważ regex ma wovels w ustalonej kolejności. Dlatego powtarzam strunę 5 razy, zanim ją .*dopasuję , pomiędzy wavels.
daniero

Czy możesz to wyjaśnić? Załóżmy s = "aeiouy\neiouay\nyuaioe\n". Potem s.split.grep /a*e*i*o*u*y/wraca ["aeiouy", "eiouay", "yuaioe"]po mnie. Testowanie w pryRuby 2.0.0. Nawiasem mówiąc, świetne rozwiązanie.
OI

@OI Och, wow, założyłem, że grepużywał =~operatora, ale najwyraźniej używa ===. Podejrzewałem, że pasowałoby również do łańcuchów nie zawierających wszystkich waveli, ponieważ na przykład /e*a*i*o*u*y/=~"eioy"działa. Naprawdę nie rozumiem, co ===właściwie robi wyrażenie regularne i operator. Świetne znalezisko; Sugeruję, abyś sam to opublikował jako odpowiedź. edytuj Miałem rację: spróbuj na przykład "heya".
daniero

Myślę, że masz rację, że regex wymaga modyfikacji. Znajduję skrajne przypadki, które nie zawierają wszystkich przeciekających samogłosek. Może zbyt piękne, aby mogło być prawdziwe.
OI

2

Matematyka (65 lub 314)

Dwa bardzo różne podejścia, lepsze zaproponował Belizariusz w komentarzach do mojej pierwszej odpowiedzi. Po pierwsze, mój brutalny wysiłek, który algorytmicznie generuje każde możliwe wyrażenie regularne pasujące do kombinacji sześciu samogłosek (w tym „y”), a następnie sprawdza każde słowo na docelowej liście słów względem każdego z tych 720 wyrażeń regularnych. Działa, ale nie jest zbyt zwięzły i powolny.

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 znaków. Kilka można zapisać za pomocą alternatywnej notacji, a dodatkowe znaki są tracone przygotowując plik słownika jako listę ciągów (naturalny format słownika w Mathematica. Inne języki mogą nie potrzebować tego prepa, ale Mathematica tak robi). Jeśli pominiemy ten krok, zakładając, że został on wykonany za nas, to samo podejście można wykonać w mniej niż 250 znakach, a jeśli użyjemy wbudowanego słownika Mathematica, uzyskamy jeszcze większe oszczędności,

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

Poniżej 200 znaków. Zliczenie liczby znalezionych słów wymaga jedynie przekazania wyniku Length[Flatten[]], który można dodać do dowolnego bloku kodu powyżej lub można to zrobić na przykład za pomocą Length@Flatten@%. Lista słów określona dla tego wyzwania daje 43 dopasowania, a słownik Mathematica daje 64 (i jest znacznie szybszy). Każdy słownik ma pasujące słowa, których nie ma w drugim. Na przykład Mathematica znajduje „nieprofesjonalnie”, którego nie ma na wspólnej liście, a na wspólnej liście znajduje się „eukariotyczny”, którego nie ma w słowniku Mathematiki.

Belizariusz zaproponował znacznie lepsze rozwiązanie. Zakładając, że lista słów została już przygotowana i przypisana do zmiennej l, definiuje pojedynczy test oparty na StringFreeQ[]funkcji Mathematiki , a następnie stosuje ten test do listy słów za pomocą tej Pick[]funkcji. 65 znaków, a to około 400 razy szybciej niż moje podejście.

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

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

To dlatego, że zapomniałeś wziąć pod uwagę ysamogłoskę (zgodnie z wymaganiami OP!)
Dr Belisarius

@belisarius tak, zauważam, że po moim komentarzu. Sprawdzam moje wyniki z tym naprawionym.
Michael Stern

@belisarius potwierdził - twoje rozwiązanie jest o wiele bardziej zwięzłe i szybsze niż moje. Dlaczego nie opublikujesz go jako własnego rozwiązania? Zagłosuję.
Michael Stern

Dzięki! Jeśli Ci się podoba, edytuj swoją odpowiedź wraz z nią. Dla mnie najważniejsze jest znalezienie krótkich rozwiązań z językiem, a nie gromadzenie przedstawicieli :)
Dr. Belisarius

2

Perl 6-35 znaków

Zainspirowany Rubinowym rozwiązaniem @CarySwoveland:

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

Wybiera ( grepy), że każda linia powróci Truedo <a e i o u y> ⊆ *.comb, który to sposób fantazyjny pytać „jest zbiorem ('a','e','i','o','u','y')podzbiorem ( ) o Zestaw składa się z liter input ( *.comb)?”

W rzeczywistości oba <a e i o u y>i *.combtylko tworzą Lists: (lub (<=)jeśli utkniesz w ASCII) zamienia je w Sets dla ciebie.

Aby uzyskać liczbę wydrukowanych wierszy, ten 42-znakowy - 5 = 37 punktowy skrypt również wyświetli:

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

2

C - 96 bajtów

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

Zaoszczędziłem kilka bajtów nawiasów dzięki szczęśliwemu przypadkowi pierwszeństwa operatorów.


2

JavaScript - wynik = 124 - 5 = 119 !!!

Edycja: 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}

Ogromne podziękowania dla @Ismael Miguel za pomoc w odcięciu ~ 12 znaków !

Usunąłem formularz funkcji zapisywania grubych strzałek, ponieważ chociaż widziałem, że zaczął on być używany, nie działa. Nie mam pojęcia, dlaczego ...


Aby to działało:

Przekaż wszystkie słowa oddzielone znakiem nowej linii jako argument do funkcji, jak pokazano poniżej.


Test:

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


Błąd składniowy w wierszu 1: oczekiwane wyrażenie, mam '>' c = (s, j) => {k = "aeiouy" .split ("
Ismael Miguel

1
Możesz zmniejszyć, jeśli poruszasz k="aeiouy".split("")się w for(i in k)pętli. Użycie ;zamiast nowych wierszy oszczędza niektóre bajty w systemie Windows. A jednak nie wiem, jak poradzi sobie z listą słów. I jak to zrobić.
Ismael Miguel

@ IsmaelMiguel Wiem, że (notacja grubych strzałek) nie działa. Ale odkąd widziałem, że jest tu używany, więc użyłem go, ponieważ oszczędza znaki. Ale usunąłem to. I nie rozumiem twojej wskazówki, ale dziękuję za sprawdzenie kodu. Zawiera swoją bajtową wskazówkę. A mój nowy program powinien rozwiać wasze wątpliwości. Dziękuje za przeczytanie. :)
Gaurang Tandon

Zamiast tego k="aeiouy";o=0;for(i in k)spróbuj o=0;for(i in k='aeiouy'). i przy użyciu broni bajtów, można z nich korzystać, aby zmienić o+=RegExp(k[i]).test(s)się o+=RegExp(k[i],'i').test(s), biorąc się jeszcze jeden bajt, ale praca z górnej i małe litery.
Ismael Miguel

Zaktualizowany o lepszy algorytm. Chociaż teraz rozumiem twój pomysł, ale nie rozumiem, dlaczego działa tutaj, a nie tutaj . Proszę pomóż! Dzięki :)
Gaurang Tandon

2

Bash + coreutils, 39

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

Pobiera dane wejściowe ze standardowego wejścia.


Wygląda na to, że kwalifikuje się do premii 5 punktów.
Glenn Randers-Pehrson

@ GlennRanders-Pehrson Ten bonus nie ma dla mnie żadnego sensu ;-)
Digital Trauma

Niezależnie od tego, czy ma to sens, czy poprawnie emitujesz 86 wierszy podczas przetwarzania pliku zawierającego dwie kopie listy słów. Rozwiązania, które sortują i zgłaszają tylko 43, nie dostaną premii, tak jak ja to rozumiem.
Glenn Randers-Pehrson

2

sed 29 znaków

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

Zamów wybrane z Częstotliwości liter na wikipedii, aby sprawdzić szybkość.

Na moim hoście:

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

i

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

1
Fajnie (+1), ale myślę, że musisz uwzględnić w skrypcie „sed -n”, dla liczby 36 bajtów.
Glenn Randers-Pehrson

2

Bash (grep) - 36 bajtów

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

Zwróć uwagę na kolejność testowanych samogłosek, od najmniejszej częstotliwości. W przypadku testowym przebiega to około 3 razy szybciej niż testowanie w kolejności aeiou y. W ten sposób pierwszy test usuwa większą liczbę słów, więc kolejne testy mają mniej pracy. Oczywiście nie ma to wpływu na długość kodu. Wiele innych opublikowanych tutaj rozwiązań skorzystałoby podobnie z wykonania testów w tej kolejności.


Dlaczego wc, nie znajdujemy, nie liczymy? Czy liczymy także kod wejściowy do liczby znaków?
Orion

Naprawdę nie rozumiem premii „-5 punktów za policzenie wszystkich wystąpień słowa”. Jeśli to naprawdę oznacza „zgłaszanie wszystkich wystąpień słowa”, tak właśnie robią moje skrypty, bez „| wc”. Nie używam żadnego „kodu wejściowego”, ponieważ grep czyta standardowe dane wejściowe, więc „grep” jest „kodem wejściowym” i policzyłem go. Teraz usunę „| wc”.
Glenn Randers-Pehrson

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

Bez golfa :

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

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

wordlist.txt musi zawierać słowa z małej litery.


1

Rebol (104 znaki)

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

Bez golfa:

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

dteraz zawiera listę znalezionych słów. Oto przykład z konsoli 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 znaków)

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

aby uzyskać liczbę, wyślij #size do wynikowej kolekcji. Zbiór wyników zawiera 43 słowa („abstemicznie” „autorytatywnie” ... „bezsprzecznie” „nie do poznania”)

Powyższy kod ma 77 znaków, ale mógłbym zmienić nazwę pliku listy słów na „w”, więc liczę nazwę pliku jako 1, co daje wynik 57.

Czy odczytanie pliku jest częścią problemu, czy nie? Jeśli nie (patrz inne przykłady), a lista słów znajduje się już w kolekcji c, kod ogranicza się do:

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

czyli 36 znaków (z usuniętymi do pominięcia spacjami).


1

zaktualizowano: niepotrzebne spacje zostały usunięte

Bardzo wolno, ale w bash (81 znaków):

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

EDYCJA: echo $l|fold -w1zastąpiona fold -w1<<<$lzgodnie z sugestią @ nyuszika7h


To jest golf golfowy, możesz chcieć jeszcze bardziej zmniejszyć swój kod. Zacznij od usunięcia niepotrzebnych białych znaków. ;)
nyuszika7h

Możesz dodatkowo zminimalizować kod, używając fold -w1<<<$lzamiast echo $l|fold -w1. Uwaga: bieżący kod ma 84 znaki, nie należy liczyć końcowego znaku nowej linii.
nyuszika7h

Do dzisiaj nic nie wiedziałem o <<<. Jeszcze raz dziękuję, @ ​​nyuszika7h. Czy możesz mi powiedzieć, gdzie to jest wyjaśnione.
Nik O'Lai


1

JavaScript - 95 bajtów

Oto mój golf.

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

Chciałbym również zwrócić uwagę, że w twoim golfie wydaje się, że nie występują wszystkie wystąpienia samogłosek.

Nie golfowany:

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

1
Przeczytaj uważniej specyfikację. Szuka słów, które --- jak żartobliwie --- zawierają wszystkie samogłoski w jednym słowie. Chociaż nie nalega, aby były one zawarte w porządku, tak jak żartobliwie.
dmckee

1
Twoje wyrażenie regularne jest nieprawidłowe. Wszyscy spoglądający w przyszłość skutecznie sprawdzają, czy pierwsza postać jest samogłoską. Musisz (?=.*a)sprawdzić, czy ajest gdzieś w ciągu.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳

@dmckee Właśnie dlatego użyłem lookaheads . Nie wymagają żadnego konkretnego zamówienia.
Isiah Meadows

@nhahtdh Dzięki za złapanie
Isiah Meadows

1

sort + uniq + sed

Ten nie pasuje do powtarzających się wystąpień słowa. Nie pasuje również do litery „y”, jeśli występuje na początku słowa.

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' 

Podobnie jak w drugiej odpowiedzi, zamień „sort wordlist.txt | uniq” na „sort -u wordlist.txt”, aby zapisać 4 bajty.
Glenn Randers-Pehrson

1

Grzmotnąć

Nie tak krótkie jak PO, ale jedna linia w 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

Możesz zapisać cztery bajty, zastępując „sort | uniq” słowem „sort -u”
Glenn Randers-Pehrson

Możesz także usunąć spacje z „|” i „;”, aby zaoszczędzić jeszcze kilka bajtów
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)))));}}

Sformatowany:

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

W tej chwili nie masz ochoty na liczenie, puhale powinno to być łatwe. Ścieżka do listy słów (mała wersja) powinna zostać przekazana do programu jako pierwszy argument:

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

Wydajność:

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

Pozwoliłem sobie na wypisywanie słów i rozdzielanie ich przecinkami; żadne z nich nie jest określone w regułach (który stan „musi znaleźć wszystkie słowa”, a nie jak (i ​​JEŻELI), aby uzyskać dane wyjściowe.

Łącznie z liczbą (+ wyjście): 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());}}

Wydajność:

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

(Uwaga liczba na końcu: 43)

Brak danych wyjściowych („należy znaleźć wszystkie słowa”): 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)));}}

(Ponownie zginam reguły trochę: nie bardzo) Znajduje to wszystkie słowa, a liczenie jest dostępne po wykonaniu r.Count().


1

C-Sharp

Nigdy wcześniej tego nie robiłem i nie jestem pewien, jakie są procedury delegowania. Ale oto co wymyśliłem:

185 bajtów

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>wszystkich słów.

jeśli chcesz wyświetlić sumę:

219 - 5 = 214 bajtów

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


Rozszerzony

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

Zasadniczo, jeśli pytanie dotyczy „programu”, powinieneś opublikować cały program, w tym ładowanie / inicjalizację itp. Świetna robota!
Programator

Oh ok Więc w wersji zminimalizowanej powinienem uwzględnić wszystko, a nie tylko linię spełniającą wymagania? Pomyślałem, że to ten drugi, sądząc po innych odpowiedziach, ponieważ brakowało im kodu do załadowania / odczytania pliku txt.
jzm

Zobaczysz różne podejścia, a biorąc pod uwagę wiek odpowiedzi, prawdopodobnie nie będzie ona tak silna w przypadku nowych odpowiedzi, ale ogólnie, jeśli pytanie wymaga „programu”, powinno być możliwe do skompilowania i uruchomienia zgodnie z opublikowaniem. Weźmy przykład z samego pytania - to kompletne, wykonywalne rozwiązanie, które jest samodzielne.
Programator

Ach, racja. cóż, w takim przypadku zaktualizowałem 2 skrócone wersje, aby były samodzielne.
jzm

Świetny! Zaktualizuj tekst odpowiedzi (wspominasz „bez ładowania / czytania”) i oblicz swój wynik.
Programator

1

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

* 0 + 49c min

Spowoduje to utworzenie wyliczenia zawierającego wszystkie słowa zawierające wszystkie samogłoski.

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. To nie jest a) program, ale fragment programu i b) nie czyta / nie używa listy słów.
RobIII

@RobIII vb.net ma minimum 49c dla podstawowego programu konsoli. Argumentami programu (w tym przypadku listy słów) są tablice a . Plus, jak zauważyli inni, jest to poprawny program w LinqPad.
Adam Speight

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.