Apakah ini kata yang kuat?


33

Mereka mengatakan itu hateadalah kata yang kuat. Saya ingin mencari tahu mengapa, jadi saya melihat kata itu.

Saya perhatikan bahwa setiap konsonan memiliki vokal setelahnya. Itu membuatnya terlihat cukup kuat bagi saya, jadi saya memutuskan bahwa itulah yang membuat kata kuat.

Saya ingin menemukan kata-kata yang lebih kuat, jadi saya perlu program untuk itu!

Menemukan kata-kata yang kuat

Kata-kata yang kuat adalah kata-kata di mana setiap konsonan (huruf dalam himpunan BCDFGHJKLMNPQRSTVWXZ) diikuti oleh vokal (huruf dalam himpunan AEIOUY). Itu dia. Tidak ada hal lain yang penting.

Jika kata dimulai dengan vokal, Anda tidak perlu khawatir tentang huruf apa pun sebelum konsonan pertama. Jika kata itu tidak memiliki konsonan sama sekali, itu secara otomatis adalah kata yang kuat!

Beberapa contoh kata-kata yang kuat adalah agate, hatedan you. agatemasih merupakan kata yang kuat karena meskipun dimulai dengan vokal, setiap konsonan masih diikuti oleh vokal. youadalah kata yang kuat karena tidak memiliki konsonan.

Tidak ada batasan panjang untuk kata-kata yang kuat.

Tantangan

Tulis sebuah program atau fungsi yang mengambil string yang tidak kosong sebagai input, dan mengeluarkan nilai kebenaran jika itu adalah kata yang kuat atau nilai yang salah jika tidak.

Klarifikasi

  • Anda dapat memutuskan untuk mengambil input dalam huruf kecil atau besar. Tentukan yang mana dalam jawaban Anda.
  • Kata-kata tidak akan mengandung tanda baca apa pun. Mereka hanya akan berisi huruf biasa di set ABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Alih-alih nilai yang benar dan salah, Anda dapat memilih dua nilai yang berbeda dan konsisten untuk mengembalikan nilai benar dan salah. Jika Anda melakukan ini, tentukan nilai yang Anda pilih dalam jawaban Anda.
    • Atau Anda dapat menampilkan nilai palsu untuk kata yang kuat dan yang benar untuk kata yang tidak kuat.

Uji kasus

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

Mencetak gol

Karena ini adalah , jawabannya dengan byte paling sedikit menang!



1
Apakah kata kosong ""kemungkinan input?
Silvio Mayolo

@ SilvioMayolo Tidak.
LyricLy

@ LyricLy Jika input "akademi" maka output harus salah, cara saya memahami masalah. Karena 'm' adalah konsonan.
Truth-seek

1
a "pisang" penuh dengan kebencian
jstnthms

Jawaban:


18

JavaScript (ES6), 36 28 27 byte

Disimpan 1 byte dengan membalikkan hasilnya, seperti yang disarankan oleh LarsW

Mengambil input dalam huruf kecil. Kembali falseuntuk kata yang kuat dan trueuntuk kata yang tidak kuat.

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

Bagaimana?

Kami menambahkan 0(non-vokal) di akhir string input dan mencari dua karakter non-vokal berturut-turut. Ini memungkinkan kami untuk membahas kedua kasus yang membuat kata tidak kuat:

  • ini berisi dua konsonan berturut-turut
  • atau diakhiri dengan konsonan

Uji kasus


Tapi mengapa +0? Tampaknya berfungsi dengan baik tanpanya
Matheus Avellar

1
@MatheusAvellar Tanpa +0itu, itu akan mengembalikan positif palsu pada kata-kata yang diakhiri dengan konsonan.
Arnauld

Begitu ya, tanpa itu tidak dapat menemukan 2 non-vokal berturut-turut jika itu adalah huruf terakhir dari kata tersebut. Pintar!
Matheus Avellar

Anda harus dapat menghilangkan !(dua nilai berbeda)
LarsW

@ LarsW Terima kasih! Saya tidak memperhatikan aturan ini.
Arnauld

10

Python 2 , 48 byte

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

Fungsi tanpa nama mengambil string (huruf kecil) s,, dan kembali Falsejika kuat atau Truejika tidak.

Cobalah online! (membalikkan hasil agar sesuai dengan OP)

Bagaimana?

Kata-kata yang tidak kuat memiliki konsonan diikuti oleh konsonan atau diakhiri dengan konsonan.

Kode menambahkan konsonan ke akhir ( s+'b') untuk membuat tes yang diperlukan hanya untuk dua konsonan berturut-turut.

Itu mengetahui apakah setiap huruf dalam kata yang diubah adalah vokal dengan pemahaman daftar [v in'aeiouy'for v in s+'b'].

Sekarang perlu memeriksa dua Falsehasil berturut-turut (menandakan kata yang tidak kuat), ia melakukannya dengan mendapatkan representasi string (menggunakan `...`) daftar ini dan mencari keberadaan 'se, F'. Ini adalah string terpendek yang ditemukan 'False, False'tetapi tidak ada 'True, True':; 'False, True'; atau 'True, False'.

Sebagai contoh perhatikan 'nut', pemahaman daftar mengevaluasi setiap huruf, vdari 'nutb'keberadaan dalam 'aeiouy'menghasilkan daftar [False, True, False, False], representasi string dari daftar ini adalah '[False, True, False, False]'yang berisi di 'e, F'sini: '[False, True, Fals>>e, F<<alse]'maka fungsi mengembalikan Truemakna bahwa kacang bukan kata yang kuat.


7

Jelly ,  10  9 byte

e€ØY;Ạ11ẇ

Tautan monadik yang mengambil daftar karakter dan mengembalikan:

  • 0 jika kuat
  • 1 jika tidak

Cobalah online! atau lihat test-suite .

Bagaimana?

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]

Catatan: Alasan untuk menggunakan hanya untuk menyimpan byte lebih dari menggunakan 1(karena kami kemudian ingin menggunakan 11langsung).


hmm, nilai yang konsisten ...
Erik the Outgolfer

apa maksudmu?
Jonathan Allan

hal yang mengganggu dalam kode Anda ... kalau tidak Anda bisa melakukan eۯY;1w11atau sesuatu
Erik the Outgolfer

Kenapa sebelas? Kata-kata string sepertinya tidak terikat pada angka sebelas dengan cara apa pun
hyiltiz

@ Ashiltiz ketika angka dua memiliki argumen kiri yang merupakan angka itu secara implisit dikonversi ke daftar angka desimal, sehingga sebelas menjadi [1,1].
Jonathan Allan

5

05AB1E , 8 byte

Kode

žPS¡¦õÊP

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan

ž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

Contoh

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

Mungkin saya melewatkan sesuatu, tetapi ini sepertinya selalu mengembalikan 1? Ia mengembalikan 1 untuk kedua kasus kebenaran yang saya coba dan testcals palsu.
sundar - Pasang kembali Monica

(Oh, saya baru tahu berapa umur jawaban ini (dan pertanyaan). Saya kira sesuatu dalam bahasa ini telah berubah sementara itu?)
sundar - Reinstate Monica

@sundar Ya tangkapan bagus! Sepertinya saya merusak fungsi split di beberapa titik. Saya akan memperbaikinya sesegera mungkin.
Adnan

5

R , 43 byte

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

Cobalah online!

Port jawaban JavaScript Arnauld; mengembalikan 1 untuk kata-kata yang lemah dan integer(0)untuk yang kuat; itu menambahkan (spasi) ke ujung string.

Ini sebenarnya vektor; dengan vektor string, ia mengembalikan indeks (1-based) dari kata-kata yang lemah.


Komentar yang sama di sini, tidak bisakah Anda menggunakan $ di regex alih-alih menambahkan spasi?
Charlie

@Charlie Saya tidak yakin bagaimana Anda bermaksud menggunakan $, ingin menjelaskan lebih lanjut?
Giuseppe

Sangat menyukai solusi ini. Saya pikir logikanya lebih jelas (dan byte sama) paste0(s,0), tetapi itu hanya kebawelan. Saya pikir @Charlie mereferensikan sesuatu seperti ini: grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL, 20 byte

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

Cobalah online!


3
Saya pikir Anda tidak perlu ⎕←.
Zacharý

@ Zacharý Saya dulu tidak mengatakannya, tapi saya kemudian diberitahu (oleh Dennis, saya percaya) bahwa sebuah program seharusnya tidak dianggap dijalankan dalam REPL.
Oberon

Bahasa apa yang dia katakan tentang itu? Apakah itu untuk Dyalog APL? Saya tahu bahwa kebijakan pasti berlaku untuk Python / JavaScript / dll.
Zacharý

3

Haskell , 61 54 byte

f=and.(zipWith(||)=<<tail).(map(`elem`"aeiouy")).(++"z")

Cobalah online!

Saya harus menambahkan huruf zpada akhir string untuk menangani huruf konsonan tertinggal.


2

Java (OpenJDK 8) , 93 81 byte

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

Cobalah online!


Saya boolean takut tidak jawabannya: 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
Atau Anda bahkan dapat melakukan ini:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

Jawaban yang bagus, tetapi dengan tantangan ini, pencocokan regex sederhana sebenarnya sedikit lebih pendek. Namun, +1 dari saya.
Kevin Cruijssen

1
@KevinCruijssen Regex saya buruk, tidak bisa berfungsi: D. Saya akan berpura-pura ingin menjadi orisinal
Roberto Graham

@RobertoGraham " Saya akan berpura-pura ingin menjadi yang asli " Ya, tentu saja. :) Dan saya dulu cukup buruk di regex juga, tapi setelah beberapa jawaban lain di sini di PPCG menggunakan regex saya semakin terbiasa. Dan saya sudah menemukan cara untuk mencocokkan konsonan yang digunakan [a-z&&[^aeiouy]] dalam jawaban saya sebelumnya . ;)
Kevin Cruijssen


2

Pyth , 18 byte

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

Verifikasi semua kasus uji.

"Meminjam" regex dari jawaban JS . Ini mengembalikan Falsekata-kata yang kuat, Truejika tidak


@KevinCruijssen Bahkan, Pyth menggunakan ISO-8859-1. Itu sebabnya saya tidak yakin.
Tn. Xcoder

1
Userscript @KevinCruijssen Downgoat mengatakan kepada saya itu adalah 13 bytes: 13 ISO-8859-1 bytes, 13 chars. Saya pikir itu akan baik
Tn. Xcoder

@KevinCruijssen Harus diperbaiki sekarang.
Tn. Xcoder

@KevinCruijssen Saya tidak melihat perbedaan. Apa kode yang Anda lihat di jawaban saya dan kode apa yang Anda lihat di tautan pengujian saya?
Tn. Xcoder


2

Brachylog , 18 11 10 byte

,Ḷs₂{¬∈Ẉ}ᵐ

Cobalah online!

Rapi dan sederhana (kecuali mungkin untuk 2 byte awal tambahan untuk menangani kasus konsonan akhir, seperti "parkit").

Apakah kepalsuan untuk kata-kata yang kuat dan benar untuk kata-kata yang tidak kuat.

,Ḷ               % 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 byte

-30 byte dengan menyadarinya bisa sesederhana jawaban JS Arnauld .

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

Cobalah online!



Apakah Anda tidak perlu menugaskan lambda untuk sesuatu? yaituf=lambda s...
OldBunny2800

@ OldBunny2800 tidak kecuali Anda menggunakan referensi dalam kode Anda (dapat diterima untuk membuat fungsi yang tidak disebutkan namanya yang dapat diakses seseorang untuk digunakan kembali dengan kode header atau footer - di sini dengan f=\di header).
Jonathan Allan

Saya pikir Anda mungkin dapat mengganti string pola Anda '[^aeiouy]([^aeiouy]|$)'(24 byte) dengan "[^aeiouy]("*2+")|$)"(21 byte) untuk menyimpan 3 byte, karena grup kosong (),, tidak mengubah perilaku pencarian ( TIO ).
Jonathan Frech

@ JonathanFrech Ini bisa menjadi lebih baik lagi
Tn. Xcoder

1

Perl 5, 31 byte (30 +1)

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

+1 byte untuk -pbendera baris perintah. Mencetak kata jika itu kata yang kuat, atau string kosong jika bukan.


"dua nilai yang berbeda dan konsisten"
L3viathan

@ L3viathan String kosong adalah falsy dan string non-kosong adalah benar. Ini valid
LyricLy

Peraturan L3viathan Perl tentang kebenaran sebenarnya sangat kondusif untuk tantangan seperti ini. Ini bukan pertama kalinya saya mengeksploitasi fakta itu.
Silvio Mayolo

Dengan kata-kata yang diakhiri baris baru, ini dapat disingkat menjadi $_=$/if/[^aeiouy]{2}/.
nwellnhof

1

Jelly , 11 byte

e€ØY;1a2\¬Ȧ

Cobalah online!

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

Ya saya tahu saya sering dikalahkan oleh Jonathan Allan tetapi saya tetap ingin berbagi pendekatan saya: P

-4 byte dengan mencuri sedikit jawaban Jonathan Allan (alih-alih menambahkan konsonan untuk memeriksa huruf tepi huruf terakhir, tambahkan saja 1)
-1 byte berkat mil


Anda dapat menyimpan byte menggunakan salah satu a2\atau Ȧ2Ƥbukannyaṡ2Ȧ€
mil

@Jonathan Allan facepalm yang sengaja saya pastikan untuk digunakan ØCuntuk memastikan Yydihitung sebagai konsonan karena entah bagaimana saya ingat ke belakang. Terima kasih!
HyperNeutrino

1

Awk, 39 byte

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

mencetak nuntuk kata-kata yang tidak kuat, tidak ada (atau, hanya baris baru) untuk kata kunci

mengikuti paket dan mencari dua non-vokal berturut-turut pada input huruf kecil

pengujian

$ 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 byte

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

Benar dan salah ditukar

Yg diperindahkan

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

Uji

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

Berdasarkan pada Jawaban @ Arnauld


1

Retina , 23 18 byte

$
$
1`[^aeiouy]{2}

Cobalah online! Output 0 untuk yang kuat, 1 jika tidak. Tambahkan 1 byte untuk mendukung case campuran. Sunting: Disimpan 5 byte berkat @ovs.


18 byte dengan menambahkan konsonan hingga akhir.
Ovs

1

Java 8, 53 42 byte

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

-11 byte dengan menggunakan regex yang sama dengan jawaban Kotlin di @jrtapsell .

Coba di sini. ( falsejika kuat; truejika tidak)

Penjelasan:

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)

Jadi pada dasarnya memeriksa apakah kita dapat menemukan dua konsonan yang berdekatan, atau jika String berakhir dengan konsonan.


Jawaban lama ( 53 byte ):

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

Coba di sini. ( truejika kuat; falsejika tidak)

Gunakan regex untuk melihat apakah input-String cocok dengan regex 'kuat'. Perhatikan bahwa String#matchesdi Jawa secara otomatis ditambahkan ^...$untuk memeriksa apakah String sepenuhnya cocok dengan regex yang diberikan.

Penjelasan":

 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)

Pencarian alih-alih yang cocok (seperti banyak penggunaan jawaban lain) sebenarnya lebih lama di Jawa:
70 byte :

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

Coba di sini. ( falsejika kuat; truejika tidak)



0

SOGL V0.12 , 19 18 byte

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

Coba Di Sini!

Penjelasan:

æ                   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

Lua, 41 byte

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

Membaca dari input standar

Lua (loadstring'ed), 37 byte

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

Membaca dari parameter fungsi


Input huruf kecil

Melihat jika ada string dengan panjang 2 atau lebih, hanya terdiri dari bukan vokal (konsonan) atau jika string berakhir dengan non-vokal

Mengembalikan nilai true / false


0

C ++, 195 194 byte

-1 byte, terima kasih kepada Zacharý

Huruf besar, mengembalikan true jika input adalah kata yang kuat, false jika tidak (C ++ memiliki int sederhana untuk membuat aturan pemeran implisit, 0 => false, true sebaliknya)

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

Kode untuk diuji:

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
Anda dapat menghapus ruang antara returndan !.
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;}

Mengembalikan 1 untuk kata kuat dan 0 untuk kata lemah . Diuji dengan kata-kata yang diberikan di pos utama.



0

PHP, 69 byte

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

Pengembalian 1 adalah kata tidak kuat.


Selamat datang di PPCG! Saya percaya Anda dapat menghapus spasi untuk memotong beberapa byte, khususnya /", str-> /",strdan [1]))) return-> [1])))returntapi saya tidak tahu PHP terlalu baik sehingga saya tidak yakin.
Stephen

Ya, ide yang bagus! Dimungkinkan juga untuk mengurangi byte dengan mengasumsikan bahwa input selalu dalam huruf besar.
Matias Villanueva

Oh, dan jika regex adalah mesin regex standar, tidak bisakah Anda melakukannya [B-Z]?
Stephen

@Stephen [B-Z]termasuk vokal. [^AEIOUY]bekerja, meskipun.
LyricLy

Saya juga tidak tahu PHP, tetapi Anda mungkin bisa menyimpan lebih banyak byte dengan mengembalikan hasil dari pertandingan regex secara langsung, alih-alih membungkusnya dalam sebuah ifpernyataan.
LyricLy

0

CJam , 57 byte

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

Cobalah online!


Membaca input, dikonversi ke 1s untuk konsonan, 0s untuk vokal. Untuk setiap konsonan, DAN variabel X yang telah ditentukan sebelumnya (ditetapkan ke 1) dengan nilai karakter berikutnya. Output X

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.