それは奇妙な言葉ですか?


29

チャレンジ

単一の単語を入力として、単語が奇数か偶数かを判断します。

奇数と偶数の言葉

一般的なルールを仮定します:

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

アルファベットでは、奇数文字は次のとおりです。

aeiou

そして、偶数文字は次のとおりです。

bcdfghjklmnpqrstvwxyz

同じことは大文字にも当てはまります(AEIOU奇数とBCDFGHJKLMNPQRSTVWXYZ偶数)。

次に、単語内の各文字を「追加」します。たとえば、単語catsは次と同等です。

even + odd + even + even

単純化するもの:

odd + even

これにより、さらに簡素化されます。

odd

だから言葉catsは奇妙です。

Input:  trees
Output: even

Input:  brush
Output: odd

Input:  CAts
Output: odd

Input:  Savoie
Output: even

Input:  rhythm
Output: even

ルール

すべての入力は、アルファベット文字のみを含む単一の単語になります。

単語が奇数の場合、真実の値を出力します。単語が偶数の場合、偽の値を出力します。

勝ち

バイト単位の最短コードが優先されます。


1
奇妙な文字のない単語の例を追加してください。
エディ

、私は1つを追加したリズム@Hedi
ベータ崩壊

7
exは必ず使うあなたを。Odd Word™ はすでにJLeeによって商標登録されています。これは、用語の不正使用です。:P
デウソビ

2
これは純粋な正規表現の提出のために物乞いされる
ロハンJhunjhunwala

2
入力にはアルファベット文字のみが含まれることが保証されていますか?
DJMcMayhem

回答:



18

EXCEL、79バイト:

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

入力:
この関数は、A1以外の任意の場所に配置できます
。問題の単語をA1に入れます。

出力:偶数の場合は0、奇数の場合は1。


13

JavaScript(ES6)、34 41 33 32バイト

Arnauldのおかげで1バイト節約されました:

s=>~s.split(/[aeiou]/i).length&1
  • 奇数:を返します 1
  • 偶数語:戻り値 0


以前のソリューション:

Arnauldのおかげで33バイト:

s=>s.split(/[aeiou]/i).length&1^1
  • 奇数:を返します 1
  • 偶数語:戻り値 0

ビット演算子を使用しない別の方法:

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

41バイト:

(s,a=s.match(/[aeiou]/ig))=>a&&a.length%2
  • 奇数:を返します 1
  • 奇数文字の偶数語:を返します 0
  • 奇数文字のない偶数語:を返します null

0代わりに42バイトを返しますnull

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

34バイト、奇数文字のない単語の区切り:

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

Shaun Hのおかげで2バイト節約

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

1
単語に母音がない場合、このメソッドは中断します。つまり:f=必要ではなく、正規表現オブジェクトでexecを呼び出す方が短くなります。s=>/[aeiou]/ig.exec(s).length%2
ショーンH

フラグを使用execしても同じ結果が得られませんg
エディ

いまいましい脳は無視します、f =はまだ必要ではありません
ショーンH

できますかs=>s.split(/[aeiou]/i).length&1^1
アーナルド

1
s=>~s.split(/[aeiou]/i).length&1実際には1バイト短くなります。
アーナウルド

8

脳フラック 206 196 192 178 + 3 = 181バイト

オンラインでお試しください!

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

これには、-cプログラムの長さにさらに3バイトを追加するASCIIモードで実行するフラグが必要です。

非ゴルフ

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

説明

最初に将来の目的のためにスタックの高さを保存します

([]<...>

その後、スタックが空ではありません(文字がゼロではないと仮定します)

{...}

97を引きます(後で最適化するために3を格納します)

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

ゼロでない(つまり、aではない)

{...}

4を引きます(そして、後の最適化のために4を格納します)

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

ゼロでない場合(eではない場合)

{...}

4を引きます(そして、後の最適化のために4を格納します)

({}[({})])

ゼロでない場合(つまりiではない場合)

{...}

6を引きます(後の最適化のために6を格納します)

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

ゼロでない場合(つまりoではない場合)

{...}

6を引きます(プログラムは後で1を予期するため、6を格納します)

({}[({})])

ゼロでない(つまり、uではない)場合

{...}

残りを他のスタックに移動し、アクティブなスタックにゼロを設定して、すべてのifをエスケープします

({}<>)(<>)

すべてのifがエスケープされたら、ゼロと6を削除します

{}{}

すべての文字が処理されたら、最初に保存された高さからオフセットの高さを引きます。

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

Mod by 2

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

-cPerlの回答も1バイト/フラグしか追加しないため、+ 1バイトしかないと思います。
ThreeFx

1
@ThreeFxこれは、のperl -pe'code'長さが1バイトしかないためですperl -e'code'
デニス

8

C、42バイト

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

これは、x86-64 CPU上のGCC 4.xで機能します。結果はセットアップによって異なります。

repl.itでテストします

さらに5バイトのコストで、未定義の動作を回避できるため、intが少なくとも32ビット幅である限り、コードは機能するはずです。

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

使い方

モジュロ32は、全ての奇数文字の文字コードは、15915、及び212130466は、これらの位置にビットを設定し、他のすべての位置にビットを設定しない32ビット整数です。

ときfは文字列の最初の文字がNULLバイト(文字列の終端)であれば、それを最初にチェック、文字列で呼び出されます。そうであれば、0*s生成し、f0を返します。それ以外の場合は、文字の文字コードを生成し、論理AND()の正しい引数が実行されます。*s&&

の場合>>、GCCはシフト命令を生成します。x86-64 CPUでは、32ビット整数に対応する命令は、右引数の下位5ビットを除くすべてを無視します。これにより、*sモジュロ32の削減が回避されます。右シフトとそれに続く1のビット単位ANDは、文字に対応する2130466のビットを抽出します。これは、文字が奇数の場合にのみ1になります。

その後、ポインタsをインクリメントし(最初の文字を効果的に破棄します)、斬首された文字列に対してfを再帰的に呼び出し、上からの結果と再帰呼び出しの結果のビット単位のXORを取ります。


素晴らしい賢明な仕事!
キーガン

erees Ideoneで0を返します、正しいですか?
RosLuP

@RosLuPいいえ、それは正しくありません。それは私のコンピューターとrepl.itで動作します(おそらくGCCのバージョンがかなり異なるためです)。
デニス

ええ、間違いなくコンパイラーです。clang 3.7では、Ideoneでも動作します
デニス

7

sed 44(-nの場合は42 + 1)43

-1ニールのおかげ

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

o奇数の場合は印刷し、偶数の場合は印刷しない


s/[aeiou][^aeiou]*[aeiou]//gi私が正しく数えたなら、あなたにバイトを節約するかもしれません。
ニール

@ニール・イェップ!私はsedが欲張りでない検索を行えることを望みます。
ライリー

7

Python、41バイト

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

6

Python、42バイト

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

ここで説明することはあまりありません。0または1を返す名前のない関数。


6

Brain-Flak524、446、422バイト

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

オンラインでお試しください!

ゴルフされていない、より読みやすいバージョン:

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

Ungolfedバージョンは動作していないようです(コメントのTIOリンクに適合しません; _;)
ウィートウィザード

6
「読みやすく」「言っnough
ロハンJhunjhunwala

6

ゼリー13 12 11 バイト

@Luis Mendoのおかげで-1バイト(置換に使用%2
@Dennisのおかげで-1バイト(文字列圧縮を使用)

Œlf“¡ẎṢɱ»LḂ

すべてのテストケースはTryItOnlineにあります

どうやって?

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

非競合、5バイト(関数を追加したばかりなのでØc

fØcLḂ

テストケースも TryItOnlineの

上記と同じですØcが、ラテンアルファベットの母音を生成します。'AEIOUaeiou'


1
私はあなたが交換することができると思う%2
ルイスMendo

7
euoi古代のBacchicレベルの熱烈な歓喜の叫びですので、辞書を使用して母音を取得できます“¡ẎṢɱ»
デニス

@デニス-もちろん笑!
ジョナサンアラン

2
@Dennisどのように正確に機能しますか?巨大な辞書で単語のインデックスを取得するのは単なるベース圧縮ですか?「a」はどこから来たのですか?
DJMcMayhem

2
@DJMcMayhemこれは、短い単語(6文字未満)と長い単語を分離した辞書(デニスのコンピューターから取得したものだと思います)を使用したベース250の圧縮です。いくつかの圧縮された文字列を作成するプロセスを自動化するためのコードは、リンによって書かれました。未使用の6バイトは、Jellyの文字を識別する文字列です“”«»‘’2文字の文字列用ですが、圧縮文字列内で使用されます)。
ジョナサンアラン


4

Python 3、53バイト

これはおそらくさらにゴルフすることができます:

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

inとの間のスペースを削除'aeiou'forsum8バイトを節約するために使用しますlambda n:sum(x in'aeiou'for x in n.lower())&1(ただし、DJMcMayhemの投稿からわかるように、10個すべての母音を使用すると短くなります)
ジョナサンアラン

1
ヒントをありがとう!投稿した後、少し余分なスペースがあることに気付きましたが、正直なところ、@ DJMcMayhemと私は、Pythonソリューションで想像できる最高のバージョンであることと同じアプローチをしました。sum()このゴルフの前にはコマンドについて知らなかったので、もう一度何かを学びました!良い一日を:)
L.ステア

4

Java、73

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

他のいくつかのJavaの回答を見た、そうでなければ共有しなかっただろう。バイトを保存してくれたPhaezeに感謝します。


1
私はあなたがバイトを保存することができると思う%2>0
復活モニカ- JustinM

4

C 52バイト

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

メインと結果:

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

*/

...私はポインタとしてint型を使用しようとするが、inirection * ...ここに最初に印刷ソリューションの使用が間違っていたところ、それがコンパイルされない
RosLuP

h(o){return~-o?1^h(1+strpbrk(o,"aeiouAEIOU")):1;}3バイトを節約します。
デニス

S、H(O){S =〜-o 1 ^ H(1 + strpbrk(O、 "aeiouAEIOU")):1;}?結果はグローバル変数sにある...
RosLuP

残念ながら、それは許可されていません。関数は再利用可能でなければならず、これを複数回使用すると壊れます。また、場所をユーザー入力として受け取らない限り、出力を変数に保存することはできません。
デニス

この場合、sの開始値は重要ではないので、再利用は可能だと思います... OK OK OK、今度は何かがうまくいかないと思います...ありがとう
-RosLuP



3

VIM、32、31、29回のキーストローク

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

Vインタープリターは後方互換性があるため、オンラインで試すことができます!ここ。

m-chrzanのおかげで1つの 3バイトが節約されました!


1
s/.../gi代わりにできますs/\c.../gか?
m-chrzan

@ m-chrzan Woah、素晴らしいヒント。ありがとう!
DJMcMayhem

また、'<C-r>"'-> @"
m-chrzan

1
@"15分ほど前に知りました。私が持っている最高のvimのヒントは、使用すること:help foo/ドキュメント:Pです。
m-chrzan

2
まあ、私たちはゴルフについて話しているので、:h foo短いです。: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;}

ゴルフをしていない:

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

3

dimwit、14バイト(非競合)

ar[aeiou]}et}T

これは、新しい言語を始めるための楽しい、簡単な挑戦だと思いました。

説明

  • a -新しい配列をマトリックスにプッシュする
  • r[aeiou]} -最初の配列の正規表現「[aeiou]」に一致するすべての値の出現をカウントし(最初の配列に入力が含まれているため)、大文字と小文字を無視し、その値を最後の配列の最後にプッシュします。
  • e -最後の配列の最後の数が偶数(オカレンスの数に設定)の場合、閉じ括弧( "}")まで次の操作を実行します
  • t -実行を停止し、マトリックスをクリアし、最初の値をfalseに設定します
  • }- eコードブロックの終わり
  • T -実行を停止し、マトリックスをクリアし、最初の値をtrueに設定します

オンラインでお試しください!

入力フィールドを使用して単語を入力します。

すぐにドキュメントを追加します...


2

PowerShell v2 +、45 42バイト

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

入力を受け取り$args[0]、を通してそれを送信し-replace、すべての非母音の文字を削除し、結果としてとり.length、および%2それが奇数/偶数のかどうかをチェックします。

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バイト

2|+/@e.&'aeiouAEOIU'

簡単なアプローチ

説明

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

ハハ、私はこれより1バイト長いJ回答(現在削除済み)を投稿しました。良くやった!
コナーオブライエン

「入力を取得」のコマンドはどこにありますか?
RosLuP

@RosLuPこれは、単一の引数を入力としてとる動詞(関数)です。Jは暗黙のプログラミングを使用しているため、コマンドは一緒にチェーンされ、暗黙的に値を渡します
マイル

2

Japt、7バイト

1&Uè"%v

オンラインでテストしてください!奇数の場合は1、偶数の場合は0を出力します。

使い方

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

オクターブ、34バイト

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

これは、使用して伝統的なアプローチよりも6バイト短いismember@(s)mod(sum(ismember(s,'aeiouAEIOU')),2)および2つの正規表現のアプローチよりも短いバイト:@(s)mod(nnz(regexpi(s,'[aeiou]')),2)

ここでテストしてください


2

PHP、41バイト

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

これは、真の場合は-1、偽の場合は0を出力します。




2

C#64 62 56 50バイト

s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
  • すでにlinqを使用しているため、ContainsはIndexOfを2バイト節約します
  • Countのメソッドオーバーロードを使用すると、6バイト節約できます
  • きちんとした方法を提案し、さらに6バイトを節約してくれた@Milkに感謝します。

文字列を取り、奇数文字をカウントする匿名関数は、奇数文字が存在する場合はtrueを返し、そうでない場合はfalseを返します。

この新しいソリューションは、指定されたchar配列の任意の文字で文字列を分割します。この仕組みにより、%2結果の意味が反転します。0は現在奇数で、1は偶数1>です。

こちらからオンラインでお試しください!


string.Split()母音のカウントに使用するのはわずか50バイトであり、LINQは必要ありません。s=>1>s.Split("aeiouAEIOU".ToCharArray()).Length%2;
ミルク

@milkそのため、非常にきちんとしたソリューションをありがとう。
JustinM-モニカの復活



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.