Apakah ini kata yang aneh?


29

Tantangan

Diberi kata tunggal sebagai input, tentukan apakah kata itu ganjil atau genap.

Kata-kata ganjil dan genap

Asumsikan aturan umum:

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

Dalam alfabet, huruf anehnya adalah:

aeiou

Dan huruf genapnya adalah:

bcdfghjklmnpqrstvwxyz

Hal yang sama berlaku untuk huruf kapital ( AEIOUganjil dan BCDFGHJKLMNPQRSTVWXYZgenap).

Anda kemudian 'menambahkan' masing-masing huruf dalam kata bersama. Misalnya, kata catstersebut setara dengan:

even + odd + even + even

Yang disederhanakan menjadi:

odd + even

Yang menyederhanakan lebih lanjut ke:

odd

Jadi kata catsitu aneh.

Contohnya

Input:  trees
Output: even

Input:  brush
Output: odd

Input:  CAts
Output: odd

Input:  Savoie
Output: even

Input:  rhythm
Output: even

Aturan

Semua input akan menjadi satu kata yang hanya akan berisi karakter alfabet.

Jika kata tersebut ganjil, berikan nilai yang benar. Jika kata tersebut genap, berikan nilai falsey.

Kemenangan

Kode terpendek dalam byte menang.


1
Bisakah Anda menambahkan contoh kata tanpa huruf ganjil.
Hedi

@Hedi Saya telah menambahkan satu, ritme
Beta Decay

7
Mis, maafkan kamu. Odd Word ™ sudah memiliki merek dagang oleh JLee. Ini adalah penggunaan istilah yang tidak sah. : P
Deusovi

2
Ini memohon pengajuan regex murni
Rohan Jhunjhunwala

2
Apakah input dijamin hanya mengandung karakter alfabet?
DJMcMayhem

Jawaban:



18

EXCEL, 79 byte:

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

input:
Fungsi ini dapat ditempatkan di mana saja KECUALI A1
Masukkan kata Anda ke dalam A1.

Output: 0 jika genap, 1 jika ganjil.


13

JavaScript (ES6), 34 41 33 32 byte

Disimpan 1 byte berkat Arnauld:

s=>~s.split(/[aeiou]/i).length&1
  • Kata ganjil: kembali 1
  • Bahkan kata-kata: kembali 0


Solusi sebelumnya:

33 byte berkat Arnauld:

s=>s.split(/[aeiou]/i).length&1^1
  • Kata ganjil: kembali 1
  • Bahkan kata-kata: kembali 0

Cara lain tanpa operator bitwise:

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

41 byte:

(s,a=s.match(/[aeiou]/ig))=>a&&a.length%2
  • Kata ganjil: kembali 1
  • Bahkan kata-kata dengan huruf aneh: kembali 0
  • Bahkan kata-kata tanpa huruf aneh: kembali null

42 byte untuk dikembalikan, 0bukan null:

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

34 byte, istirahat kata-kata tanpa huruf aneh:

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

Disimpan 2 byte berkat Shaun H

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

1
Metode ini rusak ketika kata tidak memiliki vokal. Yang mengatakan: f=tidak diperlukan, dan memanggil exec pada objek regex lebih pendek. s=>/[aeiou]/ig.exec(s).length%2
Shaun H

Saya tidak memiliki hasil yang sama execdengan gbendera.
Hedi

otak sialan ya abaikan itu, f = masih tidak diperlukan sekalipun
Shaun H

Bisakah kamu melakukannya s=>s.split(/[aeiou]/i).length&1^1?
Arnauld

1
s=>~s.split(/[aeiou]/i).length&1sebenarnya satu byte lebih pendek.
Arnauld

8

Brain-Flak 206 196 192 178 + 3 = 181 byte

Cobalah secara Online!

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

Ini membutuhkan -cbendera untuk berjalan dalam mode ASCII menambahkan 3 byte tambahan ke panjang program.

Tidak disatukan

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

Penjelasan

Pertama-tama simpan tinggi tumpukan untuk tujuan di masa mendatang

([]<...>

Kemudian sementara tumpukan tidak kosong (mengasumsikan bahwa tidak ada karakter yang nol)

{...}

Kurangi sembilan puluh tujuh (dan simpan 3 untuk optimasi nanti)

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

Jika bukan nol (yaitu bukan a)

{...}

Kurangi 4 (dan simpan 4 untuk optimisasi nanti)

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

Jika bukan nol (yaitu bukan e)

{...}

Kurangi 4 (dan simpan 4 untuk optimisasi nanti)

({}[({})])

Jika bukan nol (yaitu bukan saya)

{...}

Kurangi 6 (dan simpan 6 untuk optimisasi nanti)

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

Jika bukan nol (yaitu bukan o)

{...}

Kurangi 6 (simpan 6 karena program mengharapkannya nanti)

({}[({})])

Jika bukan nol (yaitu bukan u)

{...}

Pindahkan sisanya ke tumpukan lain dan beri angka nol pada tumpukan aktif untuk menghindari semua seandainya

({}<>)(<>)

Setelah semua ifs telah lolos, lepaskan nol dan enam

{}{}

Setelah semua karakter diproses, kurangi tinggi offset dari ketinggian yang disimpan sebelumnya.

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

Mod oleh dua

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

Saya pikir -chanya +1 byte karena jawaban Perl juga hanya menambahkan 1 byte / flag.
ThreeFx

1
@ThreeFx Itu karena perl -pe'code'hanya satu byte lebih panjang dari perl -e'code'.
Dennis

8

C, 42 byte

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

Ini bekerja dengan GCC 4.x pada CPU x86-64. Hasil dapat bervariasi dengan pengaturan berbeda.

Mengujinya pada repl.it .

Dengan biaya 5 byte lebih, perilaku yang tidak terdefinisi dapat dihindari, sehingga kode harus bekerja selama int setidaknya 32 bit.

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

Bagaimana itu bekerja

Modulo 32 , kode karakter dari semua huruf aneh adalah 1 , 5 , 9 , 15 , dan 21 . 2130466 adalah integer 32-bit yang telah menetapkan bit pada posisi ini dan menghapus bit pada yang lainnya.

Ketika f dipanggil pada sebuah string, ia pertama-tama memeriksa apakah karakter pertama dari string tersebut adalah byte nol (string terminator). Jika ya, *shasilkan 0 dan f mengembalikan 0 . Kalau tidak, *shasilkan kode karakter huruf dan argumen yang benar dari logika AND ( &&) dieksekusi.

Sebab >>, GCC menghasilkan instruksi shift. Pada CPU x86-64, instruksi yang sesuai untuk integer 32-bit mengabaikan semua kecuali 5 bit yang lebih rendah dari argumen yang benar, yang menghindari pengurangan *smodulo 32 . Pergeseran kanan dan bitwise berikut DAN dengan 1 mengekstrak bit 2130466 yang sesuai dengan huruf, yang akan menjadi 1 jika dan hanya jika hurufnya ganjil.

Setelah itu, kami kenaikan pointer s (efektif membuang huruf pertama), panggilan f rekursif pada string dipenggal, dan mengambil XOR bitwise hasil dari atas dan hasil dari panggilan rekursif.


Kerja bijak yang luar biasa!
Keyu Gan

erees Kembali 0 di Ideone, apakah benar?
RosLuP

@ RosLuP Tidak, itu tidak benar. Ini bekerja pada komputer saya dan pada repl.it (mungkin karena versi GCC sangat berbeda).
Dennis

Ya, itu pasti kompilernya. Dengan dentang 3,7, ia bekerja di Ideone juga .
Dennis

7

sed 44 (42 +1 untuk -n) 43

-1 Terima kasih kepada Neil

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

Mencetak ountuk yang aneh dan tidak ada yang genap


s/[aeiou][^aeiou]*[aeiou]//gimungkin menghemat satu byte, jika saya sudah menghitung dengan benar.
Neil

@Neil Yap! Saya berharap sed bisa melakukan pencarian non-serakah.
Riley

7

Python, 41 byte

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

6

Python, 42 byte

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

Tidak banyak yang bisa dijelaskan di sini. Fungsi tanpa nama yang mengembalikan 0 atau 1.


6

Brain-Flak , 524, 446 , 422 byte

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

Cobalah online!

Versi tidak disatukan dan lebih mudah dibaca:

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

Versi Ungolfed tampaknya tidak berfungsi (tidak dapat memuat tautan TIO dalam komentar; _;)
Wheat Wizard

6
"Lebih mudah dibaca", kata Nough
Rohan Jhunjhunwala

6

Jelly , 13 12 11 byte

-1 byte terima kasih kepada @Luis Mendo (gunakan untuk mengganti %2)
-1 byte terima kasih kepada @Dennis (gunakan kompresi string)

Œlf“¡ẎṢɱ»LḂ

Semua test case ada di TryItOnline

Bagaimana?

Œ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)

Non-bersaing, 5 byte (karena saya baru saja menambahkan fungsi Øc)

fØcLḂ

Uji kasus juga di TryItOnline

Sama seperti di atas, tetapi Øcmenghasilkan vokal alfabet Latin,'AEIOUaeiou'


1
Saya pikir Anda dapat menggantinya %2dengan
Luis Mendo

7
euoi adalah teriakan kegembiraan yang penuh gairah dalam kebahagiaan Bacchic kuno , sehingga Anda dapat menggunakan kamus dan mendapatkan vokal sebagai “¡ẎṢɱ».
Dennis

@ Dennis - LOL tentu saja!
Jonathan Allan

2
@ Dennis Bagaimana cara kerjanya? Apakah ini hanya kompresi dasar untuk mendapatkan indeks kata dalam kamus raksasa? Dari mana 'a' berasal?
DJMcMayhem

2
@DJMcMayhem ini adalah kompresi basis 250 menggunakan kamus (yang saya percaya baru saja diambil dari komputer Dennis) dengan pemisahan antara kata-kata pendek (kurang dari 6 karakter) dan panjang. Beberapa kode untuk mengotomatisasi proses pembuatan string terkompresi ditulis oleh Lynn. 6 byte yang tidak digunakan adalah karakter pengenal string Jelly “”«»‘’(ada juga yang untuk string dua-karakter, tetapi yang digunakan dalam string terkompresi).
Jonathan Allan

6

Haskell, 38 37 byte

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

Terima kasih kepada Angs untuk satu byte!


Sejujurnya aneh, jadi Anda harus menggunakan oddbukan even. Menghemat satu byte!
Angs

@Angs pintar :)
BlackCap

4

Python 3, 53 Bytes

Ini mungkin bisa di-golf lebih lanjut:

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

Hapus spasi di antara indan 'aeiou'dan for, dan gunakan sumuntuk menyimpan 8 byte: lambda n:sum(x in'aeiou'for x in n.lower())&1(walaupun seperti yang Anda lihat dari pos DJMcMayhem menggunakan kesepuluh vokal juga lebih pendek)
Jonathan Allan

1
Terima kasih atas tipsnya! Saya memperhatikan ruang ekstra sedikit setelah posting, tetapi dalam semua kejujuran, @DJMcMayhem dan saya memiliki pendekatan yang identik dengan dia menjadi versi terbaik yang dapat saya bayangkan untuk solusi Python. Saya tidak tahu tentang sum()perintah sebelum golf ini jadi sekali lagi saya belajar sesuatu! Semoga harimu menyenangkan :)
L. Steer

4

Jawa, 73

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

melihat beberapa jawaban java lainnya, jika tidak tidak akan dibagikan. Terima kasih kepada Phaeze karena telah menghemat satu byte.


1
Saya pikir Anda dapat menyimpan byte dengan%2>0
JustinM - Reinstate Monica

4

C 52 byte

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

utama dan hasilnya:

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

*/

saya mencoba menggunakan int sebagai pointer tetapi tidak mengkompilasi di mana penggunaan inirection * ... solusi yang dicetak pertama di sini salah ...
RosLuP

h(o){return~-o?1^h(1+strpbrk(o,"aeiouAEIOU")):1;}menghemat 3 byte.
Dennis

s; h (o) {s = ~ -o? 1 ^ h (1 + strpbrk (o, "aeiouAEIOU")): 1;} hasilnya adalah dalam variabel global ...
RosLuP

Sayangnya, itu tidak diizinkan. Fungsi harus dapat digunakan kembali, dan ini akan rusak jika Anda menggunakannya lebih dari sekali. Juga, menyimpan output dalam suatu variabel tidak diperbolehkan, kecuali jika Anda mengambil lokasi sebagai input pengguna.
Dennis

Saya pikir dalam hal ini penggunaan kembali dimungkinkan karena nilai awal s sekarang tidak penting ... ok ok sekarang saya pikir ada yang salah ... Terima kasih
RosLuP

3

Pyth, 14 byte

%l@"aeiou"rQ02

Cobalah secara Online!

Penjelasan:

  @"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 penekanan tombol

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

Karena penerjemah V kompatibel dari belakang, Anda dapat mencobanya secara online! disini.

Satu Tiga byte disimpan berkat m-chrzan!


1
Dapat Anda lakukan s/.../gibukan s/\c.../g?
m-chrzan

@ m-chrzan Woah, tip yang luar biasa. Terima kasih!
DJMcMayhem

Juga, '<C-r>"'-> @".
m-chrzan

1
Saya tahu sekitar @"15 menit yang lalu. Tip vim terbaik yang saya miliki adalah menggunakan :help foodan /dokumentasi: P.
m-chrzan

2
Yah, karena kita berbicara tentang golf, :h foolebih pendek. : 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;}

Tidak Terkumpul:

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

3

dimwit , 14 byte (tidak bersaing)

ar[aeiou]}et}T

Saya pikir ini akan menjadi tantangan yang menyenangkan dan sederhana untuk memulai dengan bahasa baru.

Penjelasan

  • a - dorong array baru ke matriks
  • r[aeiou]} - hitung kemunculan semua nilai yang cocok dengan regex "[aeiou]" dalam array pertama (karena array pertama berisi input), abaikan case, dan dorong nilai itu ke akhir array terakhir.
  • e - jika angka terakhir dalam array terakhir adalah genap (yang kami atur ke jumlah kemunculan), lakukan operasi berikutnya hingga braket penutup ("}")
  • t - hentikan eksekusi, kosongkan matriks, dan atur nilai pertama menjadi false
  • }- akhir eblok kode
  • T - hentikan eksekusi, hapus matriks, dan tetapkan nilai pertama menjadi benar

Cobalah online!

Gunakan bidang Input untuk memasukkan kata.

Saya akan segera menambahkan dokumentasi ...


2

PowerShell v2 +, 45 42 byte

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

Mengambil input $args[0], mengirimkannya -replaceuntuk menghapus semua karakter non-vokal, mengambil hasilnya .length, dan%2 untuk memeriksa apakah itu aneh / genap.

Contohnya

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 byte

2|+/@e.&'aeiouAEOIU'

Pendekatan lurus ke depan

Penjelasan

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, saya baru saja memposting jawaban J (sekarang dihapus) 1 byte lebih lama dari ini. Pekerjaan yang baik!
Conor O'Brien

Di mana perintah untuk "mengambil input"?
RosLuP

@RosLuP Ini adalah kata kerja (fungsi) yang mengambil argumen tunggal sebagai input. J menggunakan pemrograman diam-diam sehingga perintah dirantai bersama dan memberikan nilai secara implisit
mil

2

Japt, 7 byte

1&Uè"%v

Uji secara online! Output 1 untuk ganjil, 0 untuk genap.

Bagaimana itu bekerja

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

Oktaf, 34 byte

@(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

Ini adalah 6 byte lebih pendek dibandingkan dengan pendekatan tradisional yang menggunakan ismember, @(s)mod(sum(ismember(s,'aeiouAEIOU')),2)dan dua byte lebih pendek dibandingkan dengan pendekatan regex: @(s)mod(nnz(regexpi(s,'[aeiou]')),2).

Uji di sini .


2

PHP, 41 byte

<?=count(spliti("[aeiou]",$argv[1]))%2-1;

Ini menghasilkan -1 untuk kebenaran dan 0 untuk falsey.


2

Mathematica, 44 byte

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

Memberikan True untuk string aneh dan False untuk string genap.


1
Memberi +1 kepada setiap pria atau wanita yang belajar matematika
Magic Octopus Mm


2

C # 64 62 56 50 Bytes

s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
  • Kami sudah menggunakan LINQ, jadi Berisi menyimpan 2 byte lebih dari IndexOf
  • Menggunakan metode overload Count menghemat 6 byte
  • Terima kasih kepada @Milk untuk menyarankan metode yang rapi dan menghemat 6 byte lebih

Fungsi anonim yang mengambil string dan menghitung huruf ganjil kemudian mengembalikan true jika ada angka ganjil atau salah jika tidak ada.

Solusi baru ini membagi string pada salah satu karakter dalam array char yang diberikan. Mekanisme ini membalikkan makna %2hasilnya; 0 sekarang aneh dan 1 bahkan karenanya 1>.

Coba online di sini!


Hanya 50 byte yang digunakan string.Split()untuk menghitung vokal dan Anda tidak perlu LINQ. s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
susu

@milk Terima kasih untuk itu, solusi yang sangat rapi.
JustinM

1

Retina , 19 byte

Mi`[aeiou]
[13579]$

Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)

Baris pertama menghitung vokal dalam input. Baris kedua memeriksa apakah hasilnya aneh.


1

MATL , 8 , 7 byte

13Y2mso

Cobalah online!

Penjelasan:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.