強い言葉ですか?


33

彼らはそれhateが強い言葉だと言います。その理由を知りたかったので、この言葉をよく見てみました。

すべての子音の後に母音が付いていることに気付きました。それは私にとって非常に強く見えたので、私はそれが言葉を強くするものだと決めました。

もっと強い言葉を見つけたいので、そのためのプログラムが必要です!

強い言葉を見つける

強い単語とは、すべての子音(セット内の文字BCDFGHJKLMNPQRSTVWXZ)の後に母音(セット内の文字)が続く単語AEIOUYです。それでおしまい。他には何も関係ありません。

単語が母音で始まる場合、最初の子音の前の文字について心配する必要はありません。単語に子音がまったく含まれていない場合、自動的に強力な単語になります。

強い単語の例はagatehateおよびyouです。agate母音で始まりますが、すべての子音の後に母音が続くため、まだ強力な単語です。you子音がないため、強い言葉です。

強い単語の長さに制限はありません。

チャレンジ

入力として空でない文字列を受け取り、それが強い単語であれば真理値を出力し、そうでなければ偽値を出力するプログラムまたは関数を作成します。

明確化

  • 入力は小文字または大文字のどちらで入力するかを決定できます。回答でどれを指定してください。
  • 単語には、いかなる種類の句読点も含まれません。セットにはプレーンな文字のみが含まれABCDEFGHIJKLMNOPQRSTUVWXYZます。
  • 真実の値と偽の値の代わりに、2つの異なる一貫した値を選択して、trueとfalseを返します。これを行う場合は、回答で選択した値を指定します。
    • あるいは、強い単語に対しては偽の値を出力し、非強い単語に対しては真実の値を出力することができます。

テストケース

Input      -> Output
hate       -> true
love       -> true
popularize -> true
academy    -> true
you        -> true
mouse      -> true
acorn      -> false
nut        -> false
ah         -> false
strong     -> false
false      -> false
parakeet   -> false

得点

これは、バイト数が最小の答えが勝ちです!



1
空の単語""は入力可能ですか?
シルヴィオマヨロ

@SilvioMayoloそうではありません。
LyricLy

@LyricLy入力が「アカデミー」の場合、出力はfalseである必要があります。これは、問題を理解する方法です。「m」は子音だからです。
真実を求める

1
「バナナは」憎しみに満ちている
jstnthms

回答:


18

JavaScript(ES6)、36 28 27バイト

LarsWが示唆するように、結果を反転して1バイトを保存しました

小文字で入力します。false強い単語と強い単語trueではないものを返します。

s=>/[^aeiouy]{2}/.test(s+0)

どうやって?

0入力文字列の最後に(非母音)を追加し、2つの連続する非母音文字を探します。これにより、単語強くしない両方のケースをカバーできます。

  • 2つの連続した子音が含まれています
  • または子音で終わる

テストケース


なんで+0?それはそれなしで作業罰金に思える
マテウスAvellar

1
@MatheusAvellarがなければ、+0子音で終わる単語の誤検知を返します。
アーナルド

そうでないと、単語の最後の文字である場合、2つの連続する非母音が見つかりません。スマート!
マテウスAvellar

!(2つの異なる値)を省略することができるはずです
LarsW

@LarsWありがとう!私はこのルールに気づきませんでした。
アーナルド

10

Python 2、48バイト

lambda s:'se, F'in`[v in'aeiouy'for v in s+'b']`

(小文字の)文字列を取る名前のない関数、 sFalse強い場合またはTrueそうでない場合に戻ります。

オンラインでお試しください!(OPに一致するように結果を反転します)

どうやって?

非強い単語には、子音の後に子音が続くか、子音で終わるかのいずれかがあります。

コードは末尾に子音を追加します(s+'b')、必要なテストが2つの子音だけで連続するようにします。

変更された単語の各文字がリスト内包表記の母音であるかどうかを調べます [v in'aeiouy'for v in s+'b']

次に、2つのFalse結果を連続してチェックする必要があります(非強力な単語を通知`...`)。このリストの文字列表現を(を使用して)取得し、の存在を探し'se, F'ます。これは、次の'False, False'いずれにもない最短の文字列'True, True'です。'False, True'; または'True, False'

例として、'nut'リスト内包表記はv、リスト'nutb''aeiouy'生成する際に存在する各文字を評価します。[False, True, False, False]このリストの文字列表現'[False, True, False, False]''e, F'ここに含まれます。'[False, True, Fals>>e, F<<alse]'したがって、関数はTruenutが強力な単語ではないことを意味します。


7

ゼリー 10  9 バイト

e€ØY;Ạ11ẇ

文字のリストを取得して返すモナドリンク:

  • 0 強いなら
  • 1 そうでない場合

オンラインでお試しください!またはテストスイートを参照してください。

どうやって?

e€ØY;Ạ11ẇ - Link: list of characters, s      e.g. "hate"  or  "you"  or  "not"
  ØY      - consonant yield                   "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
e€        - exists in? for €ach letter            [1,0,1,0]   [0,0,0]    [1,0,1]
     Ạ    - all truthy? (1 for any valid input)   1           1          1
    ;     - concatenate                           [1,0,1,0,1] [0,0,0,1]  [1,0,1,1]
      11  - literal eleven
        ẇ - sublist exists?                       0           0          1
          -  N.B.: left of ẇ implicitly makes digits so it looks for the sublist [1,1]

注:使用する理由は、使用中のバイトを節約するためです(すぐ1に使用したい11ので)。


うーん、一貫した値...
エリックアウトゴルファー

どういう意味ですか?
ジョナサンアラン

あなたのコードのハックなもの...そうでなければあなたがやったことe€ØY;1w11か何か
エリックOutgolfer

なぜ11?文字列の単語は、数字の11とはまったく関係ありませんでした
hyiltiz

@hyiltizは、ダイアドに左引数が数値である場合、暗黙的に10進数のリストに変換されるため、11は[1,1]ます。
ジョナサンアラン

5

05AB1E、8つのバイト

コード

žPS¡¦õÊP

05AB1Eエンコードを使用します。オンラインでお試しください!

説明

žPS¡         # Split the string on consonants (bcdfghjklmnpqrstvwxz)
    ¦        # Remove the first element of the array to handle cases when the
               string starts with a consonant
     õÊP     # Check if the empty string is not in the array

             # "popularize"
žPS¡         # ['', 'o', 'u', 'a', 'i', 'e']
    ¦        # ['o', 'u', 'a', 'i', 'e']
     õÊ      # [1, 1, 1, 1, 1]
       P     # 1

たぶん私は何かを見逃していますが、これは常に1を返すようです?私が試した真実のケースと偽のテストケースの両方に対して1を返します。
スンダ

(ああ、私はちょうどこの回答(質問)は何歳に気づいた私は、言語の中で何かがその間に変更されていると思います。?)
サンダー-復活モニカ

@sundarはい、いいキャッチ!ある時点でsplit関数を壊したようです。できるだけ早くこれを修正します。
アドナン

5

R、43バイト

function(s)grep("[^aeiouy]{2}",paste(s,""))

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

ArnauldのJavaScript回答の移植版。弱い単語とinteger(0)強い単語に対して1を返します。を追加します文字列の末尾に(スペース)をします。

これは実際にはベクトル化されています。文字列のベクトルでは、弱い単語のインデックス(1ベース)を返します。


ここで同じコメント、スペースを追加する代わりに正規表現で$を使用できませんか?
チャーリー

@チャーリー、私はあなたがどのように使用するつもりなのかわかりませんが$、それをさらに説明することに注意してください?
ジュゼッペ

このソリューションがとても好きです。私は、ロジックがより明確(およびバイトが同じ)であると思いますpaste0(s,0)が、それはただの混乱です。:私は@Charlieはこのようなもの参照していると思う grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL、20バイト

⎕←∧/2∨/0,⍨⍞∊'aeiouy'

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


3
あなたが必要とは思わない⎕←
ザカリー

@Zacharý私はそれを置かなかったが、後にプログラムはREPLで実行されると仮定すべきではないとデニスによって信じられた。
オベロン

彼は何語でそれについて話したのですか?Dyalog APL向けですか?ポリシーはPython / JavaScript /などに確実に適用されることを知っています。
ザカリー


2

Java(OpenJDK 8)93 81バイト

s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}

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


ブール値は答えではないのではないかと心配していますs->{int w=0,p=w,l;for(char c:s){l="aeiouy".indexOf(c)>>31;w|=p&l;p=l;}return w+p>=0;}
ヤコブ

1
それともあなたもこれを行うことができます:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
ヤコブ

いい答えですが、この課題では、単純な正規表現マッチングは実際にはかなり短くなります。それでも、私から+1。
ケビンCruijssen

1
@KevinCruijssen私の正規表現はひどい、それを動作させることができませんでした:D。オリジナルになりたかったふりをする
ロベルトグラハム

@RobertoGraham「私はオリジナルになりたかったふりをする」まあ、それは確かです。:)また、以前は正規表現もかなり苦手でしたが、正規表現を使用したPPCGに関する他のいくつかの回答を読んだ後、私はそれに慣れてきました。そして、私の[a-z&&[^aeiouy]] 前の答えで子音を一致させる方法をすでに考えていました。;)
ケビンクルーイッセン

2

、12バイト

ΛΣX_2m€¨γaıu

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

-4のサポートをしてくれたH.PWizに感謝します。一貫性はないが適切に真実または偽の値を返します。-1のLeoの
おかげで、一貫した真実/偽の値を返すようになりました。


短い圧縮文字列。文字列の圧縮はまだ遅すぎるので、もう少し作業する必要があります
レオ

@Leo残念ながら、これはNPの問題だと思います。
エリックアウトゴルファー

2

Pyth、18バイト

:+Q1."2}M>åYà

すべてのテストケースを確認します。

JS回答から正規表現を「借用」しました。これはFalse強い単語に対して返されます。Trueそれ以外の場合は


@KevinCruijssen実際、PythはISO-8859-1を使用しています。それが私が確信していない理由です。
ミスターXcoder

1
@KevinCruijssen Downgoatのユーザースクリプトは、13バイトであることを教えてくれます13 ISO-8859-1 bytes, 13 chars。私はそれは問題ないはずだと思う
氏Xcoder

@KevinCruijssen今すぐ修正する必要があります。
ミスターXcoder

@KevinCruijssen違いは見当たりません。私の答えにはどのようなコードが表示され、テストリンクにはどのようなコードが表示されますか?
ミスターXcoder


2

Brachylog18 11 10バイト

,Ḷs₂{¬∈Ẉ}ᵐ

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

きちんとしたシンプルな(「parakeet」のような最終的な子音のケースを処理するための余分な2バイトを除いて)

強い言葉は偽りであり、強い言葉は真実ではない。

,Ḷ               % append a newline (non-vowel) at the end of input, 
                 %   to catch final consonants
     s₂          % the result has some substring of length 2
       {¬∈Ẉ}ᵐ    % where neither of its elements belong to  
                 %   the set of alternate vowels (with "y")

1

Python 2、58バイト

それを実現することにより、-30バイトはArnauldのJS回答と同じくらい簡単になります

lambda s:re.search('[^aeiouy]([^aeiouy]|$)',s)<1
import re

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



ラムダを何かに割り当てる必要はありませんか?すなわちf=lambda s...
OldBunny2800

@ OldBunny2800は、コード内で参照を使用している場合を除きません(ヘッダーまたはフッターコードで再利用するためにアクセスできる名前のない関数を作成してもかまいません-ここf=\ではヘッダーで)。
ジョナサンアラン

パターン文字列'[^aeiouy]([^aeiouy]|$)'(24バイト)を"[^aeiouy]("*2+")|$)"(21バイト)に置き換えて、空のグループとして3バイトを節約できる可能性があると思いますが()、検索動作(TIO)は変わりません。
ジョナサンフレッチ

それは得ることができます@JonathanFrech さらに良い
氏Xcoder

1

Perl 5、31バイト(30 + 1)

$_=''if/[^aeiouy](?![aeiouy])/

-pコマンドラインフラグ用に+1バイト。強い単語の場合は単語を出力し、そうでない場合は空の文字列を出力します。


「2つの異なる一貫した値」
-L3viathan

@ L3viathan空の文字列は偽であり、空でない文字列は真実です。これは有効です。
LyricLy

@ L3viathan Perlの真実性ルールは、実際にこのような課題に非常に役立ちます。その正確な事実を悪用したのは初めてではありません。
シルヴィオマヨロ

改行で終わる単語の場合、これはに短縮できます$_=$/if/[^aeiouy]{2}/
nwellnhof

1

ゼリー、11バイト

e€ØY;1a2\¬Ȧ

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

e€ØY;1a2\¬Ȧ  Main link
 €           For each letter
e            Is it an element of
  ØY         The consonants (excluding Yy)?
    ;1       Append 1 (true) (consonant) to make sure last letter isn't consonant
       2\    For all (overlapping) slices of length 2 (the <link><nilad>\ functionality)
      a      Logical AND of the two values; is it a consonant pair?
         ¬   Logical NOT vectorizing; for each (overlapping) pair, is it not a consonant pair?
          Ȧ  Any and all; make sure all pairs are not consonant pairs

はい、私はジョナサン・アランにたくさんbeatられましたが、とにかく私のアプローチを共有したかったです:P

-4ジョナサン・アランの答えを少し(代わりに、最後の文字のエッジケースをチェックするために子音を追加すると、わずか1を追加)盗んでバイト
-1バイトをマイルに感謝


あなたはどちらか使用してバイトを保存することができa2\たりȦ2Ƥするのではなくṡ2Ȧ€
マイル

@JonathanAllan facepalm私は意図的に子音としてカウントされるØCようYyにするために使用することを意図しました。ありがとう!
ハイパーニュートリノ

1

Awk、39バイト

/([^aeiouy]{2}|[^aeiouy]$)/{print "n"}

プリントnstrongwordための非strongword、何も(あるいは、単に改行)について

パックを追跡し、小文字入力で2つの連続する非母音を検索する

検査

$ awk -f strongwork.awk
hate
love
popularize
academy
you
mouse
acorn
n
nut
n
ah
n
strong
n
false
n
parakeet
n

1

Kotlin、49バイト

{Regex(".*[^aeiouy]([^aeiouy].*|$)").matches(it)}

真と偽が入れ替わる

美化

{
    Regex(".*[^aeiouy]([^aeiouy].*|$)").matches(it)
}

テスト

var s:(String)->Boolean =
{Regex(".*[^aeiouy]([^aeiouy].*|$)").matches(it)}
data class TestData(val input: String, val output: Boolean)

fun main(args: Array<String>) {
    val items = listOf(
            TestData("hate", true),
            TestData("love", true),
            TestData("popularize", true),
            TestData("academy", true),
            TestData("you", true),
            TestData("mouse", true),
            TestData("acorn", false),
            TestData("nut", false),
            TestData("ah", false),
            TestData("strong", false),
            TestData("false", false),
            TestData("parakeet", false)
    )

    items
            .filter { s(it.input) == it.output }
            .forEach { throw AssertionError(it.toString()) }

    println("Test Passed")
}

TryItOnline

@Arnauldの 回答に基づく



1

Java 8、53 42バイト

s->s.matches(".*[^aeiouy]([^aeiouy].*|$)")

代わりに@jrtapsellのKotlin回答と同じ正規表現を使用して-11バイト。

ここで試してみてください。false強い場合; trueそうでない場合)

説明:

s->               // Method with String parameter and boolean return-type
  s.matches(      //  Checks if the String matches the following regex:
    ".*           //   One or more characters
     [^aeiouy]    //   Followed by a consonant
     ([^aeiouy].* //   Followed by another consonant (+ any more characters)
      |$)")       //   Or the end of the String
                  // End of method (implicit / single-line return statement)

したがって、基本的には、2つの隣接する子音が見つかるかどうか、または文字列が子音で終わるかどうかをチェックします。


古い回答(53バイト):

s->s.matches("[aeiouy]*([a-z&&[^aeiouy]][aeiouy]+)*")

ここで試してみてください。true強い場合;falseそうでない場合)

正規表現を使用して、入力文字列が「強い」正規表現と一致するかどうかを確認します。ご了承くださいString#matchesJavaでは自動的に追加さに^...$、文字列が指定された正規表現に完全に一致するかどうかをにチェックしてするてください。

説明":

 s->                   // Method with String parameter and boolean return-type
  s.matches(           //  Checks if the String matches the following regex:
    "[aeiouy]*         //   0 or more vowels
    ([a-z&&[^aeiouy]]  //     { A consonant,
     [aeiouy]+)        //       plus one or more vowels }
    *")                //    Repeated 0 or more times
                       // End of method (implicit / single-line return statement)

マッチではなく検索(他の多くの回答が使用するように)は、実際にはJavaでより長くなります:
70バイト

s->java.util.regex.Pattern.compile("[^aeiouy]{2}").matcher(s+0).find()

ここで試してみてください。false強い場合; trueそうでない場合)






0

Lua, 41 bytes

return#(io.read()..0):match"[^aeiouy]+"<2

Reads from standard input

Lua (loadstring'ed), 37 bytes

return#((...)..0):match"[^aeiouy]+"<2

Reads from function parameter(s)


Input is lowercase

Sees if there is a string of length 2 or more, consisting only of not vowels (consonants) or if the string ends with a non-vowel

Returns true/false


0

C++, 195 194 bytes

-1 bytes thanks to Zacharý

Uppercase, return true if input is a strong word, false otherwise ( C++ have simple int to bool implicit cast rules, 0 => false, true otherwise )

#include<string>
#define C(p)(v.find(e[p])==size_t(-1))
std::string v="AEIOUY";int s(std::string e){for(int i=0;i<e.size()-1;++i)if(e[i]>64&&e[i]<91&&C(i)&&C(i+1))return 0;return!C(e.size()-1);}

Code to test :

auto t = {
    "HATE",
    "LOVE",
    "POPULARIZE",
    "ACADEMY",
    "YOU",
    "MOUSE",
    "ACORN",
    "NUT",
    "AH",
    "STRONG",
    "FALSE",
    "PARAKEET"
};

for (auto&a : t) {
    std::cout << (s(a) ? "true" : "false") << '\n';
}

1
You can remove the space between return and !.
Zacharý

0

C, 107 Bytes

i,v,w,r,t;a(char*s){w=0;for(r=1;*s;s++){v=1;for(i=6;v&&i;)v=*s^" aeiouy"[i--];r=w&&v?0:r;w=v;}return r&~v;}

Returns 1 for strong word and 0 for weak word. Tested with the words given in the main post.



0

PHP, 69 bytes

preg_match("/([^AEIOUY][^AEIOUY]+|[^AEIOUY]$)/",$_SERVER['argv'][1]);

Returns 1 is the word is not strong.


Welcome to PPCG! I believe you can remove spaces to cut some bytes, specifically /", str -> /",str and [1]))) return -> [1])))return but I don't know PHP too well so I can't be sure.
Stephen

Yes, good idea! Also it is possible to reduce bytes by assuming that input is always in uppercase.
Matias Villanueva

Oh, and if the regex is a standard regex engine, can't you do [B-Z]?
Stephen

@Stephen [B-Z] includes vowels. [^AEIOUY] works, though.
LyricLy

I don't know PHP either, but you could probably save more bytes by returning the result from the regex match directly, instead of wrapping it in an if statement.
LyricLy

0

CJam, 57 bytes

q{"aeiouy"#W=}%_,:B{_A={_A_)\B(<{=!X&:X;}{0:X;;;}?}&}fA;X

Try it online!


Reads input, converts to 1s for consonants, 0s for vowels. For every consonant, AND predefined variable X (predefined to 1) with next character's value. Output X

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