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.
code-challenge
natural-language
Doktor
źródło
źródło
Odpowiedzi:
GolfScript, 20 znaków - 5 = 15 punktów
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 znakn*
).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):
(Ps. Technicznie, biorąc pod uwagę, że wyzwanie mówi tylko, że kod musi działać dla tego konkretnego wkładu,
n%{'aeiouy'\-!},`43
był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ść.'aeiouy'\-
bierze dosłowny ciąg znakówaeiouy
i usuwa z niego wszystkie znaki znalezione w kandydującym słowie.!
Następnie logicznie neguje wynikowy ciąg, otrzymując1
(prawda), jeśli ciąg jest pusta i0
(fałsz), jeśli tak nie jest..,+
tworzy kopię filtrowanej tablicy, liczy liczbę słów w niej i dołącza wynik do oryginalnej tablicy.`
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).źródło
GolfScript, 19 znaków
Stosowanie:
Wydajność:
Jeśli chcesz również podać liczbę na końcu, możesz użyć
który jest o cztery znaki dłuższy.
źródło
Python - 46 znaków
Wersja do odczytu: Jest już dość czytelna :-)
źródło
APL, 21-5 = 16
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
źródło
Rubinowy 38
Edycja 34: Najlepsze do tej pory (z @OI):
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".chars
jedna 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:
co oszczędza 11 znaków od tego, co miałem wcześniej.
Edytuj 3 i 3a: @OI straciło jeszcze kilka:
następnie
i ponownie (3b):
Jestem zwykłym pisarzem!
Oto dwa kolejne niekonkurencyjne rozwiązania:
Początkowo miałem:
s
jest ciągiem zawierającym słowa oddzielone znakami nowej linii. Zwracana jest tablica słóws
zawierają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ć
{...}
Początkowo w blokuwięc „skróty” nie są zaznaczone.
Jeśli ciąg
s
moż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==6
gosize>5
.źródło
...size=5
jest błędem - powinien być...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
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 ...Haskell - 67
źródło
Rubinowy - 28 znaków (lub 27, jeśli
y
wykluczono z samogłosek)Pełne polecenie do uruchomienia to (48 znaków):
EDYCJA: zastąpiona zgodnie
puts
zp
sugestią @CarySwovelandźródło
%w[a e i o u]
zaoszczędziłby 1 znak,p
naputs
kolejne 3.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."aeiouy".delete(s)==''
może uratować ci kilka znaków.AWK - 29
Aby uruchomić: Zapisz listę słów pisaną małymi literami
wordlist.txt
. Następnie wykonaj:Jeśli twój system nie ma
mawk
,awk
można go również użyć.Możesz również uruchomić go z pliku, zapisując program
program.awk
i wykonującmawk
lubawk
-f program.awk
.źródło
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 znaków
źródło
k [22-5 = 17 znaków]
Nazwa pliku „corncob_lowercase.txt” zmieniłem na „w”
Policz słowa [22 znaków]
Wydajność
Znajdź wszystkie słowa [25 znaków]
Ogółem 43 słowa zawierające wszystkie samogłoski
(a e i o u y)
Wydajność
źródło
JavaScript / JScript 147 (152-5), 158 (163-5) lub 184 (189-5) bajtów:
Oto moja wersja JavaScript i JScript strasznie „niefunkcjonalna” (
164152152-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ż
length
to 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.
źródło
search()
zamiastindexOf()
oszczędzać 1 znak..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)Rubinowy
3938Obecnie najkrótszy wpis w języku Ruby podczas liczenia całego programu, w tym wejścia i wyjścia.
Zapisano znak, używając
map
zamiasteach
:Inna wersja, 39 znaków z ładniejszym wyjściem:
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ę
y
jako wowel.źródło
Enumerable#grep
aby to skrócić? np.s.split.grep /a*e*i*o*u*y/
zakładając , żes
jest to ciąg słów oddzielonych znakami nowej linii..*
dopasuję , pomiędzy wavels.s = "aeiouy\neiouay\nyuaioe\n"
. Potems.split.grep /a*e*i*o*u*y/
wraca["aeiouy", "eiouay", "yuaioe"]
po mnie. Testowanie wpry
Ruby 2.0.0. Nawiasem mówiąc, świetne rozwiązanie.grep
uż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"
.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.
~ 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,
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 naStringFreeQ[]
funkcji Mathematiki , a następnie stosuje ten test do listy słów za pomocą tejPick[]
funkcji. 65 znaków, a to około 400 razy szybciej niż moje podejście.źródło
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
l
y
samogłoskę (zgodnie z wymaganiami OP!)Perl 6-35 znaków
Zainspirowany Rubinowym rozwiązaniem @CarySwoveland:
Wybiera (
grep
y), że każda linia powróciTrue
do<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*.comb
tylko tworząList
s:⊆
(lub(<=)
jeśli utkniesz w ASCII) zamienia je wSet
s dla ciebie.Aby uzyskać liczbę wydrukowanych wierszy, ten 42-znakowy - 5 = 37 punktowy skrypt również wyświetli:
źródło
C - 96 bajtów
Zaoszczędziłem kilka bajtów nawiasów dzięki szczęśliwemu przypadkowi pierwszeństwa operatorów.
źródło
JavaScript - wynik = 124 - 5 = 119 !!!
Edycja: 17/02/14
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:
źródło
k="aeiouy".split("")
się wfor(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ć.k="aeiouy";o=0;for(i in k)
spróbujo=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.Bash + coreutils, 39
Pobiera dane wejściowe ze standardowego wejścia.
źródło
sed 29 znaków
Zamów wybrane z Częstotliwości liter na wikipedii, aby sprawdzić szybkość.
Na moim hoście:
i
źródło
Bash (grep) - 36 bajtów
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.
źródło
D - 196
Bez golfa :
Zastosowanie :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
musi zawierać słowa z małej litery.źródło
Rebol (104 znaki)
Bez golfa:
d
teraz zawiera listę znalezionych słów. Oto przykład z konsoli Rebol:źródło
Smalltalk (36/57 znaków)
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:
czyli 36 znaków (z usuniętymi do pominięcia spacjami).
źródło
zaktualizowano: niepotrzebne spacje zostały usunięte
Bardzo wolno, ale w bash (81 znaków):
EDYCJA:
echo $l|fold -w1
zastąpionafold -w1<<<$l
zgodnie z sugestią @ nyuszika7hźródło
fold -w1<<<$l
zamiastecho $l|fold -w1
. Uwaga: bieżący kod ma 84 znaki, nie należy liczyć końcowego znaku nowej linii.JavaScript - 95 bajtów
Oto mój golf.
Chciałbym również zwrócić uwagę, że w twoim golfie wydaje się, że nie występują wszystkie wystąpienia samogłosek.
Nie golfowany:
źródło
(?=.*a)
sprawdzić, czya
jest gdzieś w ciągu.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.
źródło
Grzmotnąć
Nie tak krótkie jak PO, ale jedna linia w Bash:
źródło
C # - 170
Sformatowany:
W tej chwili nie masz ochoty na liczenie, ale powinno to być łatwe.Ścieżka do listy słów (mała wersja) powinna zostać przekazana do programu jako pierwszy argument:Wydajność:
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
Wydajność:
(Uwaga liczba na końcu: 43)
Brak danych wyjściowych („należy znaleźć wszystkie słowa”): 137–5 = 132
(Ponownie zginam reguły trochę: nie bardzo) Znajduje to wszystkie słowa, a liczenie jest dostępne po wykonaniu
r.Count()
.źródło
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
wordList
= aList<string>
wszystkich słów.jeśli chcesz wyświetlić sumę:
219 - 5 = 214 bajtów
Rozszerzony
źródło
vb.net (wynik 91 = 96c - 5) * 0
* 0 + 49c min
Spowoduje to utworzenie wyliczenia zawierającego wszystkie słowa zawierające wszystkie samogłoski.
źródło
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.Matematyka -
136102Skrócony link prowadzi do strony http://www.mieliestronk.com/corncob_lowercase.txt
źródło
http://bit.ly/1iZE9kY
.Characters["aeiou"]
lub więcej, jeśli je uwzględniszy
.