강한 단어입니까?


33

그들은 그것이 hate강한 단어 라고 말합니다 . 나는 그 이유를 알고 싶었고, 그 단어를 잘 보았습니다.

나는 모든 자음이 그 뒤에 모음을 가지고 있음을 알아 차렸다. 그것은 나에게 아주 강해 보였으므로, 그것이 단어를 강하게 만드는 것이라고 결정했습니다.

더 강력한 단어를 찾고 싶습니다. 그래서 그것을위한 프로그램이 필요합니다!

강력한 단어 찾기

강한 단어는 모든 자음 (세트의 문자 BCDFGHJKLMNPQRSTVWXZ) 다음에 모음 (세트의 문자)이 오는 단어 AEIOUY입니다. 그게 다야. 다른 것은 중요하지 않습니다.

단어가 모음으로 시작하면 첫 번째 자음 이전의 문자에 대해 걱정할 필요가 없습니다. 단어에 자음이 없으면 자동으로 강한 단어입니다!

강한 단어의 예는 agate, hateyou입니다. agate모음으로 시작하지만 모든 자음에는 여전히 모음이 있기 때문에 여전히 강력한 단어입니다. you자음이 없으므로 강력한 단어입니다.

강한 단어의 길이에는 제한이 없습니다.

도전

비어 있지 않은 문자열을 입력으로 사용하고 강한 단어이면 틀린 값을, 그렇지 않으면 틀린 값을 출력하는 프로그램 또는 함수를 작성하십시오.

설명

  • 소문자 또는 대문자로 입력을 결정할 수 있습니다. 답에서 어느 것을 지정하십시오.
  • 단어에는 어떤 종류의 구두점도 포함되지 않습니다. 세트에는 일반 문자 만 포함됩니다 ABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • 진실하고 거짓된 값 대신에, 참과 거짓을 반환하기 위해 두 개의 구별되고 일관된 값을 선택할 수 있습니다. 이렇게하면 답에서 선택한 값을 지정하십시오.
    • 또는 강한 단어에는 틀린 값을, 비강 한 단어에는 틀린 값을 출력 할 수 있습니다.

테스트 사례

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
빈 단어 ""가 가능한 입력입니까?
Silvio Mayolo

@SilvioMayolo 아닙니다.
LyricLy

@LyricLy 입력이 "아카데미"이면 출력이 거짓이어야합니다. 문제를 이해하는 방식입니다. 'm'은 자음이기 때문입니다.
진실을 찾는

1
는 "바나나"증오로 가득하다
jstnthms

답변:


18

자바 스크립트 (ES6), 36 28 27 바이트

LarsW에서 제안한대로 결과를 반전하여 1 바이트를 절약했습니다.

소문자로 입력합니다. false강한 단어와 비강 한 단어를 반환 합니다 true.

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

방법?

0입력 문자열의 끝에 (모음이 아닌)을 추가하고 모음이 아닌 연속 된 두 문자를 찾습니다. 이것은 우리가 단어 강하게 만들지 않는 두 경우를 모두 커버 할 수있게합니다 .

  • 두 개의 연속 자음이 포함되어 있습니다.
  • 또는 자음으로 끝납니다

테스트 사례


왜 그렇 +0습니까? 그것 없이는 잘 작동하는 것 같습니다
Matheus Avellar

1
@MatheusAvellar가 없으면 +0자음으로 끝나는 단어에 대해 오 탐지를 반환합니다.
Arnauld

그것이 없으면 단어의 마지막 글자라면 모음이 아닌 2 개의 연속 모음을 찾을 수 없습니다. 똑똑한!
Matheus Avellar

당신은 !(두 개의 별개의 값) 을 생략 할 수 있어야합니다
LarsW

@LarsW 감사합니다! 나는이 규칙을 눈치 채지 못했다.
Arnauld

10

파이썬 2 , 48 바이트

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

명명되지 않은 함수는 (소문자) 문자열을 취하고 강력하거나 그렇지 않은 경우 s반환 False합니다 True.

온라인으로 사용해보십시오! (OP와 일치하도록 결과를 반전시킵니다)

방법?

강하지 않은 단어는 자음 뒤에 자음이 있거나 자음으로 끝납니다.

코드는 끝에 자음을 추가하여 ( s+'b') 행에 두 자음에 대한 필수 테스트가되도록합니다.

변경된 단어의 각 문자가 목록 이해력이있는 모음인지 확인합니다 [v in'aeiouy'for v in s+'b'].

이제 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]'따라서 함수가 반환 True하는 너트 의미가 없는 강력한 단어.


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


흠, 일관된 가치 ...
아웃 골퍼 Erik

무슨 소리 야?
Jonathan Allan

해키 코드에서 일이 ... 그렇지 않으면 당신이 한 수 e€ØY;1w11또는 무언가
에릭 Outgolfer

왜 11입니까? 문자열 단어는 어떤 식 으로든 11에 연결되지 않은 것 같습니다
hyiltiz

@hyiltiz dyad 에 왼쪽 인수가있는 숫자는 암시 적으로 십진 자릿수 목록으로 변환되므로 11이됩니다 [1,1].
Jonathan Allan

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-복원 모니카

(아, 나는 방금이 답 (과 질문)이 몇 살인지 알아 차렸다. 그 동안에 언어의 어떤 것이 바뀌었을 까?)
sundar-Reinstate Monica

@sundar 네 좋은 캐치! 어느 시점에서 스플릿 기능이 끊어진 것 같습니다. 최대한 빨리 수정하겠습니다.
Adnan

5

R , 43 바이트

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

온라인으로 사용해보십시오!

Arnauld의 JavaScript 답변 포트; 약한 단어와 integer(0)강한 단어에 대해서는 1을 반환 합니다. 문자열 끝에 (공백)을 추가 합니다.

이것은 실제로 벡터화됩니다. 문자열로 구성된 벡터를 사용하면 약한 단어의 인덱스 (1부터 시작)를 반환합니다.


여기에 동일한 의견이 있습니다. 공백을 추가하는 대신 정규 표현식에서 $를 사용할 수 없습니까?
찰리

@Charlie 나는 당신이 어떻게 사용하려고하는지 잘 모르겠습니다 $.
주세페

이 솔루션처럼 많이. 나는 논리가 더 명확하고 바이트가 동일하다고 생각 paste0(s,0)하지만 그저 엉망입니다. @Charlie가 다음과 같은 것을 참조하고 있다고 생각합니다. grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL, 20 바이트

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

온라인으로 사용해보십시오!


3
나는 당신이 필요하다고 생각하지 않습니다 ⎕←.
Zacharý

@ Zacharý 나는 그것을 넣지 않았지만 나중에 프로그램이 REPL에서 실행되어서는 안된다고 들었습니다 (Dennis가 생각합니다).
Oberon

그는 어떤 언어에 대해 말했습니까? Dyalog APL을위한 것이 었습니까? 정책이 Python / JavaScript 등에 확실히 적용된다는 것을 알고 있습니다.
Zacharý


2

자바 (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;}.
Jakob

1
또는 이렇게 할 수도 있습니다 :s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

좋은 대답이지만이 도전 으로 간단한 정규 표현식 일치 는 실제로 약간 짧습니다. 여전히 나에게서 +1.
Kevin Cruijssen

1
@KevinCruijssen 내 정규 표현식이 끔찍해서 작동하지 못했습니다 .D. 나는 내가 독창적
Roberto Graham

@RobertoGraham " 나는 내가 원래되고 싶어하는 척합니다 "글쎄, 그것은 확실합니다. :) 그리고 정규식에서도 꽤 나빴지 만 정규식을 사용하여 PPCG에 대한 몇 가지 다른 대답을 한 후에 더 익숙해졌습니다. 그리고 나는 이미 [a-z&&[^aeiouy]] 나의 이전 답변에서 자음을 맞추는 방법을 알아 냈습니다 . ;)
Kevin Cruijssen

2

껍질 , 12 바이트

ΛΣX_2m€¨γaıu

온라인으로 사용해보십시오!

-4에 대한 도움 을 주신 H.PWiz 에게 감사드립니다 . 일치하지 않지만 적절하게 진실되거나 허위 인 값을 반환합니다. Leo 의 -1
덕분에 이제 일관성있는 진실 / 거짓 값을 반환합니다.


압축 문자열이 짧습니다 . 문자열 압축은 여전히 ​​너무 느립니다. 좀 더 작업해야합니다
Leo

@Leo 불행히도 이것이 NP 문제라고 생각합니다.
아웃 골퍼 에릭

2

Pyth , 18 바이트

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

모든 테스트 사례를 확인하십시오.

JS 답변 에서 정규식을 "차용"했습니다 . 이것은 반환 False강한 단어를 True, 그렇지 않으면


@KevinCruijssen 사실 Pyth는 ISO-8859-1을 사용합니다. 그렇기 때문에 확신이 없습니다.
Mr. Xcoder

1
@KevinCruijssen Downgoat의 사용자 스크립트에 따르면 13 바이트 13 ISO-8859-1 bytes, 13 chars입니다. 나는 잘해야한다고 생각
씨 Xcoder

@KevinCruijssen 지금 수정해야합니다.
Mr. Xcoder

@KevinCruijssen 나는 아무런 차이가 보이지 않습니다. 내 답변에 코드가 무엇이고 테스트 링크에 ​​어떤 코드가 있습니까?
Mr. Xcoder


2

Brachylog , 18 11 10 바이트

,Ḷs₂{¬∈Ẉ}ᵐ

온라인으로 사용해보십시오!

단정하고 간단합니다 ( "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

파이썬 2 , 58 바이트

-30 바이트는 Arnauld의 JS answer 만큼 간단 할 수 있음을 인식합니다 .

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

온라인으로 사용해보십시오!



람다를 무언가에 할당 할 필요가 없습니까? 즉f=lambda s...
OldBunny2800

@ OldBunny2800은 코드 내에서 참조를 사용하지 않는 한 아닙니다 (명명되지 않은 함수를 만드는 것은 허용됩니다. 여기서는 헤더 또는 바닥 글 코드와 함께 재사용 할 수 있습니다-여기 f=\에 헤더 포함).
Jonathan Allan

비어있는 그룹 이 검색 동작 ( TIO )을 변경하지 않기 때문에 패턴 문자열 '[^aeiouy]([^aeiouy]|$)'(24 바이트)을 "[^aeiouy]("*2+")|$)"(21 바이트)로 ()바꾸어 3 바이트를 저장할 수 있다고 생각합니다 .
Jonathan Frech


1

Perl 5, 31 바이트 (30 + 1)

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

-p명령 행 플래그의 경우 +1 바이트 강한 단어이면 단어를 인쇄하고 그렇지 않은 경우 빈 문자열을 인쇄합니다.


"2 개의 명확하고 일관된 값"
L3via

@ L3viathan 빈 문자열은 거짓이며 비어 있지 않은 문자열은 사실입니다. 유효합니다.
LyricLy

@ L3viathan Perl의 진실성 규칙은 실제로 이와 같은 도전에 매우 도움이됩니다. 내가 정확한 사실을 악용 한 것은 이번이 처음이 아닙니다.
Silvio Mayolo

줄 바꿈으로 끝나는 단어를 사용하면을 단축 할 수 있습니다 $_=$/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

예, Jonathan Allan이 많이 맞았지만 어쨌든 내 접근 방식을 공유하고 싶었습니다.

-4 (단지 APPEND 1, 마지막 글자 가장자리의 경우를 확인하기 위해 대신 자음을 추가) 조나단 앨런의 대답은 조금 훔쳐서 바이트
-1 마일 바이트 덕분에


a2\Ȧ2Ƥṡ2Ȧ€
마일을

@JonathanAllan facepalm 어쨌든 나는 거꾸로 기억했기 때문에 자음으로 간주 ØC되도록하기 위해 의도적으로 사용 했습니다 Yy. 감사!
HyperNeutrino

1

awk, 39 바이트

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

인쇄물 n비강 어 단어로 , 강한 단어에 대해서는 아무것도 입력하지 않습니다 (또는 개행)

팩을 따르고 소문자 입력에서 두 개의 연속 비 모음 검색

테스트

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

1

코 틀린 , 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

자바 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)

따라서 기본적으로 인접한 두 자음을 찾을 수 있는지 또는 문자열이 자음으로 끝나는 지 확인합니다.


이전 답변 ( 53 바이트 ) :

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

여기에서 시도하십시오. ( true강한 경우, false그렇지 않은 경우)

regex를 사용하여 input-String이 'strong'-regex와 일치하는지 확인하십시오. 참고 String#matches자바에 자동으로 추가 ^...$문자열이 완전히 주어진 정규식과 일치하는지 확인합니다.

설명":

 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

SOGL V0.12 , 19 18 바이트

æ"[^ŗy]”ŗ(ŗ|$)”øβ=

여기 사용해보십시오!

설명:

æ                   push "aeiou"
 "[^ŗy]”            push "[^ŗy]" with ŗ replaced with pop
        ŗ(ŗ|$)”     push `ŗ(ŗ|$)` with ŗ replaced with pop
               øβ   replace in the input that regex with nothing
                 =  check for equality with the original input



0

루아, 41 바이트

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

표준 입력에서 읽습니다

Lua (로드 스트링), 37 바이트

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

함수 매개 변수에서 읽습니다.


입력은 소문자입니다

모음 (자음)만으로 구성되거나 길이가 모음이 아닌 것으로 끝나는 길이 2 이상의 문자열이 있는지 확인합니다.

참 / 거짓을 반환


0

C ++, 195 194 바이트

Zacharý 덕분에 -1 바이트

대문자, 입력이 강한 단어이면 true를 반환하고, 그렇지 않으면 false를 반환합니다 (C ++에는 암시 적 캐스트 규칙을 무효화하는 간단한 int가 있습니다. 0 => false, 그렇지 않으면 true)

#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);}

테스트 코드 :

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
return와 사이의 공백을 제거 할 수 있습니다 !.
Zacharý

0

C, 107 바이트

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;}

강한 단어는 1을 , 약한 단어는 0을 반환 합니다. 주요 게시물에 주어진 단어로 테스트되었습니다.



0

PHP, 69 바이트

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

단어가 강하지 않으면 1을 반환합니다 .


PPCG에 오신 것을 환영합니다! 나는 당신이 공백을 제거하여 일부 바이트, 특히 /", str-> /",str[1]))) return-> 를자를 수 있다고 생각 [1])))return하지만 PHP를 너무 잘 모르므로 확신 할 수 없습니다.
Stephen

예, 좋은 생각입니다! 또한 입력이 항상 대문자라고 가정하여 바이트를 줄일 수 있습니다.
Matias Villanueva

아, 그리고 정규식이 표준 정규식 엔진이라면 할 수 [B-Z]없습니까?
Stephen

@Stephen [B-Z]에는 모음이 포함되어 있습니다. [^AEIOUY]그래도 작동합니다.
LyricLy

PHP도 모르지만 정규식 일치 결과를 if명령문 으로 감싸지 않고 직접 반환하여 더 많은 바이트를 절약 할 수 있습니다 .
LyricLy

0

CJam , 57 바이트

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

온라인으로 사용해보십시오!


입력을 읽고 자음의 경우 1로, 모음의 경우 0으로 변환합니다. 모든 자음 및 다음 문자 값으로 사전 정의 된 변수 X (1로 사전 정의 됨)에 대해 출력 X

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.