Czy to dziwne słowo?


29

Wyzwanie

Biorąc pod uwagę jedno słowo jako dane wejściowe, określ, czy słowo jest nieparzyste, czy parzyste.

Dziwne i parzyste słowa

Załóż ogólne zasady:

odd + odd = even
even + odd = odd
odd + even = odd
even + even = even

W alfabecie litery nieparzyste to:

aeiou

A litery parzyste to:

bcdfghjklmnpqrstvwxyz

To samo dotyczy wielkich liter ( AEIOUsą nieparzyste i BCDFGHJKLMNPQRSTVWXYZsą parzyste).

Następnie „dodajesz” każdą z liter w słowie razem. Na przykład słowo catsto jest równoważne z:

even + odd + even + even

Co upraszcza:

odd + even

Co dodatkowo upraszcza:

odd

Więc słowo catsjest dziwne.

Przykłady

Input:  trees
Output: even

Input:  brush
Output: odd

Input:  CAts
Output: odd

Input:  Savoie
Output: even

Input:  rhythm
Output: even

Zasady

Wszystkie wprowadzone dane będą pojedynczym słowem, które będzie zawierać tylko znaki alfabetyczne.

Jeśli słowo jest nieparzyste, wypisz prawdziwą wartość. Jeśli słowo jest parzyste, wypisz wartość falsey.

Zwycięski

Najkrótszy kod w bajtach wygrywa.


1
Czy możesz dodać przykład słowa bez nieparzystych liter.
Hedi

@Hedi Dodałem jeden rytm
Beta Decay

7
Ex cię zadzwonić . Odd Word ™ jest już znakiem towarowym firmy JLee. Jest to niedozwolone użycie tego terminu. : P
Deusovi

2
To błaga o przesłanie wyrażenia regularnego
Rohan Jhunjhunwala,

2
Czy wprowadzane dane zawierają tylko znaki alfabetyczne?
DJMcMayhem

Odpowiedzi:



18

EXCEL, 79 bajtów:

=MOD(SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),{"a","e","i","o","u"},""))),2)

input:
tę funkcję można umieścić w dowolnym miejscu Z WYJĄTKIEM A1
Zadaj swoje pytanie w A1.

Wyjście: 0 jeśli parzyste, 1 jeśli nieparzyste.


13

JavaScript (ES6), 34 41 33 32 bajty

Zaoszczędzono 1 bajt dzięki Arnauldowi:

s=>~s.split(/[aeiou]/i).length&1
  • Dziwne słowo: zwraca 1
  • Nawet słowa: zwraca 0


Poprzednie rozwiązania:

33 bajty dzięki Arnauldowi:

s=>s.split(/[aeiou]/i).length&1^1
  • Dziwne słowo: zwraca 1
  • Nawet słowa: zwraca 0

Innym sposobem bez operatorów bitowych:

s=>++s.split(/[aeiou]/i).length%2

41 bajtów:

(s,a=s.match(/[aeiou]/ig))=>a&&a.length%2
  • Dziwne słowo: zwraca 1
  • Parzyste słowa z nieparzystymi literami: zwraca 0
  • Parzyste słowa bez nieparzystych liter: zwraca null

42 bajty do zwrotu 0zamiast null:

(s,a=s.match(/[aeiou]/ig))=>a?a.length%2:0

34 bajty, łamanie słów bez nieparzystych liter:

f=s=>s.match(/[aeiou]/ig).length%2

Zaoszczędzono 2 bajty dzięki Shaunowi H.

s=>s.match(/[aeiou]/ig).length%2

1
Ta metoda zrywa się, gdy słowo nie ma samogłosek. To powiedziawszy: f=nie jest potrzebne, a wywołanie exec na obiekcie wyrażenia regularnego jest krótsze. s=>/[aeiou]/ig.exec(s).length%2
Shaun H

Nie mam ten sam wynik z execz gflagą.
Hedi

cholera, tak, zignoruj ​​to, f = wciąż nie jest potrzebne
Shaun H

Można zrobić s=>s.split(/[aeiou]/i).length&1^1?
Arnauld,

1
s=>~s.split(/[aeiou]/i).length&1jest w rzeczywistości o jeden bajt krótszy.
Arnauld,

8

Brain-Flak 206 196 192 178 + 3 = 181 bajtów

Wypróbuj online!

([]<{({}[((((((()()())){}){}){}){}){}()]){({}[({}())]){({}[({})]){({}[({}()())]){({}[({})]){({}<>)(<>)}}}}}{}{}}><>[[]]<>()()){(({}[<>(())<>()()])){{}({}())((<>)<>)}{}}{}<>({}<>)  

Wymaga to działania -cflagi w trybie ASCII, dodając dodatkowe 3 bajty do długości programu.

Nie golfił

([]<
{({}[(((((()()()){}){}){}){}){}()])
 {
  ({}[()()()()])
  {
   ({}[()()()()])
   {
    ({}[(()()()){}])
    {
     ({}[(()()()){}])
     {
      ({}<>)
      (<>)
     }
    }
   }
  }
 }
 {}
}
><>[[]]<>)
(<(()()<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}><>)

Wyjaśnienie

Najpierw zapisz wysokość stosu do przyszłych celów

([]<...>

Następnie, gdy stos nie jest pusty (zakłada, że ​​żaden ze znaków nie jest równy zero)

{...}

Odejmij dziewięćdziesiąt siedem (i zachowaj 3 do późniejszych optymalizacji)

({}[((((((()()())){}){}){}){}){}()])

Jeśli nie jest zero (tj. Nie jest)

{...}

Odejmij 4 (i zapisz 4 do późniejszych optymalizacji)

({}[({}())])

Jeśli nie jest zero (tzn. Nie e)

{...}

Odejmij 4 (i zapisz 4 do późniejszych optymalizacji)

({}[({})])

Jeśli nie jest zero (tj. Nie i)

{...}

Odejmij 6 (i zapisz 6 do późniejszych optymalizacji)

({}[({}()())])

Jeśli nie jest zero (tzn. Nie o)

{...}

Odejmij 6 (zapisz 6, ponieważ program oczekuje jednego później)

({}[({})])

Jeśli nie jest zero (tj. Nie u)

{...}

Przenieś resztę do drugiego stosu i ustaw zero na aktywnym stosie, aby uciec od wszystkich ifs

({}<>)(<>)

Po ucieczce wszystkich ifów usuń zero i sześć

{}{}

Po przetworzeniu wszystkich znaków odejmij wysokość przesunięcia od pierwotnie zapisanej wysokości.

...<>[[]]<>)

Mod przez dwa

{(({}[<>(())<>()()])){{}({}())((<>)<>)}{}}{}<>({}<>) 

Myślę, że -cma tylko +1 bajt, ponieważ zawsze odpowiedź Perla dodaje tylko 1 bajt / flagę.
ThreeFx

1
@ThreeFx To dlatego, że perl -pe'code'jest tylko jeden bajt dłuższy niż perl -e'code'.
Dennis,

8

C, 42 bajty

f(char*s){return*s&&2130466>>*s&1^f(s+1);}

Działa to z GCC 4.x na procesorze x86-64. Wyniki mogą się różnić w zależności od konfiguracji.

Przetestować go na repl.it .

Kosztem kolejnych 5 bajtów można uniknąć niezdefiniowanego zachowania, więc kod powinien działać, o ile int ma szerokość co najmniej 32 bity.

f(char*s){return*s&&2130466>>(*s&31)&1^f(s+1);}

Jak to działa

Modulo 32 , kody wszystkich nieparzystych liter to 1 , 5 , 9 , 15 i 21 . 2130466 jest 32-bitową liczbą całkowitą, która ustawiła bity w tych pozycjach i nie ustawiła bitów we wszystkich innych.

Kiedy f jest wywoływany na łańcuch, najpierw sprawdza, czy pierwszy znak łańcucha jest bajtem zerowym (terminator łańcucha). Jeśli tak, *szwraca 0, a f zwraca 0 . W przeciwnym razie *spodaj kod literowy i &&zostanie wykonany odpowiedni argument logicznego AND ( ).

Ponieważ >>GCC generuje instrukcję zmiany. Na x86-64 CPU odpowiednie wskazówki dla 32-bitowej liczby całkowitej ignoruje wszystkie ale niższe 5 bitów w prawym argumencie, który zapobiega to zmniejszeniu *smodulo 32 . Prawe przesunięcie i następujące po nim bitowe AND z 1 wyodrębnia bit 2130466, który odpowiada literze, która będzie 1, jeśli tylko i tylko jeśli litera jest nieparzysta.

Następnie zwiększamy wskaźnik s (skutecznie odrzucając pierwszą literę), wywołujemy rekurencyjnie f na ściętym łańcuchu i bierzemy bitową XOR wyniku z góry oraz wynik wywołania rekurencyjnego.


Świetna mądra praca!
Keyu Gan,

erees Zwróć 0 w Ideone, prawda?
RosLuP,

@RosLuP Nie, to nie jest poprawne. Działa to na moim komputerze i na repl.it (być może dlatego, że wersja GCC jest zupełnie inna).
Dennis,

Tak, to zdecydowanie kompilator. Z clang 3.7 działa również na Ideone .
Dennis

7

sed 44 (42 + 1 dla -n) 43

-1 dzięki Neilowi

s/[aeiou][^aeiou]*[aeiou]//gi
/[aeiou]/Ico

Drukuje ona nieparzyste i nic na parzyste


s/[aeiou][^aeiou]*[aeiou]//gimoże zaoszczędzić bajt, jeśli poprawnie policzyłem.
Neil

@Neil Yep! Chciałbym, żeby sed mógł przeprowadzić chciwe poszukiwania.
Riley,

7

Python, 41 bajtów

lambda s:sum(map(s.count,"aeiouAEIOU"))%2

6

Python, 42 bajty

lambda s:sum(c in"aeiouAEIOU"for c in s)%2

Nie wiele do wyjaśnienia tutaj. Funkcja bez nazwy, która zwraca 0 lub 1.


6

Brain-Flak , 524, 446 , 422 bajtów

{(<((((()()()()){}){}){}<>)>)<>{({}[()])<>(({}[({})]())){{}(<({}({}))>)}{}<>}{}<>([(((({}<{}<>>))))]()){(<{}>)<>({}[()])<>}<>({}())<>{}([{}]()()()()()){(<{}>)<>({}[()])<>}<>({}())<>{}(((()()())){}{}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}(((()()()()())){}{}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}((((()()()){}())){}{}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}}(<(()())>)<>{({}[()])<>(({}[({})]())){{}(<({}({}))>)}{}<>}{}<>({}<{}<>>)

Wypróbuj online!

Wersja bez golfa, bardziej czytelna:

{((((()()()()){}){}){})(<({}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}><>)((((({})))))
(())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()()()()()())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()()()()()()()()()()()())
({}[{}]){(<{}>)<>({}[()])<>}<>({}())<>{}
(()()()()()()()()()()()()()()()()()()()()())
({}[{}])
{(<{}>)<>({}[()])<>}<>({}())<>{}}<>(()())(<({}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}><>){{}([()])
(<><>)}({}{}())

Wersja Ungolfed nie działa (nie pasuje do linku TIO w komentarzu; _;)
Wheat Wizard

6
„bardziej czytelne”, chociaż powiedział
Rohan Jhunjhunwala,

6

Galaretka , 13 12 11 bajtów

-1 bajt dzięki @Luis Mendo (użyj, aby zastąpić %2)
-1 bajt dzięki @Dennis (użyj kompresji ciągu)

Œlf“¡ẎṢɱ»LḂ

Wszystkie przypadki testowe znajdują się w TryItOnline

W jaki sposób?

Œlf“¡ẎṢɱ»LḂ - Main link takes an argument - s
Œl          - lowercase(s)
   “¡ẎṢɱ»   - string of lowercase vowels (compression using the words a and eoui)
  f         - filter - keep only the vowels
         L  - length - the number of vowels
          Ḃ - Bit (modulo 2)

Niekonkurencyjne, 5 bajtów (ponieważ właśnie dodałem funkcję Øc)

fØcLḂ

Przypadki testowe również w TryItOnline

Tak jak powyżej, ale Øcdaje samogłoski alfabetu łacińskiego,'AEIOUaeiou'


1
Myślę, że można zastąpić %2przez
Luis Mendo

7
euoi to okrzyk namiętnego uniesienia w starożytnych biesiadnych biesiadach , więc możesz użyć słownika i uzyskać samogłoski jako “¡ẎṢɱ».
Dennis,

@Dennis - LOL oczywiście!
Jonathan Allan

2
@Dennis Jak dokładnie to działa? Czy to tylko kompresja bazy, aby uzyskać indeks słowa w wielkim słowniku? Skąd pochodzi „a”?
DJMcMayhem

2
@DJMcMayhem jest to kompresja bazowa 250 przy użyciu słownika (który, jak sądzę, został pobrany z komputera Dennisa) z oddzieleniem krótkich (mniej niż 6 znaków) i długich słów. Niektóre kod zautomatyzować proces tworzenia skompresowanych ciągi został napisany przez Lynn. Nieużywane 6 bajtów to znaki identyfikujące ciąg Jelly “”«»‘’(istnieje również ciąg znaków dwóch znaków, ale używany w skompresowanych ciągach).
Jonathan Allan,

6

Haskell, 38 37 bajtów

odd.length.filter(`elem`"aeiouAEIOU")

Dzięki Angs za jeden bajt!


Prawda dla nieparzystych, więc musisz użyć oddzamiast even. Oszczędza jeden bajt!
Angs,

@Angs clever :)
BlackCap

4

Python 3, 53 bajtów

Można to prawdopodobnie pograć w golfa dalej:

lambda n:[x in 'aeiou' for x in n.lower()].count(1)&1

Usuń spacje między ini 'aeiou'a for, a użycie sumzapisać 8 bajtów: lambda n:sum(x in'aeiou'for x in n.lower())&1(choć jak widać z postu DJMcMayhem Korzystanie wszystkie dziesięć samogłosek jest także krótszy)
Jonathan Allan

1
Dzięki za wskazówki! Zauważyłem trochę spacji trochę po opublikowaniu, ale szczerze mówiąc, @DJMcMayhem i ja mieliśmy identyczne podejście, ponieważ jest to najlepsza wersja, jaką mogę sobie wyobrazić dla rozwiązania Python. Nie znałem sum()polecenia przed tym golfem, więc jeszcze raz się nauczyłem! Miłego dnia :)
L. Steer,

4

Java, 73

boolean f(String s){return s.replaceAll("(?i)[^aeiou]","").length()%2>0;}

widziałem kilka innych odpowiedzi w języku Java, w przeciwnym razie nie podzieliłbym się nimi. Dzięki Phaeze za uratowanie bajtu.


1
Myślę, że możesz uratować bajt za pomocą%2>0
JustinM - Przywróć Monikę

4

C 52 bajty

h(o){o=strpbrk(o,"aeiouAEIOU");return o?1^h(o+1):0;}

główny i wynik:

main()
{int   k;
 char *a[]={"trees","brush","CAts","Savoie","rhythm", 0};

 for(k=0;a[k];++k)
     printf("[%s]=%s\n", a[k], h(a[k])?"odd":"even");
}

/*
91
[trees]=even
[brush]=odd
[CAts]=odd
[Savoie]=even
[rhythm]=even

*/

staram się używać int jako wskaźników, ale nie kompiluje się tam, gdzie użycie przekierowania * ... rozwiązanie wydrukowane tutaj tutaj było złe ...
RosLuP

h(o){return~-o?1^h(1+strpbrk(o,"aeiouAEIOU")):1;}oszczędza 3 bajty.
Dennis,

s; h (o) {s = ~ -o? 1 ^ h (1 + strpbrk (o, "aeiouAEIOU")): 1;} wynik znajduje się w zmiennej globalnej s ...
RosLuP

Niestety nie jest to dozwolone. Funkcje muszą być wielokrotnego użytku, a to się zepsuje, jeśli użyjesz go więcej niż jeden raz. Zapisywanie danych wyjściowych w zmiennej nie jest dozwolone, chyba że weźmiesz lokalizację jako dane wejściowe użytkownika.
Dennis,

Myślę, że w tym przypadku ponowne użycie jest możliwe, ponieważ wartość początkowa s teraz nie jest ważna ... ok, teraz myślę, że coś może pójść nie tak ... Dzięki
RosLuP 21.09.16

3

Pyth, 14 bajtów

%l@"aeiou"rQ02

Wypróbuj online!

Wyjaśnienie:

  @"aeiou"       Grab only the vowels
          rQ0      From lowercased input
 l                 Get the length of this
%            2     And mod 2 to check for oddness


3

Vim, 32, 31 , 29 klawiszy

:s/[^aeiou]//gi
C<C-r>=len(@")%2<cr>

Ponieważ interpreter V jest wstecznie kompatybilny, możesz wypróbować go online! tutaj.

Jeden trzy bajty zapisane dzięki m-chrzan!


1
Czy możesz to zrobić s/.../gizamiast s/\c.../g?
m-chrzan

@ m-chrzan Woah, niesamowita wskazówka. Dzięki!
DJMcMayhem

Również '<C-r>"'-> @".
m-chrzan

1
Dowiedziałem się około @"15 minut temu. Najlepszą wskazówką, jaką mam, jest użycie :help fooi /dokumentacji: P.
m-chrzan

2
Skoro mówimy o golfie, :h foojest krótszy. : P
DJMcMayhem

3

Java 7, 88

boolean f(char[]s){int x=0;for(char c:s)if("aeiouAEIOU".indexOf(c)>=0)++x;return x%2>0;}

Nie golfowany:

  boolean f(char[] s) {
    int x = 0;
    for (char c : s) {
      if ("aeiouAEIOU".indexOf(c) >= 0) {
        ++x;
      }
    }
    return x % 2 > 0;
  }

3

dimwit , 14 bajtów (niekonkurencyjny)

ar[aeiou]}et}T

Pomyślałem, że będzie to zabawne, proste wyzwanie na początek dla nowego języka.

Wyjaśnienie

  • a - wypchnij nową macierz do matrycy
  • r[aeiou]} - zlicz wystąpienie wszystkich wartości pasujących do wyrażenia regularnego „[aeiou]” w pierwszej tablicy (ponieważ pierwsza tablica zawiera dane wejściowe), ignorując wielkość liter i wypchnij tę wartość na koniec ostatniej tablicy.
  • e - jeśli ostatnia liczba w ostatniej tablicy jest parzysta (którą ustawiliśmy na liczbę wystąpień), wykonaj następne operacje aż do nawiasu zamykającego („}”)
  • t - zatrzymać wykonywanie, wyczyścić macierz i ustawić pierwszą wartość na false
  • }- koniec ebloku kodu
  • T - zatrzymać wykonywanie, wyczyścić macierz i ustawić pierwszą wartość na true

Wypróbuj online!

Użyj pola wprowadzania, aby wprowadzić słowo.

Wkrótce dodam dokumentację ...


2

PowerShell v2 +, 45 42 bajtów

($args[0]-replace'[^aeiouAEIOU]').Length%2

Pobiera dane wejściowe $args[0], wysyła je, -replaceaby usunąć wszystkie znaki inne niż samogłoska, bierze wynikowe .lengthi %2sprawdza, czy jest nieparzyste / parzyste.

Przykłady

PS C:\Tools\Scripts\golfing> 'trees','brush','CAts','Savoie','rhythm'|%{"$_ --> "+(.\is-it-an-odd-word.ps1 $_)}
trees --> 0
brush --> 1
CAts --> 1
Savoie --> 0
rhythm --> 0

2

J, 20 bajtów

2|+/@e.&'aeiouAEOIU'

Proste podejście

Wyjaśnienie

2|+/@e.&'aeiouAEOIU'  Input: string S
     e.&'aeiouAEOIU'  Test each char in S for membership in 'aeiouAEOIU'
  +/@                 Sum those values
2|                    Take it modulo 2 and return

Haha, właśnie opublikowałem odpowiedź J (teraz usuniętą) o 1 bajt dłużej. Dobra robota!
Conor O'Brien,

Gdzie jest polecenie „weź dane”?
RosLuP

@RosLuP Jest to czasownik (funkcja), który przyjmuje pojedynczy argument jako dane wejściowe. J korzysta z programowania ukrytego, więc polecenia są łączone w łańcuchy i niejawnie przekazują wartości
mile

2

Japt, 7 bajtów

1&Uè"%v

Przetestuj online! Wyjścia 1 dla nieparzystych, 0 dla parzystych.

Jak to działa

         // Implicit: U = input string
  Uè     // Count the number of matches of the following regex in the input:
    "%v  //   /[AEIOUaeiou]/g
1&       // Take only the first bit (convert 1, 3, 5, etc. to 1, and others to 0)
         // Implicit output

2

Oktawa, 34 bajty

@(s)mod(nnz(~(s'-'aeiouAEIOU')),2)


s'-'aeiouAEIOU'    % Creates a 2D-matrix where each of the odd letters are 
                   % subtracted from the string s
~(s'-'aeiouAEIOU') % Negates that array, so the all zero elements become 1
nnz( .... )        % Counts all the non-zero elements (the odd letters)
mod(nnz( ....),2   % Takes this sum modulus 2

Jest to 6 bajtów krócej niż przy użyciu tradycyjnego podejścia ismember, @(s)mod(sum(ismember(s,'aeiouAEIOU')),2)oraz dwa bajty krótszy niż podejście regex: @(s)mod(nnz(regexpi(s,'[aeiou]')),2).

Sprawdź to tutaj .



2

Mathematica, 44 bajty

OddQ@StringCount[#,Characters@"aeiouAEIOU"]&

Daje wartość True dla nieparzystego ciągu i False dla parzystej.


1
+1 do dowolnego mężczyzny lub kobiety uczącej się matematyki
Magic Octopus Urn


2

C # 64 62 56 50 bajtów

s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
  • Już używamy linq, więc Contains zapisuje 2 bajty nad IndexOf
  • Korzystanie z metody przeciążenie Count oszczędza 6 bajtów
  • Dzięki @Milk za zaproponowanie zgrabnej metody i oszczędność 6 dodatkowych bajtów

Anonimowa funkcja, która pobiera ciąg znaków i zlicza nieparzyste litery, a następnie zwraca true, jeśli jest ich nieparzysta liczba, lub false, jeśli nie ma.

To nowe rozwiązanie dzieli ciąg na dowolny ze znaków w podanej tablicy znaków. Mechanika tego odwraca znaczenie %2wyniku; 0 jest teraz nieparzyste, a 1 nawet stąd 1>.

Wypróbuj online tutaj!


Do string.Split()zliczenia samogłosek wystarczy 50 bajtów i nie potrzebujesz LINQ. s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
mleko

@ mleko Dzięki za to bardzo miłe rozwiązanie.
JustinM - Przywróć Monikę

1

Retina , 19 bajtów

Mi`[aeiou]
[13579]$

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Pierwszy wiersz zlicza samogłoski na wejściu. Druga linia sprawdza, czy wynik jest nieparzysty.


1

MATL , 8 , 7 bajtów

13Y2mso

Wypróbuj online!

Wyjaśnienie:

13Y2    % Push the string 'aeiouAEIOU', a predefined literal. 
    m   % For each char of the input that is in that string, push a one. For every other element, push a zero.
     s  % Sum this array
      o % Mod 2

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.